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.