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

Polar coordinates

ggplot, facet, piechart: placing text in the middle of pie chart slices

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
posted @ 2018-08-06 09:47  悦光阴  阅读(20128)  评论(0编辑  收藏  举报