Размещение нескольких графиков ggplot на странице

Я генерирую список объектов ggplot внутри цикла следующим образом:

myPlots = list()
for(i in 1:length(maturities)){
  myPlots[[i]] <- ggplot(deltaIR.df, aes(sample = deltaIR.df[,i])) + 
                  stat_qq() + stat_qq_line() + 
                  labs(title=maturities[i],
                  x = "Theoretical (Normal)", 
                  y = "Empirical Distribution")
}

В зависимости от набора данных в myPlots может быть от 4 до 10 графиков. Теперь я хочу распечатать их на одной странице в два ряда и пробовал разные методы с разной степенью успеха. Наиболее перспективным подходом является

library(ggpubr)
grid.arrange(myPlots[[1]], myPlots[[2]], myPlots[[3]], myPlots[[4]], 
             myPlots[[5]], myPlots[[6]], myPlots[[7]], myPlots[[8]], nrow = 2)

Это явно работает, но требует от меня перечисления всех объектов, и я не знаю, сколько объектов будет. Я попытался упростить это, написав

ggarrange(myPlots, nrow = 2)

но получил предупреждение:

Warning message:
In as_grob.default(plot) : Cannot convert object of class list into a grob.

Что я делаю не так, и как я могу это исправить? В идеале простая единственная строка кода будет печатать все графики, хранящиеся в myPlots, в две строки.

заранее спасибо

Томас Филипс


person Thomas Philips    schedule 26.09.2019    source источник


Ответы (4)


ggpubr::ggarrange — это просто оболочка вокруг cowplot::plot_grid().

Но если вы хотите остаться с ggpubr, вы можете продолжать использовать ggarrange. И вам нужно сохранить все ваши графики в списке и использовать аргумент plotlist.

library(ggpubr)
library(ggplot2)
library(purrr)

myplot <- function(color){
    ggplot(iris,aes(x = Sepal.Length, y = Sepal.Width)) + geom_point(color = color)
}
plot_list <- map(c("red","green","blue","black","orange"),myplot)


ggarrange(plotlist = plot_list,nrow = 2,ncol = ceiling(length(plot_list)/2))

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

person yusuzech    schedule 26.09.2019

Вы можете использовать cowplot::plot_grid, чтобы получить это.

Вот пример с поддельными данными:

##List with ten datasets
set.seed(3)
l <- lapply(1:10, function(i)tibble(
  letter = letters,
  values = rnorm(26)
))

##List of ten different plots
plot_list_1 <- lapply(l, function(i)i %>% ggplot(aes(x = values)) + geom_density())

##Display ten plots
cowplot::plot_grid(plotlist = plot_list_1,nrow = 2)

##Display four plots
cowplot::plot_grid(plotlist = plot_list_1[1:4],nrow = 2)

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

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

person Henry Cyranka    schedule 26.09.2019
comment
Аллилуйя - работает как шарм! Меня не поразило, что я должен был явно установить plotlist = myPlots и объявить как nrow, так и ncol. Как только я написал ggarrange(plotlist = myPlots, nrow = 2, ncol = ceiling(length(myPlots)/2)), я получил именно то, что искал. Леночка спасибо за быстрый ответ!!! - person Thomas Philips; 26.09.2019
comment
Без проблем. Не могли бы вы одобрить ответ и проголосовать за него? Спасибо - person Henry Cyranka; 26.09.2019
comment
Готово!. Последний вопрос. Когда я набираю ggarrange(plotlist = myPlots, nrow = 2, ncol = ceiling(length(myPlots)/2)) в консоли в RStudio, я получаю ожидаемые 8 графиков. Однако, если я создаю весь сценарий, цифры не выводятся. Еще больше сбивает с толку то, что если я наведу курсор на строку и нажму «Выполнить», я получу графики. Есть ли дополнительная команда, которую мне нужно выполнить, чтобы она отображалась при запуске сценария? - person Thomas Philips; 27.09.2019
comment
Вероятно, это проблема с устройствами (окнами сюжета). Убедитесь, что вы закрыли все устройства с помощью dev.off() - person Henry Cyranka; 27.09.2019
comment
Я запускаю скрипт с помощью dev.off() ``` rm(list = ls(all = TRUE)) #Очистить все объекты в рабочей области if(!is.null(dev.list()[RStudioGD])) dev. off() #Очистить все графики ```, но не удается отобразить результаты garrange. Когда я запустил строку сам по себе, я впервые получил предупреждение: ``` Предупреждающее сообщение: In doTryCatch(return(expr), name, parentenv, handler) : список отображения перерисовывается не полностью ``` Звенит ли это звоночком ? - person Thomas Philips; 27.09.2019

это работает для меня и похоже на код, который вы уже используете.

library(gridExtra)    
grid.arrange(grobs=myPlots, nrow=2)
person Johannes Stötzer    schedule 26.09.2019
comment
Вы, вероятно, хотите nrow = 2, а не ncol, чтобы соответствовать вопросу - person camille; 27.09.2019

просто добавьте список сюжетов перед «myPlots», чтобы утверждать, что myPlots - это список, как сказано в документации.

ggarrange(список графиков = мои графики, nrow = 2)

person Guangxin Zhang    schedule 08.07.2021