可视化:嵌套饼图

作者: 生信云笔记 | 来源:发表于2022-09-04 13:53 被阅读0次

前言

  饼图是常见的展示数据的图形之一。本质上来说饼图应该属于堆叠条形图的一种特殊展现形式,也就是将一个坐标轴从直角坐标系转为极坐标系。经过这么一转换,视觉上的效果可以说是焕然一新。今天我们就来说说如何用ggplot来绘制饼图。其实,用ggplot来绘制饼图,无外乎使用到三个图形函数,分别是geom_bargeom_colgeom_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)即可。哦了,今天的分享到此结束~

相关文章

网友评论

    本文标题:可视化:嵌套饼图

    本文链接:https://www.haomeiwen.com/subject/moapnrtx.html