我想在一个图中有多个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分配)!在附图中,您将看到除标题外所有子图都相同。由于我也保存了单个子图,我知道问题不在于子图的数据/代码。
我是R的新手,这是我的第一个ggplot2(*请原谅多个geom_line())。因此,我花了一些时间来弄清楚如何拟合分布并绘制它们(谢谢,stackoverflow !!)。所以,这里的任何帮助将非常感激。
更新:我能够使用python 中的 PIL
包完成上述操作。但是,我真的希望能够在R中做到这一点。
答案 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
最后的情节:
答案 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