[论文分享]跟着NC学绘图-方差分析及线性回归

科技   2024-11-09 08:30   陕西  

欢迎关注R语言数据分析指南

本节来分享解读一下nature communications上一篇文章的数据可视化案例图,论文中图表的数据+代码作者均有提供,可从文章中直接下载,数据及代码整理的非常整洁明了,实际测试均可成功运行,对此感兴趣的读者可以去原文中详细查看。本次先来介绍论文中的Figure_1,个人观点仅供参考,更多详细内容请参考论文介绍。

论文

The biogeography of soil microbiome potential growth rates

https://www.nature.com/articles/s41467-024-53753-w

论文原图展示

文章中主图只有三张都是使用频率非常高的图,但是作者提供的代码中有非常多的学习点。认真学习此份案例将能真实提高R语言绘图的能力。

代码获取处

文章内点击Supplementary Code 1与Supplementary Data 1即可下载对应的数据及代码,代码为txt格式,只需将其后缀改为R即可。

方差分析

此段代码主要学习如何进行方差ANOVA分析并通过agricolae包进行Duncan多重比较检验

library(readxl)
library(ggplot2)
library(ggpubr)

growth <- data.frame(read_excel("41467_2024_53753_MOESM4_ESM.xlsx")) # 从Excel文件中读取数据并创建data.frame
summary(aov(log(RelGrowth)~Ecosystem,data=growth)) # 对log(RelGrowth)与Ecosystem的关系进行方差分析并总结结果
unique(growth$Ecosystem) # 显示Ecosystem变量中的唯一值(不同的生态系统类型)
fit = aov(log(RelGrowth)~Ecosystem,data=growth) # 再次进行方差分析并将结果存储在fit中

library(agricolae) # 加载agricolae包,用于多重比较检验
res <- duncan.test(fit,"Ecosystem"# 进行Duncan检验,比较不同Ecosystem的差异显著性
plotdata=data.frame(res$groups) # 将Duncan检验结果中的分组信息转为data.frame
plotdata$Ecosystem = row.names(plotdata) # 将行名(Ecosystem名称)添加为plotdata的Ecosystem列

p1=ggplot()+ 
  geom_jitter(data=growth,aes(x=Ecosystem,y=log(RelGrowth),color=Ecosystem0),width=0.1,size=0.7)+ # 使用geom_jitter绘制散点图,设定X轴为Ecosystem,Y轴为log(RelGrowth),颜色根据Ecosystem0变量设置
  geom_boxplot(data=growth,aes(x=Ecosystem,y=log(RelGrowth),color=Ecosystem0),alpha=0.5,size=0.3, outlier.shape = NA)+ # 使用geom_boxplot绘制箱线图,不显示离群值
  scale_color_manual(values=c("Grassland"="darksalmon","Forest"="green4"))+ # 手动设置颜色:草地为深橙色,森林为绿色
  geom_text(data=plotdata,aes(x=Ecosystem,y=1.8,label=groups),size=2)+ # 使用geom_text将Duncan分组信息显示在图中,Y轴位置为1.8
  scale_x_discrete(limits=c("Desert grassland","Temperate grassland""Alpine grassland","Tropical forest","Subtropical forest""Temperate forest","Boreal forest","Alpine forest"))+ # 设置X轴的显示顺序
  labs(x="Ecosystems",y= expression("ln-"*G[mass]*" (mg "*g^-1*" MBC"*~h^-1*")"))+ # 设置X轴和Y轴的标签,Y轴使用表达式
  theme_test()+ 
  theme(plot.margin = unit(c(1,1,1,1), "pt"), # 设置图表的边距
        legend.position = c(0.7,0.15), # 设置图例的位置
        legend.title = element_blank(), # 不显示图例标题
        legend.text = element_text(size=7), # 设置图例文字的大小
        legend.key.size =  unit(0.3,"cm"), # 设置图例标识的大小
        legend.background = element_blank(), # 不显示图例背景
        axis.text = element_text(size=7), # 设置坐标轴文字的大小
        axis.text.x = element_text(size=7,angle = 60,hjust = 1), # 设置X轴文字的大小和角度
        axis.title = element_text(size=8), # 设置坐标轴标题的大小
        title = element_text(size=11)) # 设置标题的大小

线性回归

此段代码主要需要学习如何使用expression来添加特殊文本

library(colorspace) # 加载colorspace包
summary(lm(log(RelGrowth)~log(AI),data=growth)) # 使用线性回归模型拟合log(RelGrowth)和log(AI)之间的关系
p2 = ggplot()+ 
  geom_point(data=growth,aes(x=AI,y=log(RelGrowth)),size=2.5,stroke=0.3,shape=21,fill="firebrick3")+ # 使用geom_point绘制散点图,X轴为AI,Y轴为log(RelGrowth),填充颜色为firebrick3
  geom_smooth(data=growth,aes(x=AI,y=log(RelGrowth)),method="lm",formula = "y~log(x)", color="firebrick3",se=F,size=0.5)+ # 使用geom_smooth绘制回归线,方法为lm(线性回归),公式为y~log(x),颜色为firebrick3,不显示置信区间
  labs(x=expression("Aridity index"), y=expression("ln-"*G[mass]*" (mg "*g^-1*" MBC"*~h^-1*")"))+ # 设置X轴和Y轴的标签,Y轴使用表达式
  theme_test()+ # 使用theme_test主题
  theme(plot.margin = unit(c(1,1,1,1), "pt"), # 设置图表的边距
        legend.position = "non"# 不显示图例
        legend.title = element_text(size=7), # 设置图例标题的字体大小
        legend.text = element_text(size=6), # 设置图例文字的字体大小
        legend.key.size =  unit(0.2,"cm"), # 设置图例标识的大小
        legend.background = element_blank(), # 不显示图例背景
        axis.text = element_text(color = "black",size=8), # 设置坐标轴文字的颜色和大小
        axis.text.x = element_text(size=8), # 设置X轴文字的大小
        axis.title = element_text(size=9), # 设置坐标轴标题的大小
        title = element_text(size=11))+ # 设置标题的字体大小
  annotate("text",x=60,y=-0.8,label = expression(italic(R)^2*"=0.53, "*italic(P)*"<0.001"),size=2# 使用annotate函数在指定位置添加文本注释,显示R平方和P值,字体大小为2

summary(lm(log(RelGrowth)~MAT,data=growth[which(growth$Ecosystem0=="Grassland"),]))
summary(lm(log(RelGrowth)~MAT,data=growth[which(growth$Ecosystem0=="Forest"),]))

p3 = ggplot()+
  geom_point(data=growth,aes(x=MAT,y=log(RelGrowth),color=Ecosystem0,group=Ecosystem0),
             size=2.5,stroke=0.5,fill="grey")+
  geom_smooth(data=growth,aes(x=MAT,y=log(RelGrowth),color=Ecosystem0,group=Ecosystem0),
              method="lm",se=F,size=0.5)+
  scale_color_manual(values=c("Grassland"="darksalmon","Forest"="green4"),
                     labels=c("Grassland"=expression("Grassland: "*italic(R)^2*"=0.45, "*italic(P)*"<0.001"),
                            "Forest"=expression("Forest: "*italic(R)^2*"=0.24, "*italic(P)*"<0.001")))+
  labs(x=expression("Mean annual temperature ("*degree*C*")"),
       y=expression("ln-"*G[mass]*" (mg "*g^-1*" MBC"*~h^-1*")"))+
  theme_test()+
  theme(plot.margin = unit(c(1,1,1,1), "pt"),
        legend.position = c(0.6,0.9),
        legend.title = element_blank(),
        legend.text = element_text(size=6,hjust = 0),
        legend.key.size =  unit(0.2,"cm"),
        legend.background = element_blank(),
        axis.text = element_text(color = "black",size=8),
        axis.text.x = element_text(size=8),
        axis.title = element_text(size=9),
        title = element_text(size=11))

拼图

p<- ggarrange(p1,p2, p3, ncol = 3, nrow = 1,  widths = c(2,3,3),
              labels = c("(a)","(b)","(c)"), font.label=list(size=9),hjust = 0, vjust = 1)
p
ggsave("Fig.1.tiff",p,units="cm", width=16, height=8,
       dpi=500, compression = "lzw")
ggsave("Fig.1.pdf",p,units="cm", width=16, height=8)

实际运行结果

关注下方公众号下回更新不迷路


R语言数据分析指南
R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
 最新文章