R脚本绘制多层环形饼图

“ 饼图(扇形图)时常用于对统计数据的可视化,在 R中,很多R包用于绘制饼图,例如ggplot2、ggsunburst就能绘制出好看的饼图,操作如下” 1. 加载所需要的包 library(RColorBrewer)  #调色模板...

 饼图(扇形图)时常用于对统计数据的可视化,在 R中,很多R包用于绘制饼图,例如ggplot2、ggsunburst就能绘制出好看的饼图,操作如下

1. 加载所需要的包

library(RColorBrewer)  #调色模板
library(ggplot2)  #绘图
library(dplyr)  #数据处理、数据操作

2. 加载数据

#数据有3列,第一列是ID(Category),第二列是数量(Count),第三列是百分比(Percentage)
data <- data.frame(
  Category = c("NAC", "C2H2", "CAMTA", "mTERF", "ARID", "STAT", "CSD", "BES1", "GRAS", "NF-Y", "SNF2", "PHD", "MADS", "SRS", "HSF", "MBF1", "B3", "GNAT", "C3H", "FAR1", "GARP", "EIL", "DBB", "SET", "bHLH", "C2C2", "SOH1", "Tify", "TRAF", "MYB", "TCP", "HB", "DDT", "WRKY", "Jumonji", "SBP", "bZIP", "GeBP", "LIM", "TUB", "LOB", "OFP"),
  Count = c(21, 11, 1, 23, 5, 3, 2, 1, 19, 1, 7, 6, 41, 1, 12, 1, 13, 17, 14, 2, 3, 1, 8, 5, 13, 9, 2, 6, 5, 25, 2, 16, 1, 8, 2, 1, 2, 4, 4, 1, 2, 1),
  Percentage = c(6.52, 3.42, 0.31, 7.14, 1.55, 0.93, 0.62, 0.31, 5.90, 0.31, 2.17, 1.86, 12.73, 0.31, 3.73, 0.31, 4.04, 5.28, 4.35, 0.62, 0.93, 0.31, 2.48, 1.55, 4.04, 2.80, 0.62, 1.86, 1.55, 7.76, 0.62, 4.97, 0.31, 2.48, 0.62, 0.31, 0.62, 1.24, 1.24, 0.31, 0.62, 0.31)
)
#给Percentage列数值加上%
data$Percentage <- paste0(data$Percentage, "%")
得到如下数据:

attachments-2025-04-IHAubyaK680dfc2478a29.png数据中的Percentage列中百分比数值只是为了在饼图中作为label显示。具体扇形大小是根据Count列计算得到。

3. 数据处理 

#按照Category 的字母顺序排序(不区分大小写)
data <- data %>% arrange(tolower(Category))
#提取第1列和第3列
lbls<-(paste(data[,1],data[,3]))
#通过第二列数值计算每个ID的百分比
values <- data.frame(Percentage = round(data[,2]/sum(data[,2]) * 100,2), Type = factor(data[,1]),percent=lbls )
#创建因子
values$percent <- factor(values$percent, levels = values$percent)
#获得lab.yops列,该列为图中label的显示位置
values <- values %>%
  arrange(desc(Type)) %>% # 重排序
  mutate(lab.ypos = cumsum(Percentage) - 0.5*Percentage) 

4. 绘图

#利用ggplot2绘图
pie = ggplot(values, aes(x = "" ,y = Percentage, fill = percent)) + geom_bar(width = 3, stat = "identity")
print(pie)

attachments-2025-04-UEwovQmE680dfcc9ef7d7.png

#分别给色块添加label,其中百分比<3%的不显示balel,colo颜色,size字体大小
pie = pie + geom_text(aes(y=lab.ypos,label=ifelse(Percentage>3,as.character(percent),"")),color="black",size=5)
#将条形图转化为饼图,start=0默认从12点方向开始,theme_void()将灰色坐标轴、网格线等默认背景去除,
pie = pie + coord_polar("y",start = 0)+theme_void()
#添加标题
pie = pie + labs(fill="",title="pieplot")+theme(plot.title = element_text(hjust=0.5,size = 20))
#根据RColorBrewer包中颜色模板进行颜色设置,根据自己条目的多少选择颜色数量
colours= c(brewer.pal(9,"Set1"),brewer.pal(8,"Set2"),brewer.pal(12,"Set3"),brewer.pal(12,"Paired"),brewer.pal(8,"Accent"),brewer.pal(8,"Pastel2"))
pie = pie + scale_fill_manual(values =colours)
print(pie)

attachments-2025-04-WV6j3PTs680dfd22b3802.png

之后可以利用修图软件对图片进行调整,将饼中label角度进行旋转,会更美观一些。在刚才数据基础上进行环形饼图绘制

#width = 2.3用于控制条形的宽度,这里影响扇区的宽度。color="white",size=0.5,给每个条形设置白色边框,并调整宽度
pie = ggplot(values, aes(x = "",y = Percentage, fill = percent)) + geom_bar(width = 2.3, stat ="identity",color="white",size=1.5)
#将条形图转化为饼图
pie = pie + coord_polar("y",start = 0)+theme_void()
#加了一个位于饼图中心的文本标签allcoun是数值总和
allcount=sum(data$Count)
pie = pie + geom_text(aes(y=lab.ypos,label=""),color="black",size=5)+
    geom_text(aes(x = -0.5, y = sum(Percentage)/2, label = allcount),size = 6, fontface = "bold", color = "black")
#添加标题,并将图例位置进行调整
pie = pie +labs(fill="",title="pieplot")+
    theme(plot.title = element_text(hjust = 0.5,size = 20),legend.text = element_text(size=18),
          legend.position = "bottom",legend.box = "vertical")
#修改颜色
colours = c(brewer.pal(9,"Set1"),brewer.pal(8,"Set2"),brewer.pal(12,"Set3"),brewer.pal(12,"Paired"),brewer.pal(8,"Accent"),brewer.pal(8,"Pastel2"))
pie = pie + scale_fill_manual(values =colours)
print(pie)

attachments-2025-04-GvvokATu680dfe3a22738.png


之后利用ggsunburst R包绘制多层环形饼图。在前一个数据基础上对Category列进行分类Group。

1. 加载所需要的包

library(ggplot2)
library(rpython2)
library(ggsunburst) #绘制多层环形饼图(旭日图)
library(RColorBrewer)

2. 加载数据

#数据有3列,第一列是分组(parent),第二列是ID(node),第三列是百分比(size)
data <- data.frame(
  parent = c("Group3", "Group3", "Group2", "Group2", "Group3", "Group5", "Group4", "Group1", "Group2", "Group3", "Group5", "Group3", "Group3", "Group1", "Group4", "Group1", "Group1", "Group5", "Group3", "Group2", "Group2", "Group1", "Group3", "Group4", "Group1", "Group3", "Group5", "Group4", "Group2", "Group5", "Group1", "Group1", "Group2", "Group3", "Group4", "Group5", "Group5", "Group3", "Group1", "Group2", "Group5", "Group5"),
  node = c("NAC", "C2H2", "CAMTA", "mTERF", "ARID", "STAT", "CSD", "BES1", "GRAS", "NF-Y", "SNF2", "PHD", "MADS", "SRS", "HSF", "MBF1", "B3", "GNAT", "C3H", "FAR1", "GARP", "EIL", "DBB", "SET", "bHLH", "C2C2", "SOH1", "Tify", "TRAF", "MYB", "TCP", "HB", "DDT", "WRKY", "Jumonji", "SBP", "bZIP", "GeBP", "LIM", "TUB", "LOB", "OFP"),
  size = c(6.52, 3.42, 0.31, 7.14, 1.55, 0.93, 0.62, 0.31, 5.90, 0.31, 2.17, 1.86, 12.73, 0.31, 3.73, 0.31, 4.04, 5.28, 4.35, 0.62, 0.93, 0.31, 2.48, 1.55, 4.04, 2.80, 0.62, 1.86, 1.55, 7.76, 0.62, 4.97, 0.31, 2.48, 0.62, 0.31, 0.62, 1.24, 1.24, 0.31, 0.62, 0.31)
)

3. 数据处理

#增加一列browser
data$browser<-data$parent 
#将数据以,分割的csv文件格式保存到本地
write.table(data, file = 'data.csv', row.names = F, sep = ",") 

4. 绘

#利用sunburst_data函数读取csv文件内容
sb <- sunburst_data('data.csv', type = 'node_parent', sep = ",", node_attributes = c("browser","size"))
# 将名称添加为浏览器属性,用于为内部节点着色
sb$rects[!sb$rects$leaf,]$browser <- sb$rects[!sb$rects$leaf,]$name
#设置颜色
color_palette <- brewer.pal(5, "Set2")
names(color_palette) <- unique(sb$rects$browser[!is.na(sb$rects$browser)])
sb$rects$color <- color_palette[sb$rects$browser]
#利用sunburst函数绘图
p <- sunburst(sb, rects.fill=sb$rects$color, node_labels = T, node_labels.min = 15)
p + geom_text(data = sb$leaf_labels,aes(x=x, y=0.1, label=paste(size,"%"), angle=angle, hjust=hjust), size = 2)

attachments-2025-04-XyqB3XO3680e00374a9d8.png

之后可以利用修图软件对图片进行调整好了,小编就先给大家介绍到这里。希望对您的科研能有所帮助!祝您工作生活顺心快乐!


更多生信课程:


  • 发表于 13小时前
  • 阅读 ( 22 )
  • 分类:R

0 条评论

请先 登录 后评论
rzx
rzx

82 篇文章

作家榜 »

  1. omicsgene 717 文章
  2. 安生水 357 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 86 文章
  6. rzx 82 文章
  7. 红橙子 79 文章
  8. CORNERSTONE 72 文章