Як упорядкувати змінний список ділянок за допомогою grid.arrange?


92
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.

Як я можу це зробити, якщо кількість ділянок у plistє змінною?

Це працює: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

але мені потрібно більш загальне рішення. думки?

Відповіді:


139

Як щодо цього:

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

введіть тут опис зображення


Це приємно, за винятком того, що функція не може обробляти NULL-об'єкти.
Роман Луштрік

Джош. Я тебе люблю. До цього часу витратив на це 2 години. Поясніть, чому це не працює: grid.arrange(plist[[1:length(plist)]], ncol = nCol))Я отримую таку помилку: Error in hl.plots[[1:12]] : no such index at level 3Дякую!
Анто

2
@Anto Там , здається, кілька речей неправильно з цим кодом, але один дає вам відображається помилку, ймовірно , викликано таким же помилка , як показано тут: x <- list(1,2); x[[3:1]]. Якщо говорити ширше, скористайтеся чимось подібним, plist[...]а не plist[[...]]виконуйте піднабір. А потім використання do.call(), яке ми повинні використовувати, оскільки grid.arrange()воно не налаштоване на прийняття списку як першого аргументу. Вітаємо, і щастя вам!
Джош О'Брайен

31

Ви можете використовувати 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

1
Надто довго я знайшов цю відповідь ... дякую! Це найпростіший.
Matt L.

16

Для повноти (і оскільки це старе, на яке вже було дано відповідь , нещодавно було відроджено ), я хотів би додати рішення, використовуючи cowplotпакет:

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

введіть тут опис зображення


будь-яка ідея, чому передача списку ділянок за допомогою цього коду повертає цю помилку: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie

Як генерували ділянки? Використовуєте ggplot2пакет або базову графіку?
Уве

ggplot2. grid.arrangeмайже працював у мене - але, виявляється, мій список ділянок не заповнюється. Я опублікував проблему як запитання: stackoverflow.com/questions/43216262/… . Отже, мені цікаво, чи це могло бути проблемою і для коров’ячої ділянки
geog_newbie

10

Я знаю, що питання конкретно говорить про використання пакета gridExtra , але wrap_plotsфункція з пакета печворк - це чудовий спосіб обробити список змінної довжини:

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

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

wrap_plots(plist)

введіть тут опис зображення

Корисно в цьому те, що вам не потрібно вказувати, скільки стовпців потрібно, а прагнутиме дотримуватися рівності кількості стовпців і рядків. Наприклад:

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

Дізнайтеся більше про печворк- пакет тут


Я не можу встановити пакет, про який ви згадали тут,
baxx

Ви пробували запустити рядок інсталяції, коментований вище devtools::install_github("thomasp85/patchwork")?
Michael Harper

Дякую, я не зробив. Я просто спробував використати установку з RStudio.
baxx

1
Пакет поки недоступний для CRAN, тому вам доведеться встановити його через GitHub. Будемо сподіватися, що так буде не довше, хоча це чудовий пакет!
Michael Harper

1

Щоб вмістити всі графіки на одній сторінці, можна розрахувати кількість стовпців і рядків таким чином:

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

Оскільки більшість функцій побудови графіків використовують ncol і nrow як аргументи, ви можете просто помістити їх туди. Мені подобається ggarrange від ggpubr.

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

Це надає перевагу більшій кількості рядків, ніж стовпців, тому зворотне, якщо ви хочете протилежного. Тобто для 6 ділянок це дасть 3 рядки і 2 стовпці не навпаки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.