使用R中的for循环为每个因子打印多个ggplots

时间:2015-03-22 11:36:37

标签: r for-loop ggplot2

我对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文件here。 谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用ggplot2构面将所有图表放在同一页面上:

ggplot(df, aes(x=x, y=y1)) +
  geom_point() + 
  facet_grid(. ~ site)

答案 1 :(得分:1)

@Luise,使用您的&#39; sample.csv&#39;文件这将为您提供所要求的文件,每页上有2个图,按“网站”分组。 (确保变量&#39; site&#39;是一个因素。您应该使用&#39; str(df)&#39;)进行检查。我使用了&#39; grid.arrange&#39;功能来自&#39; grid.Extra&#39;打包以放置地块。如果在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