Сетка из нескольких графиков ggplot2, которые были сделаны в цикле for

как новый пользователь ggplot2, я немного потерял количество возможностей и изо всех сил пытаюсь найти в сети простой ответ на то, что я считаю простой проблемой.

Я хотел бы отображать несколько графиков из ggplot2 на одном листе, но зная, что эти графики поступают из цикла for.

Следующий пример не компилируется, это только для иллюстрации:

for(i in c(1:n)){                                   
  for(j in c(1:m)){
    ..........  # some data production
    p <- ggplot(df.all) + geom_bar(aes_string(x=class.names[i],fill=var.names[j])
}}

Здесь p перезаписывается, но я хотел бы иметь вместо него матрицу или список, в который я могу поместить все p, когда они будут созданы, а затем простую функцию типа

display_in_a_grid(list_of_ggplot_plots)

Но насколько я пробовал, мне не удалось составить список матриц сюжета, ни найти функцию, которая принимает только один аргумент для ввода.

О вещах, на которые я смотрел:

"организоватьGrob" из пакета gridExtra не работает, потому что для каждого графика требуется явное имя (например: p1, p2, p3,...), как в http://code.google.com/p/gridextra/wiki/arrangeGrob

"фасет" метод ggplot2 не адаптирован для организации моего набора данных (или наоборот: p)

У вас будет простой способ справиться с этим?

Спасибо,

Франсуа

Ответы

Ответ 1

Я был бы склонен согласиться с Ричи, но если вы хотите устроить их самостоятельно:

library(gridExtra)
library(ggplot2)
p <- list()
for(i in 1:4){
  p[[i]] <- qplot(1:10,10:1,main=i)
}
do.call(grid.arrange,p)

взгляните на примеры в конце ?arrangeGrob для способов полного исключения цикла for:

plots = lapply(1:5, function(.x) qplot(1:10,rnorm(10),main=paste("plot",.x)))
require(gridExtra)
do.call(grid.arrange,  plots)