Сетка из нескольких графиков 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)

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

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

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

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

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

спасибо,

Франсуа

2 ответов


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

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)

Это мое решение. Крошечные изменения в до aes_string.

library(gridExtra)
library(ggplot2)
p <- list()
for(i in 1:4){
p <- ggplot(data=df,aes_string(x=df$x,y=df$y) +geom_bar(aes_string(x=class.names[i],fill=var.names[j])
}
do.call(grid.arrange,p)

надеюсь, что это помогает!