跟着iMeta学做图|ggplot2绘制多个饼图展示菌群物种组成

news2024/9/20 17:32:33

原始教程链接:https://github.com/iMetaScience/iMetaPlot/tree/main/221017multi-pieplot

写在前面

饼图 (Pie Plot) 在微生物组研究中可以用来展示菌群物种组成,可以起到与堆叠柱状图相同的展示效果。本期我们挑选2022年4月5日刊登在iMeta上的The impact of aquaculture system on the microbiome and gut metabolome of juvenile Chinese softshell turtle (Pelodiscus sinensis)- iMeta | 南昌大学丁霞等-水产养殖模式对水产动物皮肤、口腔和肠道微生物群落组装及宿主适应性的影响,选择文章的Figure 1D进行复现,讲解和探讨简单饼图以及同一图片中呈现多个饼图的方法,先上原图:

图片

图片

代码编写及注释:农心生信工作室

R包检测和安装

01

安装核心R包ggplot2以及一些功能辅助性R包,并载入所有R包

if (!require("ggplot2"))  install.packages('ggplot2') if (!require("dplyr"))  install.packages('dplyr') if (!require("ComplexHeatmap"))  BiocManager::install('ComplexHeatmap')#> #>   有二进制版本的,但源代码版本是后来的:#>      binary source needs_compilation#> clue 0.3-61 0.3-62              TRUE#> #> #> 下载的二进制程序包在#>  /var/folders/15/ywvz065n3jl4qm8jygpq5bz80000gn/T//RtmpLnQspz/downloaded_packages里# 加载包library(ggplot2)library(dplyr)library(ComplexHeatmap)library(grid)

读取或生成数据

02

设该图数据来自文章的补充文件supplementary table3,大家可以根据链接自行下载。在这里,我们下载它的补充文件后,导出为test.CSV进行读取。

#读取数据df<-read.csv("test.CSV",header = T)#创建一个向量,包含了图中将要展示的丰度最高的7个科top_phylum=c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]")#将其他低丰度的科统一命名为Otherdf[!(df$Taxonomyt %in% top_phylum),]$Taxonomyt = "Other"

饼图预览

03

选择样本abdomen,使用ggplot2包绘制一个最简单的饼图,方法与绘制柱状图一样,只是将直角坐标系转化为了极坐标系

#选择样本abdomenper_df<-df[df$Sample=="abdomen",]#使用aggregate函数,根据Taxonomyt的分组,将科名称相同的丰度求和,即最终得到Other的丰度的和per_df<-aggregate(per_df$Abundance,by=list(Taxonomyt=per_df$Taxonomyt),sum) %>% rename(Abundance=x)p<-ggplot(per_df,aes("",Abundance,fill=Taxonomyt))+geom_bar(stat = "identity")+  coord_polar(theta = "y")

图片

04

根据原图,我们固定图例中科名显示的顺序,并美化图片,设置颜色,去除背景,坐标轴,图例:

mycol<-c("#F7F114","#168936","#F2C8AD","#0BE9F4","#0D5ED3","#F2AD3D","#757272","#EA1313")#设置颜色per_df<-df[df$Sample=="abdomen",]per_df<-aggregate(per_df$Abundance,by=list(Taxonomyt=per_df$Taxonomyt),sum) %>% rename(Abundance=x)per_df$Taxonomyt<-factor(per_df$Taxonomyt,levels =c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]","Other"))#固定图例顺序p<-ggplot(per_df,aes("",Abundance,fill=Taxonomyt))+geom_bar(stat = "identity")+  coord_polar(theta = "y")+  scale_fill_manual(values = mycol)+  guides(fill="none")+  theme(axis.text.y = element_blank(),panel.background = element_blank(),        line = element_blank(),axis.ticks.y = element_blank(),axis.text.x = element_blank())

图片

05

接下来是全文的重点,如何在一张画布上绘制多个饼图,并将它们有序排列。这里,我们要用assign函数,使每个样本对应一副饼图:

#首先生成一个向量,包含全部八个样本名sample_name<-unique(df$Sample)#unique()函数去除重复数据#设置颜色mycol<-c("#F7F114","#168936","#F2C8AD","#0BE9F4","#0D5ED3","#F2AD3D","#757272","#EA1313")#编写函数getPieplot(),该函数包含两个参数,第一个参数为数据框df,第二个参数为样本名称,最终返回饼图getPieplot<-function(dfname,Samplename){  per_df<-dfname[dfname$Sample==Samplename,]  per_df<-aggregate(per_df$Abundance,by=list(Taxonomyt=per_df$Taxonomyt),sum) %>% rename(Abundance=x)  per_df$Taxonomyt<-factor(per_df$Taxonomyt,levels =c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]","Other"))  p<-ggplot(per_df,aes("",Abundance,fill=Taxonomyt))+    geom_bar(stat = "identity")+    coord_polar(theta = "y")+    scale_fill_manual(values = mycol)+    labs(x=Samplename,y="")+    guides(fill="none")+    theme(axis.text.y = element_blank(),panel.background = element_blank(),          line = element_blank(),axis.ticks.y = element_blank(),axis.text.x = element_blank())    return(p)}#for循环遍历八个样本名,利用assign函数,以样本名作变量名,将饼图分别赋给对应的变量for (i in sample_name){  assign(i,getPieplot(df,i))}

06

使用底层绘图包grid,按顺序将饼图一一排列:

#创建新一个新的画布grid.newpage()#创建一个4行2列的布局pushViewport(viewport(layout = grid.layout(nrow = 4, ncol = 2),width = 0.3))#编写一个函数,方便定义每一个饼图在画布布局中的具体位置vp_value <- function(row, col){  viewport(layout.pos.row = row, layout.pos.col = col)} #print将每个图形输出到布局的不同区域中print(abdomen,vp = vp_value(row = 1, col = 1))print(duodenum,vp = vp_value(row = 1, col = 2))print(back,vp = vp_value(row = 2, col = 1))print(ileum,vp = vp_value(row = 2, col = 2))print(limb,vp = vp_value(row = 3, col = 1))print(colon,vp = vp_value(row = 3, col = 2))print(oral,vp = vp_value(row = 4, col = 1))print(rectum,vp = vp_value(row = 4, col = 2))

07

最后,我们利用顾祖光博士开发的ComplexHeatmap包(关于ComplexHeatmap包的使用,可以参考往期推文跟着iMeta学做图|ComplexHeatmap绘制多样的热图),绘制一个单独的图例,并置于画布的最下方:

pdf("Figure1D.pdf",width = 8, height = 6)grid.newpage()#重新创建一个5行2列的布局,最后一行用于放置图例pushViewport(viewport(layout = grid.layout(nrow = 5, ncol = 2),width = 0.3))vp_value <- function(row, col){  viewport(layout.pos.row = row, layout.pos.col = col)} print(abdomen,vp = vp_value(row = 1, col = 1))print(duodenum,vp = vp_value(row = 1, col = 2))print(back,vp = vp_value(row = 2, col = 1))print(ileum,vp = vp_value(row = 2, col = 2))print(limb,vp = vp_value(row = 3, col = 1))print(colon,vp = vp_value(row = 3, col = 2))print(oral,vp = vp_value(row = 4, col = 1))print(rectum,vp = vp_value(row = 4, col = 2))#创建图例lgd_points = Legend(at = c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]","Other"), type = "points", pch = 15,                    legend_gp = gpar(col = mycol),                     title = "",background = mycol)#将图例与饼图合并draw(lgd_points, x = unit(45, "mm"), y = unit(5, "mm"), just = c( "bottom"))dev.off()#> quartz_off_screen #>                 2

图片

完整代码

if (!require("ggplot2"))  install.packages('ggplot2') if (!require("dplyr"))  install.packages('dplyr') if (!require("ComplexHeatmap"))  BiocManager::install('ComplexHeatmap')#> #>   有二进制版本的,但源代码版本是后来的:#>      binary source needs_compilation#> clue 0.3-61 0.3-62              TRUE#> #> #> 下载的二进制程序包在#>  /var/folders/15/ywvz065n3jl4qm8jygpq5bz80000gn/T//RtmpLnQspz/downloaded_packages里# 加载包library(ggplot2)library(dplyr)library(ComplexHeatmap)library(grid)
#读取数据df<-read.csv("test.CSV",header = T)#创建一个向量,包含了图中将要展示的丰度最高的7个科top_phylum=c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]")#将其他低丰度的科统一命名为Otherdf[!(df$Taxonomyt %in% top_phylum),]$Taxonomyt = "Other"#选择样本abdomenper_df<-df[df$Sample=="abdomen",]#使用aggregate函数,根据Taxonomyt的分组,将科名称相同的丰度求和,即最终得到Other的丰度的和per_df<-aggregate(per_df$Abundance,by=list(Taxonomyt=per_df$Taxonomyt),sum) %>% rename(Abundance=x)p<-ggplot(per_df,aes("",Abundance,fill=Taxonomyt))+geom_bar(stat = "identity")+  coord_polar(theta = "y")mycol<-c("#F7F114","#168936","#F2C8AD","#0BE9F4","#0D5ED3","#F2AD3D","#757272","#EA1313")#设置颜色per_df<-df[df$Sample=="abdomen",]per_df<-aggregate(per_df$Abundance,by=list(Taxonomyt=per_df$Taxonomyt),sum) %>% rename(Abundance=x)per_df$Taxonomyt<-factor(per_df$Taxonomyt,levels =c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]","Other"))#固定图例顺序p<-ggplot(per_df,aes("",Abundance,fill=Taxonomyt))+geom_bar(stat = "identity")+  coord_polar(theta = "y")+  scale_fill_manual(values = mycol)+  guides(fill="none")+  theme(axis.text.y = element_blank(),panel.background = element_blank(),        line = element_blank(),axis.ticks.y = element_blank(),axis.text.x = element_blank())p#首先生成一个向量,包含全部八个样本名sample_name<-unique(df$Sample)#unique()函数去除重复数据#设置颜色mycol<-c("#F7F114","#168936","#F2C8AD","#0BE9F4","#0D5ED3","#F2AD3D","#757272","#EA1313")#编写函数getPieplot(),该函数包含两个参数,第一个参数为数据框df,第二个参数为样本名称,最终返回饼图getPieplot<-function(dfname,Samplename){  per_df<-dfname[dfname$Sample==Samplename,]  per_df<-aggregate(per_df$Abundance,by=list(Taxonomyt=per_df$Taxonomyt),sum) %>% rename(Abundance=x)  per_df$Taxonomyt<-factor(per_df$Taxonomyt,levels =c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]","Other"))  p<-ggplot(per_df,aes("",Abundance,fill=Taxonomyt))+    geom_bar(stat = "identity")+    coord_polar(theta = "y")+    scale_fill_manual(values = mycol)+    labs(x=Samplename,y="")+    guides(fill="none")+    theme(axis.text.y = element_blank(),panel.background = element_blank(),          line = element_blank(),axis.ticks.y = element_blank(),axis.text.x = element_blank())    return(p)}#for循环遍历八个样本名,利用assign函数,以样本名作变量名,将饼图分别赋给对应的变量for (i in sample_name){  assign(i,getPieplot(df,i))}
#创建新一个新的画布grid.newpage()#创建一个4行2列的布局pushViewport(viewport(layout = grid.layout(nrow = 4, ncol = 2),width = 0.3))#编写一个函数,方便定义每一个饼图在画布布局中的具体位置vp_value <- function(row, col){  viewport(layout.pos.row = row, layout.pos.col = col)} #print将每个图形输出到布局的不同区域中print(abdomen,vp = vp_value(row = 1, col = 1))print(duodenum,vp = vp_value(row = 1, col = 2))print(back,vp = vp_value(row = 2, col = 1))print(ileum,vp = vp_value(row = 2, col = 2))print(limb,vp = vp_value(row = 3, col = 1))print(colon,vp = vp_value(row = 3, col = 2))print(oral,vp = vp_value(row = 4, col = 1))print(rectum,vp = vp_value(row = 4, col = 2))pdf("Figure1D.pdf",width = 8, height = 6)grid.newpage()#重新创建一个5行2列的布局,最后一行用于放置图例pushViewport(viewport(layout = grid.layout(nrow = 5, ncol = 2),width = 0.3))vp_value <- function(row, col){  viewport(layout.pos.row = row, layout.pos.col = col)} print(abdomen,vp = vp_value(row = 1, col = 1))print(duodenum,vp = vp_value(row = 1, col = 2))print(back,vp = vp_value(row = 2, col = 1))print(ileum,vp = vp_value(row = 2, col = 2))print(limb,vp = vp_value(row = 3, col = 1))print(colon,vp = vp_value(row = 3, col = 2))print(oral,vp = vp_value(row = 4, col = 1))print(rectum,vp = vp_value(row = 4, col = 2))#创建图例lgd_points = Legend(at = c("Actinobacteria","Bacteroidetes","Firmicutes","Fusobacteria","Proteobacteria","Verrucomicrobia","[Thermi]","Other"), type = "points", pch = 15,                    legend_gp = gpar(col = mycol),                     title = "",background = mycol)#将图例与饼图合并draw(lgd_points, x = unit(45, "mm"), y = unit(5, "mm"), just = c( "bottom"))dev.off()#> quartz_off_screen #>                 2

以上数据和代码仅供大家参考,如有不完善之处,欢迎大家指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈大模型私有化+精调:面向垂直行业与特定场景之需

今天将继续“AI技术”系列&#xff0c;探讨大模型的私有化和精调&#xff0c;以便让预训练的通用模型更好地适应特定的任务或行业需求。 当然&#xff0c;从产品经理的视角出发&#xff0c;我们不会非常深入&#xff08;鄙人能力也有限&#xff09;&#xff0c;而是建立相关的…

HTTP协议和web服务器(Tomcat)

Author&#xff1a;Dawn_T17&#x1f965; 目录 二.请求协议 三.响应协议 四.协议解析 Socket 编程 Servlet介绍 Web服务器 五.Tomcat 简介 HTTP 即超文本传输协议 它是一种应用层协议&#xff0c;用于客户端&#xff08;如浏览器&#xff09;和服务器之间的通信。 为什…

《网络安全自学教程》- Linux安全标识符、身份鉴别、访问控制

《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统中的用户和进行身份鉴别。依据系统安全策略对用户的操作进行访问控制&#xff0c;防止用户和外来入侵者对计算机资源的非法访问。…

mysql误删数据恢复记录

背景 1、数据库版本 5.7.36&#xff0c;由于误操作删掉了表的所有数据&#xff0c;但是数据库备份每天凌晨进行、只能从备份恢复昨日的全量数据&#xff0c;当日的数据将会丢失 查看binlog配置 尝试恢复 1、找到binlog文件 误删除后立即刷新binlog flush logs 2、binlog转…

OpenAI GPT-2 model use with TensorFlow JS

题意&#xff1a;使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景&#xff1a; Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本&#xff1f; If not what is the limitation, like mo…

010集——按值传递、按引用传递等方法——C#学习笔记

按值传递参数 这是参数传递的默认方式。在这种方式下&#xff0c;当调用一个方法时&#xff0c;会为每个值参数创建一个新的存储位置。 实际参数的值会复制给形参&#xff0c;实参和形参使用的是两个不同内存中的值。所以&#xff0c;当形参的值发生改变时&#xff0c;不会影…

MDK常见概念

&#xff08;1&#xff09;typedef定义结构体类型 typedef struct {uint32_t BaudRate;uint32_t WordLength;uint32_t StopBits;uint32_t Parity;uint32_t Mode;uint32_t HwFlowCtl;uint32_t OverSampling; } UART_InitTypeDef; &#xff08;2&#xff09;寄存器 (3)DMA DMA 是…

2024年第八届计算生物学与生物信息学国际会议 (ICCBB 2024)即将召开!

2024 年第八届计算生物学和生物信息学国际会议&#xff08;ICCBB 2024&#xff09;将于2024年11月28 -30在日本京都召开&#xff0c;ICCBB 2024是展示理论、实验和应用计算生物学和生物信息学领域新进展和研究成果的主要论坛之一。我们相信&#xff0c;通过大家的共同努力&…

【问题】容器部署场景Spring Bean偶尔循环依赖问题

问题描述 在本地开发中不会发生循环依赖问题&#xff0c;但是在容器场景下&#xff0c;制作成镜像启动后异常出现Bean的循环依赖。 问题原因 开发者在代码中使用构造函数注入来引用依赖的 Bean&#xff0c;这种方式可能导致循环依赖问题。虽然 Spring 框架具备循环依赖的处理…

thinkphp漏洞之sql注入漏洞-builder处漏洞

目录 适用版本 环境搭建 文件下载安装 配置文件修改 漏洞分析 适用版本 注&#xff1a;thinkphp版本&#xff1a;5.0.13<ThinkPHP<5.0.15 、 5.1.0<ThinkPHP<5.1.5 环境搭建 文件下载安装 在github上面下载相应版本&#xff0c;下载think文件&#xff0c;…

乳制品企业怎么防止信息泄露?使用加密软件保障数据安全

乳,制品行业使用加密软件主要是为了保障企业的核心数据安全&#xff0c;防止敏感信息泄露&#xff0c;如:产品配方、生产流程、销售数据等&#xff0c;通过使用加密软件&#xff0c;来保护重要的数据.。一、加密软件在乳制品企业的重要性1、保护重要数据:乳制品企业拥有大量敏感…

SQL 变量写法、排序问题 <12>

一、定义变量排序 目的1&#xff1a;合并学生表和分数表&#xff0c;将每个班分别排名 目的2&#xff1a;遇到相同分数&#xff0c;考虑还是不考虑相同分数排名 学生表&#xff08;1000条&#xff09;和分数表&#xff08;6000条&#xff09;分别如下 1、定义变量、简答排序…

datax和datax-web打包成docker运行

概述 datax和datax-web从一台机器迁移到另一台时&#xff0c;要重新搭建一套运行环境&#xff0c;比较麻烦&#xff1b;打包成docker镜像后迁移就方便多了; 因为我的mysql版本是8&#xff0c;需要在datax的read和write中手动添加8的jdbc驱动 所以我先各自下载好了datax和data…

JavaEE 的入门

1. 学习JavaEE Java EE(Java Platform Enterprise Edition), Java 平台企业版. 是JavaSE的扩展, ⽤于解决企业级的开 发需求, 所以也可以称之为是⼀组⽤于企业开发的Java技术标准. 所以, 学习JavaEE主要是学习Java在 企业中如何应⽤. 前⾯学习的是Java基础, JavaEE 主要学习Jav…

修改docker数据存储目录及拉取镜像安装oracle19c

一、修改docker数据目录&#xff0c;默认安装路径为/var/lib/docker 查看docker主路径 docker info |grep "Docker Root Dir"1.停服务 systemctl stop docker2.新建目录并授权 mkdir /data/docker -p chown -R root:docker /data/docker/3.修改配置文件 原有{}内…

微信小程序预览PDF、H5预览PDF、网页预览PDF,并添加专属文字水印

下载PDF.js 点击PDF.js下载地址 引入预览PDF 文件 // const url new URL("./1.pdf", import.meta.url).href // 在本地项目获取pdf // const url "https://xxxx/05d833041f.pdf" // 在线上链接获取pdf const url query.get(url) // 在地址栏获取pdf c…

2024年Q2震撼来袭!AMD数据中心与笔记本CPU市场独占鳌头,强劲表现引爆业界关注!

根据CPU市场追踪机构Mercury Research的最新报告&#xff0c;AMD在2024年第二季度再次取得了显著成绩&#xff0c;在数据中心和笔记本电脑CPU市场上份额有所增加。然而&#xff0c;Intel在台式机市场仍占据优势&#xff0c;并在整体出货量上保持领先地位。 在2024年第二季度&a…

本地查看的Git远程仓库分支与远程仓库分支数量不一致

说明&#xff1a;一次&#xff0c;在IDEA中想切换到某分支&#xff0c;但是查看Remote没有找到要切换的分支&#xff0c;但是打开GitLab&#xff0c;查看远程仓库&#xff0c;是有这个分支的。 解决&#xff1a;1&#xff09;在IDEA的Git中&#xff0c;点下面Fatch获取一下远程…

Grype:用于容器镜像、文件系统的开源漏洞扫描程序

容器镜像和文件系统的漏洞扫描器 Grype 是一个开源漏洞扫描器&#xff0c;专为容器镜像和文件系统设计&#xff0c;可与强大的软件物料清单 (SBOM) 工具 Syft 无缝集成。 扫描容器镜像或文件系统的内容以查找已知漏洞。 查找主要操作系统软件包的漏洞 Alpine Amazon Linux B…

计算机毕业设计 招生宣传管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…