Grid.arrange kullanarak değişken bir grafik listesini nasıl düzenlerim?


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.

Ben kullanarak araziler düzenlemek istiyorum grid.arrange()içinde gridExtra.

Çizimlerin sayısı plistdeğişkense bunu nasıl yaparım ?

Bu çalışıyor: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

ama daha genel bir çözüme ihtiyacım var. düşünceler?

Yanıtlar:


139

Buna ne dersin:

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

görüntü açıklamasını buraya girin


Bu güzel, ancak işlev NULL nesneleri işleyemez.
— Roman Luštrik

Josh. Seni seviyorum. Şimdiye kadar bunun için 2 saat geçirdim. Bunun neden işe yaramadığını açıklamak ister misiniz: grid.arrange(plist[[1:length(plist)]], ncol = nCol))Şuna benzer bir hata alıyorum: Error in hl.plots[[1:12]] : no such index at level 3Teşekkürler!
— Anto

2
@Anto bu kodu yanlış birkaç şey var gibi, ama burada gösterildiği gibi size görüntülenen hatayı veren biri muhtemelen hata aynı tür kaynaklanır: x <- list(1,2); x[[3:1]]. Daha genel olarak, altkümenizi yapmak plist[...]yerine gibi bir şey kullanın plist[[...]]. Ve sonra kullanmamız do.call()gereken, çünkü grid.arrange()bir listeyi ilk argüman olarak alacak şekilde ayarlanmamış. Şerefe ve iyi şanslar!
— Josh O'Brien

31

Her işlevdeki bağımsız değişkeni kullanarak listeyi belirttiğiniz sürece grid.arrange()ve arrangeGrob()listelerinde kullanabilirsiniz grobs =. Örneğin verdiğiniz örnekte:

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
Bu cevabı bulmam çok uzun sürdü ... teşekkürler! Bu en basit olanıdır.
— Matt L.

16

Bütünlük uğruna (ve bu eski, önceden cevaplanmış soru yakın zamanda yeniden canlandırıldığı için) cowplotpaketi kullanarak bir çözüm eklemek istiyorum :

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

görüntü açıklamasını buraya girin


Bu kodu kullanarak bir Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
— grafik listesi geçirmenin

Arsalar nasıl oluşturuldu? Kullanılması ggplot2paket veya baz grafik?
— Uwe

ggplot2. grid.arrangeneredeyse benim için çalıştı - ancak, arsa listemin doldurulmadığı ortaya çıktı. Sorunu bir soru olarak yayınladım: stackoverflow.com/questions/43216262/… . O yanı cowplot için sorun olabilirdi Yani, eğer merak ediyorum
— geog_newbie

10

Sorunun özellikle gridExtra paketini kullandığını biliyorum , ancak patchwork paketindeki wrap_plotsişlev, değişken uzunluk listesini işlemek için harika bir yoldur:

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)

görüntü açıklamasını buraya girin

Bununla ilgili yararlı bir şey, kaç tane sütunun gerekli olduğunu belirtmenize gerek olmaması ve sütun ve satır sayılarını eşit tutmayı hedeflemenizdir. Örneğin:

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

Patchwork paketi hakkında daha fazla bilgiyi burada bulabilirsiniz


Burada bahsettiğiniz paketi yükleyemiyorum
— baxx

Yukarıda açıklanan kurulum hattını çalıştırmayı denediniz devtools::install_github("thomasp85/patchwork")mi?
— Michael Harper

Teşekkür ederim ben yapmadım RStudio'dan yüklemeyi kullanmayı denedim.
— baxx

1
Paket henüz CRAN'da mevcut değil, bu yüzden GitHub aracılığıyla yüklemeniz gerekiyor. Umarım bu, mükemmel bir paket olduğu için daha uzun süre geçerli olmayacaktır!
— Michael Harper

1

Tüm çizimleri tek bir sayfaya sığdırmak için aşağıdaki gibi sütun ve satır sayısını hesaplayabilirsiniz:

x = length(plots)

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

Çoğu çoklu çizim fonksiyonunun bağımsız değişken olarak ncol ve nrow'a sahip olması nedeniyle, bunları oraya koyabilirsiniz. Ggpubr'dan ggarrange'ı seviyorum.

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

Bu, sütunlardan daha fazla satırı tercih eder, bu nedenle tersini istiyorsanız ters çevirin. Yani 6 parsel için 3 sıra ve 2 sütun verecek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.