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