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 Improved1 57 Treated Male 27 Some2 46 Treated Male 29 None3 77 Treated Male 30 None4 17 Treated Male 32 Marked5 36 Treated Male 46 Marked6 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))
参考文档: