饼图(pie chart)被广泛地应用于各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个切片,整个圆饼代表数据的总量,每个切片(圆弧)表示该分类占总体的比例,所有切片(圆弧)的加和等于100%。
下面会介绍两种在R中实现饼图的方法。
graphics包绘制饼图
代码语言:javascript复制library(RColorBrewer)
library(dplyr)
library(graphics)
library(ggplot2)
init.angle可设定饼图的初始角度,labels可添加标签。颜色用了brewer.pal 函数,第一个参数为个数,第二个参数为名字,这里用的是BrBG,具体可help 一下。首先我们构造一个模拟数据,如下所示,并用dplyr包中的arrange()进行排序(默认从小到大),faction表示数值所占比例,ymax进行累积占比,总值为1。
代码语言:javascript复制df <- data.frame(value = c(24.20,30.90,12.50,12.30,8.10,12.10),
group = c('LVS','SJM','MCE','Galaxy','MGM','Wynn'))
df <-arrange(df,value)
这里做了两种类型的标签,下面两图就是根据不同标签绘制的。labs包含了百分比和名字,中间用n来分行;lab则只包含百分位数。以下为两种不同标签的结果,为了区分,使用rewer.pal()函数将颜色进行变换。
代码语言:javascript复制labs <- paste0(df$group," n(", round(df$value/sum(df$value)*100,2), "%)") #标签
lab <- paste0(round(df$value/sum(df$value)*100,2), "%") #标签
pie(df$value,labels=labs, init.angle=90,col = brewer.pal(nrow(df), "BrBG"),
border="black")
pie(df$value,labels=lab, init.angle=90,col = brewer.pal(nrow(df), "Blues"),
border="black")
ggplot2 包绘制饼图
使用R中ggplot2包的geom_bar()函数绘制堆积柱形图,然后将直角坐标系转换成极坐标系,就可以显示为饼图,但还是需要使用geom_text()函数添加数据标签。注意的是:ymax,ymin也需要自己计算得到。
代码语言:javascript复制df$fraction = df$value / sum(df$value)
df$ymax = cumsum(df$fraction)
df$ymin = c(0, head(df$ymax, n = -1))
ggplot(data = df, aes(fill = group, ymax = ymax, ymin = ymin, xmax = 4, xmin = 3))
geom_rect(show.legend = F,alpha=0.8)
scale_fill_brewer(palette = 'Set3')
coord_polar(theta = "y")
labs(x = "", y = "", title = "",fill='地区')
theme_light()
theme(panel.grid=element_blank()) ## 去掉白色外框
theme(axis.text=element_blank()) ## 把图旁边的标签去掉
theme(axis.ticks=element_blank()) ## 去掉左上角的坐标刻度线
theme(panel.border=element_blank()) ## 去掉最外层的正方形边框
geom_text(aes(x = 3.5, y = ((ymin ymax)/2),label = labs) ,size=3.6)
但是可以看到:由于缺乏饼图与数据标签之间的引导线,总感觉美观度不够,所以推荐使用graphics包的pie()函数绘制饼图。
代码以及资料存在我的github上,可见文末原文链接。