前言
饼图是常见的展示数据的图形之一。本质上来说饼图应该属于堆叠条形图的一种特殊展现形式,也就是将一个坐标轴从直角坐标系转为极坐标系。经过这么一转换,视觉上的效果可以说是焕然一新。今天我们就来说说如何用ggplot来绘制饼图。其实,用ggplot来绘制饼图,无外乎使用到三个图形函数,分别是geom_bar
、geom_col
、geom_rect
。前面两个函数使用起来相对方便一些,最后一个函数绘图需要提供两个XY轴坐标的起始位置,相对麻烦不推荐使用。所以,今天我们使用geom_bar
来展示绘图过程。
绘图
下面废话不多说,直接到shou me the code
环节:
library(ggplot2)
# 准备数据
data <- data.frame(group=LETTERS[1:5], value=c(13,11,9,21,6))
data$fraction <- data$value / sum(data$value)
data$label <- paste0(data$group, '(', round(data$fraction,4)*100,'%', ')')
data$labpos <- cumsum(data$fraction) - 0.5*data$fraction
data
# group value fraction label labpos
#1 A 13 0.2166667 A(21.67%) 0.1083333
#2 B 11 0.1833333 B(18.33%) 0.3083333
#3 C 9 0.1500000 C(15%) 0.4750000
#4 D 21 0.3500000 D(35%) 0.7250000
#5 E 6 0.1000000 E(10%) 0.9500000
# 绘图
p <- ggplot(data, aes(x=1, y=rev(fraction), fill=group)) +
geom_bar(stat='identity', color="white", show.legend=F) +
geom_text(aes(y = labpos, label = label), color = "white", size=6) +
coord_polar("y", start=0) +
theme_void() +
scale_fill_brewer(palette="Set1")
p
结果如下:
上面展示的就是最普通的饼图,那么我们如果想要中空的饼图呢?很简单,只需在上面绘图代码的基础上再加一句代码!没错!你没看错,就只需再加一句代码就可实现,ggplot就是这么强大:
p <- p + xlim(-0.5, 1.5)
p
得到下图:
如果想要嵌套饼图怎么办呢?话不多说,直接安排:
# 准备数据
data1 <- data.frame(group=LETTERS[1:5], value1=c(13,11,9,21,6))
data1$fraction1 <- data1$value1 / sum(data1$value1)
data1$label1 <- paste0(data1$group, '(', round(data1$fraction1,4)*100,'%', ')')
data1$labpos1 <- cumsum(data1$fraction1) - 0.5*data1$fraction1
data2 <- data.frame(group=LETTERS[1:3],value2=c(13,11,9))
data2$fraction2 <- data2$value2/ sum(data2$value2)
data2$label2 <- paste0(data2$group, '(', round(data2$fraction2,4)*100,'%', ')')
data2$labpos2 <- cumsum(data2$fraction2) - 0.5*data2$fraction2
data <- merge(data1,data2,by='group',all=T)
data
# group value1 fraction1 label1 labpos1 value2 fraction2 label2 labpos2
#1 A 13 0.2166667 A(21.67%) 0.1083333 13 0.3939394 A(39.39%) 0.1969697
#2 B 11 0.1833333 B(18.33%) 0.3083333 11 0.3333333 B(33.33%) 0.5606061
#3 C 9 0.1500000 C(15%) 0.4750000 9 0.2727273 C(27.27%) 0.8636364
#4 D 21 0.3500000 D(35%) 0.7250000 NA NA <NA> NA
#5 E 6 0.1000000 E(10%) 0.9500000 NA NA <NA> NA
# 绘图
p <- ggplot(data) +
geom_bar(aes(x=1.5, y=rev(fraction1), fill=group), width=1,stat='identity', color="white", show.legend=F) +
geom_text(aes(x=1.5,y = labpos1, label = label1), color = "white", size=4.5) +
geom_bar(aes(x=0.5,y=rev(fraction2), fill=group), width=1,stat='identity', color="white", show.legend=F) +
geom_text(aes(x=0.5, y = labpos2, label = label2), color = "white", size=4.5) +
coord_polar("y", start=0) +
theme_void() +
scale_fill_brewer(palette="Set1")
p
结果如下:
从上面的代码可以看出,用ggplot
画嵌套饼图只需在原先的空心圆里面再画上一个饼图即可得到嵌套饼图。
结束语
这里使用的是geom_bar
函数来绘图,也可以用geom_col
函数,只需将代码里面的将geom_bar(stat='identity', color="white", show.legend=F)
替换为geom_col(color="white", show.legend=F)
即可。哦了,今天的分享到此结束~
网友评论