将for循环中创建的多个ggplots保存到单个绘图中

时间:2017-04-04 19:40:37

标签: r for-loop ggplot2 python-imaging-library

我想在一个图中有多个ggplots图。 ISSUE:当尝试使用for循环创建一个绘图列表(稍后在grid.arrange中使用)时,列表将返回空。
我使用了这两个帖子:

1)create figures in a loop
2)use grid.arrange to save in a single fig

提出以下代码(更简单的版本)*来绘制概率密度曲线:

#models = 33 obs of 1 variable
plotlist = list()
for (i in 1:33)
{
 modname = models$col1[i]
 p<- ggplot() + geom_line(aes(xi,yi)) + geom_line(aes(ai,bi)) + 
     ggtitle(modname) ## the x,y,a,b are just illustrative.
 #In reality, each pair is produced using fitdist and dgamma functions for
  # data (single column) from separate .csv
 ggsave(outpath)
 plotlist[[i]] = p   

}
main <- grid.arrange(grobs=plotlist,ncol=6)
main
ggsave("bigplot.png",p)

ISSUE(进一步说明):plotlist显示为空列表。因此,grid.arrange只绘制在最后一个循环中创建的子图33次。但是,奇怪的是grid.arrange图对所有子图都有正确的标题(使用modname分配)!在附图中,您将看到除标题外所有子图都相同。由于我也保存了单个子图,我知道问题不在于子图的数据/代码。 main 我是R的新手,这是我的第一个ggplot2(*请原谅多个geom_line())。因此,我花了一些时间来弄清楚如何拟合分布并绘制它们(谢谢,stackoverflow !!)。所以,这里的任何帮助将非常感激。

更新:我能够使用python 中的 PIL包完成上述操作。但是,我真的希望能够在R中做到这一点。

2 个答案:

答案 0 :(得分:2)

如果我理解正确(我不确定),这只是保存你的情节文件。

我认为问题很简单,grid.arrange()不适用于last_plot(),这是ggsave显然使用的内容。所以最好明确一下你想要保存的情节。

这是一个简单的工作示例,图表较少,没有回归模型,只有几个随机图:

library(ggplot2)
library(gridExtra)
plotlist = list()
n <- 100
for (i in 1:9)
{
  df <- data.frame(x=rnorm(n),y=rnorm(n))
  pname <- paste0("Plot-",i)
  p<- ggplot(df) + geom_point(aes(x,y)) + ggtitle(pname)
  ggsave(paste0(pname,".png"),p)
  plotlist[[i]] = p   
}
p <- grid.arrange(grobs=plotlist,ncol=6)
ggsave("bigplot.png",p)

文字输出:

Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
Saving 4.76 x 5.28 in image
> p <- grid.arrange(grobs=plotlist,ncol=3)
> ggsave("bigplot.png",p)
Saving 4.76 x 5.28 in image

最后的情节:

enter image description here

答案 1 :(得分:1)

您的plotlist问题可能是您在i循环中直接呼叫ggplot的{​​{1}}占位符 -

for

ggplot() + geom_line(aes(xi,yi)) + geom_line(aes(ai,bi)) 然后在渲染绘图时被懒惰地评估,即i的最后一个值用于创建 all 图。

如果是这种情况,您可以使用i代替aes_string

aes

但是你要做的事情似乎是ggplot(df, aes_string(x="your_x", y=i)) + geom_line() facet_grid的完美工作,在这种情况下你的循环只用于生成数据:

facet_wrap