分享

R语言ggplot2 | 循环画图及导出

 张可卿 2023-01-19 发布于安徽

   展示数据的方式有很多,图形无疑是最佳的方法之一,因为图形能更直观地展示数据的变化规律。ggplot2是R语言绘图功能最强大的R包之一,大家肯定非常熟悉,但平时绘图的时候可能需要画同类型图很多次,因此循环绘图是很有必要学习和掌握的。今天主要与大家分享ggplot循环画图及保存导出。

ggplot2的单次展示

首先,我们准备好数据。其中,数据集的x轴为样地(site),y轴为对应物种的丰度(abundance)。

head(df3a)

在这里插入图片描述
利用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")

在这里插入图片描述
单次绘图结束,保存导出:

# ggsave 保存pdf
ggsave("df3a.pdf")

# export中graph2ppt 保存ppt给格式
graph2ppt(file = "df3a.ppt", append=T)

ggplot2的循环画图

准备一份工作量比较大,需要重复次数较多的数据集,具体示例如下:

head(dfsp)

具体情况如下:目的就是为了绘制相同site下不同年份的图。如果site有30个,也就是意味着需要绘制30张重复的图。重复30次代码,这样看起来有点笨拙和累赘。因此,我们就要学会ggplot的循环绘图来解决这个问题。
在这里插入图片描述
接下来,我们需要先构建出需要循环的个数,也就是对应需要重复画图的数量

p <- c(paste0('p',unique(dfsp$site)));p
length(p)

我们以对应的site作为顺序,然后构建了p(site number),可以看出需要循环绘图24次。因此,ggplot循环是非常有意义的。
在这里插入图片描述
再定义一个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包)

最后从当前路径下可以找到我们的结果:
在这里插入图片描述
一共包含24张pdf结果,和1个ppt结果。ppt可以看到有24张结果图。
在这里插入图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约