“ 饼图(扇形图)时常用于对统计数据的可视化,在 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, "%") 得到如下数据:
数据中的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)
#分别给色块添加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)
之后可以利用修图软件对图片进行调整,将饼中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)
之后利用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)
之后可以利用修图软件对图片进行调整好了,小编就先给大家介绍到这里。希望对您的科研能有所帮助!祝您工作生活顺心快乐!
更多生信课程:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!