美文网首页
ggcor在微生物分析中实战使用

ggcor在微生物分析中实战使用

作者: 无话_ | 来源:发表于2021-09-05 01:33 被阅读0次

上班遇见一个项目,客户发了一张图过来,说是lable这块还是自己ps过的,要求和示例图片一样。



以前遇见这种有些麻烦的项目,一般都是找B哥进行深入浅出的交流,最后B哥都会不胜其烦地把写好的脚本给我直接跑。B哥走后,问了一圈,就得到了一个教程链接,公司几个分析员都没做过,做过的那个老大哥也是很久之前现做的,啥脚本都不剩了,丢给了我一个链接。唉,眼下只好重拾我那菜得扣脚的R语言,慢慢琢磨了 。(._.) <(我想跑路啊我,真就不怕出啥岔子吗这,我我就一刚毕业的小菜鸡啊我)

ggcor安装

由于ggcor作者删除了这个项目,装包稍微有点麻烦,实测可行的方法如下
首先进入gitee别人克隆的项目 https://gitee.com/try-quiet/ggcor.git
点击克隆下载,下载zip


下载成功后,使用devtools将本地包导入,如:
devtools::install_local("C:/Program Files/Downloads/ggcor-master.zip") 

绘图

https://github.com/zlabx/Microbiome/tree/master/ggcor
这个github项目有着相当不错的demo,包含了文件和源码
只是绘制的图片效果不尽人意

demo.png

基于此,进行一些修改,也大大减轻了我的工作量,也十分感谢这位大神。其精简后的源码如下

library(vegan)
library(ggcor)
library(dplyr)
library(ggplot2)


s<- read.table("otu.txt", sep = "\t", header = T, row.names = 1, check.names = F)
env <- read.table("env.txt", sep = "\t", header = T, row.names = 1, check.names = F)
spec<-as.data.frame(t(s))
mantel<-mantel_test(spec, env,
                        spec.select = list(OTUs =1:30,
                                           mOTUs =31:40,
                                           genes =41:50)) %>%
  mutate(r = cut(r, breaks = c(-Inf, 0.25, 0.5, Inf),
                 labels = c("<0.25", "0.25-0.5", ">=0.5"),
                 right = FALSE),
         p.value = cut(p.value, breaks = c(-Inf, 0.001, 0.01, 0.05, Inf),
                       labels = c("<0.001", "0.001-0.01", "0.01-0.05", ">=0.05"),
                       right = FALSE))
#绘制组合图
p1<-quickcor(env, type = "upper") + geom_square(inherit.aes = TRUE) +
  anno_link(mantel, mapping = aes(colour = p.value, size = r)) +
  scale_size_manual(values = c(0.5, 1.5, 3)) +
  geom_diag_label(angle = 0,geom = "text", remove.axis = TRUE)+
  scale_fill_gradient2(midpoint = 0, low = "#56B4E9", mid = "white",high = "#77C034", space = "Lab" )+  #自定义热图颜色
  scale_color_manual(values=c("#77C034", "#E69F00", "#56B4E9"))#自定义连线
#定义图例标题
p2<-p1+guides(size=guide_legend(title="Mantel's R",override.aes=list(colour="grey35"),order=2),
          colour=guide_legend(title="Mantel's P",override.aes = list(size=3),order=1),
          fill=guide_colorbar(title="Pearson's R",order=3))
p2

对比客户要求,要修改的东西主要有:颜色,图例位置,增加标题。直接上修改后的代码:

library(vegan)
library(ggcor)
library(dplyr)
library(ggplot2)


s<- read.table("otu.txt", sep = "\t", header = T, row.names = 1, check.names = F)
env <- read.table("env.txt", sep = "\t", header = T, row.names = 1, check.names = F)
spec<-as.data.frame(t(s))
#加载依赖关系包

mantel<-mantel_test(spec, env,
                        spec.select = list(OTUs =1:30,
                                           mOTUs =31:40,
                                           genes =41:50)) %>%
  mutate(r = cut(r, breaks = c(-Inf, 0.25, 0.5, Inf),
                 labels = c("<0.25", "0.25-0.5", ">=0.5"),
                 right = FALSE),
         p.value = cut(p.value, breaks = c(-Inf, 0.001, 0.01, 0.05, Inf),
                       labels = c("<0.001", "0.001-0.01", "0.01-0.05", ">=0.05"),
                       right = FALSE))
#绘制组合图
p1<-quickcor(env, type = "upper",legend.position = "bottom") + 
  geom_square(inherit.aes = TRUE) +
  anno_link(mantel, mapping = aes(colour = p.value, size = r))+
  scale_size_manual(values = c(1, 1.25, 2))+   #线段size
  scale_color_manual(values=c("#446596","#E55154","#CACBCD"))+  #线段颜色
  scale_fill_gradient2(midpoint = 0, low = "#446596", mid = "white",high = "#E55154", space = "Lab" )#热图颜色
#+geom_diag_label(angle = 0,geom = "text", remove.axis = TRUE) 这个句决定env是否以横纵坐标展示
#定义图例标题
p2<-p1+theme(legend.box.margin=margin(0,-40,0,0),legend.title = element_text(size = 15), legend.text = element_text(size = 15),legend.key.width = unit(1,"cm"),legend.margin=margin(0,0,0,50))+
        guides(size=guide_legend(direction = "vertical",title="Mantel's r",override.aes=list(colour="grey35"),order=2),
          colour=guide_legend(direction = "vertical",title="Mantel's p",override.aes = list(size=3),order=1),
          fill=guide_colorbar(direction = "vertical",title="Pearson's r",barheight = 4,  order=3))

p2

图片示例:


主要涉及到的函数:

legend.position = "bottom" #设置图例区域位置
legend.box.margin=margin(0,-40,0,0)  #设定图例区域的边界,margin(上,右,下,左),默认单位为pt,(0,-40,0,0)指图例区域右侧与边界距离减少40pt
#legend.justification = c(1,0) 一定程度上可以替代 legend.box.margin
legend.key.width = unit(1,"cm")  #设置图例宽度
legend.margin=margin(0,0,0,50) #设定图例的边界,指左侧与边界的距离增加50pt
guide_legend(direction = "vertical") #设定图例中的各个组件为纵向排列

个人认为legen的调整主要是明确图例区域,图例,图例的组件,从整体到局部调整的概念。

如何获取一张图片上的颜色

方法一:windows自带画图工具,打开图片后,使用颜色选取器,获得rgb数值,找一个rgb转16进制的网站,获得颜色,或者直接用rgb?(没有直接用过。。。)
https://blog.csdn.net/u014163312/article/details/106176920/
方法二:qq截图后自带16进制识色,按C还可复制色号;微信截图也可以获得色号,但是是rgb格式

一个问题:

图片的绘制方法基本就这些,但是可以看到,示例代码手动选择了群落,即将OTU130作为群落一,OTU3140作为群落2,OTU41~50作为群落3,这似乎并不符合常理。关于mantel_test中spec.select作用,我实在不明白。似乎只能探讨环境因子与样品之间的关联

image.png

在修改部分代码

grp=rep(LETTERS[1:4],4,length.out=14)
#grp为长度14的向量与14个样品名对应
mantel<-mantel_test(spec, env,group=grp) %>%
  mutate(r = cut(r, breaks = c(-Inf, 0.25, 0.5, Inf),labels = c("<0.25", "0.25-0.5", ">=0.5"),
                 right = FALSE),
         p.value = cut(p.value, breaks = c(-Inf, 0.001, 0.01, 0.05, Inf),
                       labels = c("<0.001", "0.001-0.01", "0.01-0.05", ">=0.05"),
                       right = FALSE))
#此时每一个spec与组对应(见下图),故将spe改为组名
mantel$spec=mantel$.group

重新运行代码,最终图片为



说实话感觉有点懵,主要是不确定是否有实际意义。另外这暴露出一个问题:Mantel's P 在0.001-0.01, 0.01-0.05, >=0.05,的颜色并非与蓝,红,灰一一绑定的,当前情况下,P值不存在0.001-0.01,0.01-0.05则直接使用蓝色。在多张图片共用一个legend的时或许又要烧脑了。

参考汇总:

初始源码与示例数据:https://github.com/zlabx/Microbiome/tree/master/ggcor
如何安装ggcor:https://www.zhihu.com/question/409189621
获取图片颜色:https://blog.csdn.net/u014163312/article/details/106176920/

相关文章

网友评论

      本文标题:ggcor在微生物分析中实战使用

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