2012-05-22 5 views
42
library(ggplot2) 
df <- data.frame(x=1:10, y=rnorm(10)) 
p1 <- ggplot(df, aes(x,y)) + geom_point() 
plist <- list(p1,p1,p1,p1,p1) 
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above. 

Я хотел бы организовать участки, используя grid.arrange() в gridExtra.Как упорядочить список переменных с использованием grid.arrange?

Как бы это сделать, если количество графиков в plist является переменной?

Это работает: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

, но мне нужно более общее решение. мысли?

+0

Это в '? Grid.arrange' – baptiste

ответ

64

Как об этом:

library(gridExtra) 
n <- length(plist) 
nCol <- floor(sqrt(n)) 
do.call("grid.arrange", c(plist, ncol=nCol)) 

enter image description here

+0

Это хорошо, за исключением того, что функция не может обрабатывать объекты NULL. –

+0

Джош. Я люблю тебя. Прожили 2 часа на этом до сих пор. Не могли бы вы объяснить, почему это не работает: 'grid.arrange (plist [[1: length (plist)]], ncol = nCol))' Я получаю такую ​​ошибку: 'Ошибка в hl.plots [[1 : 12]]: нет такого индекса на уровне 3' Спасибо! – Anto

+1

@Anto Кажется, что с этим кодом несколько ошибок, но тот, который дает вам отображаемую ошибку, вероятно, вызван той же ошибкой, что и здесь: 'x <- list (1,2); х [[3: 1]] '. В более широком смысле используйте нечто вроде 'plist [...]', а не 'plist [[...]]', чтобы выполнить подмножество. А затем используйте 'do.call()', который мы должны использовать, потому что 'grid.arrange()' не настроен, чтобы взять список в качестве первого аргумента. Приветствия, и удачи! –

4

Вы можете использовать grid.arrange() и arrangeGrob() со списками тех пор, пока вы задаете список с помощью grobs = аргумента в каждой функции. Например. в данном примере вы дали:

library(ggplot2) 
library(gridExtra) 
df <- data.frame(x=1:10, y=rnorm(10)) 
p1 <- ggplot(df, aes(x,y)) + geom_point() 
plist <- list(p1,p1,p1,p1,p1) 

grid.arrange(grobs = plist, ncol = 2) ## display plot 
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2)) ## save plot 
5

Для полноты картины (и как этот старый, уже ответил на вопрос has been revived, recently) Я хотел бы добавить раствор, используя cowplot пакет:

cowplot::plot_grid(plotlist = plist, ncol = 2) 

enter image description here

+0

любая идея, почему передача списка графиков с использованием этого кода возвращает эту ошибку: 'Ошибка в ggplot_to_gtable (x): Аргумент должен быть класса« ggplot »или« gtable »' –

+0

Как были сформированы графики? Использование пакета 'ggplot2' или базовой графики? – Uwe

+0

'ggplot2'. 'grid.arrange' почти работал для меня - но, оказывается, мой список сюжетов не заселен. Я разместил вопрос как вопрос: http://stackoverflow.com/questions/43216262/saving-multiple-ggplots-created-in-a-for-loop-to-a-single-plot. Итак, мне интересно, может ли это быть проблемой для коровника –

Смежные вопросы