在for循环中添加ggplot()对象

时间:2014-06-30 10:32:53

标签: r ggplot2

我想创建4个图,在模拟中显示4种不同的条件。使用for循环迭代模拟中的4个条件。我想做的是:

for (cond in 1:4){
1.RUN SIMULATION
2.PLOT RESULTS
}

最后,我希望在网格上排列4个图。使用plot(),我可以使用par(mfrow),并自动添加绘图。有没有办法用ggplot做同样的事情?

我知道我可以使用grid.arrange(),但这需要将图存储在单独的对象中,plot1 ... plot5。但它不可能做到:

for (cond in 1:4){
1. run simulation
2. plot[cond]<-ggplot(...)
}

我无法为这些情节提供单独的名称,例如循环中的plot1,plot2,plot3。

3 个答案:

答案 0 :(得分:4)

您可以使用gridExtra包:

library(gridExtra)
library(ggplot2)
p <- list()
for(i in 1:4){
  p[[i]] <- ggplot(YOUR DATA, ETC.)
}
do.call(grid.arrange,p)

答案 1 :(得分:2)

在这种情况下我会使用facetting。根据我的经验,ggplot2中很少需要明确地安排子图。一个模型示例可能会更好地说明我的观点:

run_model = function(id) {
    data.frame(x_values = 1:1000, 
               y_values = runif(1000), 
               id = sprintf('Plot %d', id))
}
df = do.call('rbind', lapply(1:4, run_model))
head(df)
  x_values  y_values     id
1        1 0.7000696 Plot 1
2        2 0.3992786 Plot 1
3        3 0.2718229 Plot 1
4        4 0.4049928 Plot 1
5        5 0.4158864 Plot 1
6        6 0.1457746 Plot 1

此处,id是指定值属于哪个模型运行的列。可以使用以下方式完成绘图:

library(ggplot2)
ggplot(df, aes(x = x_values, y = y_values)) + geom_point() + facet_wrap(~ id)

enter image description here

答案 2 :(得分:0)

另一种选择是使用多重函数:

library(ggplot2)
p <- list()
for(i in 1:4){
  p[[i]] <- ggplot(YOUR DATA, ETC.)
}
do.call(multiplot,p)

有关该内容的更多信息 - http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/