Как я могу заставить большое количество фигур ggplot печататься в два столбца в R, не сглаживая их?

#r #loops #ggplot2

#r #циклы #ggplot2

Вопрос:

Например, если вы выполните следующее, вы увидите, что grid.arrange сжимает все 20 графиков ggplot в один рисунок, делая их нечитаемыми.

Есть ли способ создать высокую фигуру, которая может содержать десятки таких графиков, или есть простой способ заставить их печатать по четыре за раз 2 на 2 с помощью grid.упорядочить вывод до тех пор, пока в списке не останется больше?

Количество фигур в списке может быть кратным или не кратным четырем. Например, если бы у меня было 9 графиков в списке, нужно было бы напечатать изображение 2 на 2, другое изображение 2 на 2, а затем последнее.

 library(gridExtra)
library(ggplot2)

#Create the dataframe.
df<-data.frame(matrix(rexp(200), 10))
colnames(df)<-c("aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj")

#Create the ggplots in a loop.
hlist<-list()
for(i in 1:ncol(df)){
  
  hplot<-eval(substitute(ggplot(df[i], aes(x=df[,i]))   geom_histogram(),list(i = i)))
  
  hlist[[i]]<-hplot
}

#Print the plots.
grid.arrange(grobs = hlist, ncol = 2)
  

Ответ №1:

Попробуйте этот подход, используя patchwork для создания графиков 2×2, создающих индексы после сохранения всех графиков в новом списке. С помощью индексных векторов вы можете задать цикл и использовать wrap_plots() его для их упорядочивания. Здесь код:

 library(ggplot2)
library(patchwork)

#Create the dataframe.
df<-data.frame(matrix(rexp(200), 10))
colnames(df)<-c("aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj")

#Create the ggplots in a loop.
hlist<-list()
for(i in 1:ncol(df)){
  
  hplot<-eval(substitute(ggplot(df[i], aes(x=df[,i]))   geom_histogram(),list(i = i)))
  
  hlist[[i]]<-hplot
}
#Print the plots.
vec <- seq(1,length(hlist),by=4)
vec2 <- seq(4,length(hlist),by=4)
#New list
hlist2 <- list()
#Loop
for(i in 1:length(vec))
{
  hlist2[[i]] <- wrap_plots(hlist[vec[i]:vec2[i]],ncol = 2)
}
#Arrange
finalplot <- wrap_plots(hlist2,ncol = 2)
  

Вывод:

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

Все графики 2×2 хранятся в hlist2 .

Ответ №2:

Я нашел решение для создания списка страниц графика, а затем для печати каждой страницы с помощью marrangeGrob:

 library(gridExtra)
library(ggplot2)

#Create the dataframe.
df<-data.frame(matrix(rexp(200), 10))
colnames(df)<-c("aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj")

#Create the ggplots in a loop.
hlist<-list()
for(i in 1:ncol(df)){
  
  hplot<-eval(substitute(ggplot(df[i], aes(x=df[,i]))   geom_histogram(),list(i = i)))
  
  hlist[[i]]<-hplot
}

#Uses marrangeGrob to first store them in multiple pages.
glist<-marrangeGrob(hlist, nrow=2, ncol=2)

#Print each page one at a time until through all pages.
for(i in 1:length(glist)){grid.arrange(grobs = glist[i], ncol = 1)}