Разместите несколько графиков ggplot на странице - PullRequest
0 голосов
/ 26 сентября 2019

Я создаю список объектов 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, в две строки.

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

Thomas Philips

Ответы [ 3 ]

2 голосов
/ 26 сентября 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)

enter image description here

enter image description here

1 голос
/ 26 сентября 2019

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))

enter image description here

0 голосов
/ 27 сентября 2019

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

library(gridExtra)    
grid.arrange(grobs=myPlots, nrow=2)
...