在R中使用for循环为每个因子打印多个ggplot图表

4

我对R很新,这是我在Stackoverflow上的第一个问题,如果有不清楚的地方,请让我知道!
我有一个由因子变量df$site拆分的大型数据集。对于每个站点,我需要打印几个图形(例如A和B)。到目前为止,我已经成功地将所有图形单独打印成不同的PDF文件(使用下面的代码)。
但是,我需要将图形分组到一个大的PDF中 - 每个页面包含每个站点的A图和B图,例如:
第1页 - 站点1 - 图A1,图B1
第2页 - 站点2 - 图A2,图B2(以此类推)。
非常感谢您对如何做到这一点的建议!

doplot = invisible(by(df, df$site, function(i) {

A <- ggplot(i, aes(x, y1))+ geom_point() + ggtitle(unique(i$site))  
B <- ggplot(i, aes(x, y2))+ geom_point() + ggtitle(unique(i$site))

ggsave(sprintf("%s_A.pdf", unique(i$site)), A)
ggsave(sprintf("%s_B.pdf", unique(i$site)), B)
}))

lapply(unique(df$site), doplot)

我不确定如何发布示例数据,因此这里是一个简化的示例:
site    x   y1  y2
site_1  3.56    0.337674318 1.935941597
site_1  4.31    1.559665628 2.402924583
site_1  4.36    1.523297984 2.600534832
site_1  5.03    2.261701756 2.394485714
site_1  5.23    2.573428703 2.686396123
site_1  5.33    2.582030907 2.600534832
site_1  5.69    2.842581635 2.723667517
site_2  3.79    2.793543915 3.265708161
site_2  4.49    3.353407259 3.701443333
site_2  4.88    3.363259555 3.733048672
site_2  4.94    3.550471097 3.780780075
site_2  4.88    3.590317006 3.848359519
site_2  5.31    3.708100041 3.922750337
site_2  5.26    3.735499016 3.906067837
site_2  4.22    3.074269438 4.091499816
site_2  6.72    4.329273722 4.35481919
site_2  6.46    4.283464186 4.326989203

我已经上传了一个样本 .csv 文件在这里。 谢谢!


1
你能dput你的数据框吗? - Colonel Beauvel
2个回答

2
您可以使用ggplot2的分面功能将所有图形显示在同一页上:
ggplot(df, aes(x=x, y=y1)) +
  geom_point() + 
  facet_grid(. ~ site)

谢谢...但我的问题是如何按站点分组_不同_绘图(x-y1和x-y2)。 - Louise
@Louise,我认为您应该将绘图代码放在pdf-函数中,并使用'onefile'参数。 这个答案也可能会有所帮助。 - hvollmeier
@hvollmeier:我尝试过了,但仍然没有找到一个能够正确工作的解决方案。当我找到一个时,我会在这里发布。 - Louise

1

@Luise,使用您的“sample.csv”文件,这将为您提供所需的文件,每页2个图表,按“站点”分组。(确保变量“site”是因子。您应该用'str(df)'检查它)。我使用了“grid.Extra”包中的“grid.arrange”函数来放置图表。在pdf函数中没有名称参数的情况下,图表将打印到默认的“Rplots.pdf”文件中。

require(ggplot2)
require(gridExtra)
pdf(onefile = TRUE)
for(i in 1:length(levels(df$site))){
  A <- ggplot(df[df$site == levels(df$site)[i],], aes(x=x, y=y1)) + geom_point() + ggtitle(levels(df$site)[i])
  B <- ggplot(df[df$site == levels(df$site)[i],], aes(x=x, y=y2)) + geom_point() + ggtitle(levels(df$site)[i])
  grid.arrange(A, B)
}
dev.off()

您可以在此处下载输出文件here

非常感谢!这正是我需要生成的输出。我在完整数据集上尝试了代码,它完美地工作了 - 所以我非常感激你 :) - Louise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接