展示数据的方式有很多,图形无疑是最佳的方法之一,因为图形能更直观地展示数据的变化规律。ggplot2是R语言绘图功能最强大的R包之一,大家肯定非常熟悉,但平时绘图的时候可能需要画同类型图很多次,因此循环绘图是很有必要学习和掌握的。今天主要与大家分享ggplot循环画图及保存导出。
ggplot2的单次展示
首先,我们准备好数据。其中,数据集的x轴为样地(site),y轴为对应物种的丰度(abundance)。
head(df3a)
![在这里插入图片描述](http://image109.360doc.com/DownloadImg/2023/01/1920/259296170_1_20230119081700228.png) 利用ggplot2包中的geom_bar()绘制柱状图:
df3a %>%
ggplot(aes(as.factor(site), Mean, fill=as.factor(site)))+
geom_bar(stat = "identity", width = 0.75)+
geom_errorbar(aes(ymin=Mean-se, ymax=Mean+se), width=0.15)+
scale_fill_manual(values = c('#BBB8DF', '#F8B65C', '#80B1D2', '#FB8071'))+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = "none",
axis.text.x = element_text(color = "black", size=12, vjust = 0.5, hjust = 0.5),
axis.text.y = element_text(color = "black", size=12),
axis.title = element_text(color = "black", size=12))+
labs(x="Site", y="Mean")
![在这里插入图片描述](http://image109.360doc.com/DownloadImg/2023/01/1920/259296170_2_20230119081700325.png) 单次绘图结束,保存导出:
# ggsave 保存pdf
ggsave("df3a.pdf")
# export中graph2ppt 保存ppt给格式
graph2ppt(file = "df3a.ppt", append=T)
ggplot2的循环画图
准备一份工作量比较大,需要重复次数较多的数据集,具体示例如下:
head(dfsp)
具体情况如下:目的就是为了绘制相同site下不同年份的图。如果site有30个,也就是意味着需要绘制30张重复的图。重复30次代码,这样看起来有点笨拙和累赘。因此,我们就要学会ggplot的循环绘图来解决这个问题。 ![在这里插入图片描述](http://image109.360doc.com/DownloadImg/2023/01/1920/259296170_3_20230119081700399.png) 接下来,我们需要先构建出需要循环的个数,也就是对应需要重复画图的数量
p <- c(paste0('p',unique(dfsp$site)));p
length(p)
我们以对应的site作为顺序,然后构建了p(site number),可以看出需要循环绘图24次。因此,ggplot循环是非常有意义的。 ![在这里插入图片描述](http://image109.360doc.com/DownloadImg/2023/01/1920/259296170_4_20230119081700571.png) 再定义一个list来打包装载所需循环绘制图的输出格式及名称。
dir <- list()
关键一步,就是循环的思路。其实无非就是ggplot重复了24次,只是替换了数据。其他ggplot绘图参数是一样的,就是绘图数据不同,因此我们需要完成以下步骤就可以了:
1.将数据循环起来; 2.对不同的数据循环绘制; 3.循环导出即可。
循环导出的结果,这里以pdf和ppt格式为例。由于这两种导出的格式,其循环过程不太一样。
1)循环绘图导出pdf格式,具体解读在code中。如果用ggsave来循环导出结果,其需要循环每次绘图时都有对应本次的打印结果(换句话说,也就是你绘图了一张图,要有对应每张图的赋值变量名称,并且要求该名称可以直接打印出图的结果)
for(i in 1:length(unique(dfsp$site))){
# 循环的次数就是i in 1:length(unique(dfsp$site))
dir[[i]]<-paste("p",unique(dfsp$site)[i],".pdf",sep = "")
# dir的目的是构建循环对应图顺序的导出格式,这里是以pdf为例
# 因为我要用的导出函数为ggsave,该函数还可以导出其他格式,根据自己需求修改
# “.pdf”表示输出的为pdf格式。
# 其中用paste函数批量生成以p开头的名称,px。结果就是刚刚产生的p对应的导出名称,例如:p10.pdf。
df_for <- dfsp %>% filter(site==unique(dfsp$site)[i])
# 这行就是循环的关键,循环数据。通过filter函数来循环对应site的情况。
# assign函数的作用,就是将对应循环ggplot的结果赋值给p[i]
# 由于i是固定的顺序,因此都可以一一对应。
# ggplot的其他参数都没有修改,就是循环了数据。
assign(p[i],ggplot(df_for, aes(as.factor(Year), Mean, fill=as.factor(Year)))+
geom_bar(stat = "identity", width = 0.75, position = position_dodge(0.7))+
geom_errorbar(aes(ymin=Mean-se, ymax=Mean+se), width=0.15)+
scale_fill_manual(values = c('#BBB8DF', '#F8B65C', '#80B1D2', '#FB8071','#8CD3CB','#B780B4'))+
geom_text(aes(label=groups, y = Mean+se + 4), position = position_dodge(0.7))+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = "none",
axis.text.x = element_text(color = "black", size=12, vjust = 0.5, hjust = 0.5),
axis.text.y = element_text(color = "black", size=12),
axis.title = element_text(color = "black", size=12))+
ggtitle(unique(dfsp$site)[i])+
# 另外,我们为了更好的识别哪张图对应哪个site,我们给每次循环的绘图结果加上title,tile为对应site
labs(x="Year", y="Mean"))
ggsave(file = dir[[i]])
# 最后用ggsave导出循环结果,其中dir[[i]]就是刚开始我们需要循环导出图的名称及格式。
}
循环导出ppt格式,为什么会考虑这个格式呢,其一是:能够导出pdf方便后期一些细节的优化(类似AI和PS),其二是:该导出结果用到的是export包中的graph2ppt(),该函数的循环过程与ggsave过程不一样,它不需要每次都打印循环对应的图,而是直接把最终的结果一次性打印出来,然后用graph2ppt()函数中append=T的参数,表示将所有绘图的结果(24张)都打包到同一个ppt名下,如果append=F,则只会保留最后一个图,因为这样每次导出该名下的结果会覆盖上一次结果。
for(i in 1:length(unique(dfsp$site))){
dir[[i]]<-paste("p",unique(dfsp$site)[i],".ppt",sep = "")
df_for <- dfsp %>% filter(site==unique(dfsp$site)[i])
a <- ggplot(df_for, aes(as.factor(Year), Mean, fill=as.factor(Year)))+
geom_bar(stat = "identity", width = 0.75, position = position_dodge(0.7))+
geom_errorbar(aes(ymin=Mean-se, ymax=Mean+se), width=0.15)+
scale_fill_manual(values = c('#BBB8DF', '#F8B65C', '#80B1D2', '#FB8071','#8CD3CB','#B780B4'))+
geom_text(aes(label=groups, y = Mean+se + 4), position = position_dodge(0.7))+
theme_bw()+
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = "none",
axis.text.x = element_text(color = "black", size=12, vjust = 0.5, hjust = 0.5),
axis.text.y = element_text(color = "black", size=12),
axis.title = element_text(color = "black", size=12))+
ggtitle(unique(dfsp$site)[i])+
labs(x="Year", y="Mean", size=12)
print(a)
export::graph2ppt(file = "result.ppt",append=T)
}
温馨提醒:导出ppt格式的code写法上与ggsave差异主要体现在,打印结果。可以看到当我们想利用graph2ppt函数导出ppt时,我们是直接用的a作为赋值结果,然后直接print(a)。最后一次性将循环绘图的结果打包到了result该ppt下。(不要忘记加载tidyverse包)
最后从当前路径下可以找到我们的结果: ![在这里插入图片描述](http://image109.360doc.com/DownloadImg/2023/01/1920/259296170_5_20230119081700649.png) 一共包含24张pdf结果,和1个ppt结果。ppt可以看到有24张结果图。 ![在这里插入图片描述](http://image109.360doc.com/DownloadImg/2023/01/1920/259296170_6_20230119081700884.png)
|