R绘图 第八篇:绘制饼图(ggplot2)
geom_bar()函数不仅可以绘制条形图,还能绘制饼图,跟绘制条形图的区别是坐标系不同,绘制饼图使用的坐标系polar,并且设置theta="y":
coord_polar(theta = "y", start = 0, direction = 1, clip = "on")
条形图的高度通常表示两种情况之一:每组中的数据的个数,或数据框中列的值,高度表示的含义是由geom_bar()函数的参数stat决定的,stat在geom_bar()函数中有两个有效值:count和identity。默认情况下,stat="count",这意味着每个条的高度等于每组中的数据的个数,并且,它与映射到y的图形属性不相容,所以,当设置stat="count"时,不能设置映射函数aes()中的y参数。如果设置stat="identity",这意味着条形的高度表示数据数据的值,而数据的值是由aes()函数的y参数决定的,就是说,把值映射到y,所以,当设置stat="identity"时,必须设置映射函数中的y参数,把它映射到数值变量。
geom_bar()函数的定义是:
geom_bar(mapping = NULL, data = NULL, stat = "count",fill=NULL, position="stack")
参数注释:
- stat:设置统计方法,有效值是count(默认值) 和 identity,其中,count表示条形的高度是变量的数量,identity表示条形的高度是变量的值;
- position:位置调整,有效值是stack、dodge和fill,默认值是stack(堆叠),是指两个条形图堆叠摆放,dodge是指两个条形图并行摆放,fill是指按照比例来堆叠条形图,每个条形图的高度都相等,但是高度表示的数量是不尽相同的。
- fill:条形图的填充色
关于stat参数,有三个有效值,分别是count、identity和bin:
- count是对离散的数据进行计数,计数的结果用一个特殊的变量..count.. 来表示,
- bin是对连续变量进行统计转换,转换的结果使用变量..density..来表示
- 而identity是直接引用数据集中变量的值
position参数也可以由两个函数来控制,参数vjust和widht是相对值:
position_stack(vjust = 1, reverse = FALSE) position_dodge(width = NULL) position_fill(vjust = 1, reverse = FALSE)
本文使用vcd包中的Arthritis数据集来演示如何创建条形图。
head(Arthritis) ID Treatment Sex Age Improved 1 57 Treated Male 27 Some 2 46 Treated Male 29 None 3 77 Treated Male 30 None 4 17 Treated Male 32 Marked 5 36 Treated Male 46 Marked 6 23 Treated Male 58 Marked
其中变量Improved和Sex是因子类型,ID和Age是数值类型。
一,绘制一个条形图
绘制一个饼图之前,需要绘制一个条形图,该条形图有多个分组,这就需要设置映射的x参数映射为一个常量因子,fill映射为分类因子:
ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack')
在条形图之后,添加一个图层,把条形图转换为饼图:
ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack')+ coord_polar("y", start=0)
二,调整饼图的图形属性
调整饼图的填充色,文本,使饼图看起来更加美观。
1,调整饼图的填充色
使用scale_fill_manual()函数对饼图填充不同的颜色
ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack')+ coord_polar("y", start=0)+ scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))
2,调整饼图的标度
blank_theme <- theme_minimal()+ theme( axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), panel.border = element_blank(), panel.grid=element_blank(), axis.ticks = element_blank(), plot.title=element_text(size=14, face="bold") ) ggplot(data=Arthritis, mapping=aes(x="Improved",fill=Improved))+ geom_bar(stat="count",width=0.5,position='stack',size=5)+ coord_polar("y", start=0)+ scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))+ blank_theme + geom_text(stat="count",aes(label = scales::percent(..count../100)), size=4, position=position_stack(vjust = 0.5))
也可以使用stat="identity" 方式来绘制饼图,绘制的图形是相同的:
mytable <- with(Arthritis,table(Improved)) df <- as.data.frame(mytable) blank_theme <- theme_minimal()+ theme( axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), panel.border = element_blank(), panel.grid=element_blank(), axis.ticks = element_blank(), plot.title=element_text(size=14, face="bold") ) ggplot(data=df, mapping=aes(x="Improved",y=Freq,fill=Improved))+ geom_bar(stat="identity",width=0.5,position='stack',size=5)+ coord_polar("y", start=0)+ scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9"))+ blank_theme + geom_text(stat="identity",aes(y=Freq, label = scales::percent(Freq/100)), size=4, position=position_stack(vjust = 0.5))
参考文档:
ggplot2 pie chart : Quick start guide - R software and data visualization
ggplot, facet, piechart: placing text in the middle of pie chart slices