Bagaimana cara menyusun daftar variabel plot menggunakan grid.arrange?

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.

Saya ingin mengatur plot menggunakan grid.arrange()in gridExtra.

Bagaimana saya melakukan ini jika jumlah plot dalam plistvariabel?

Ini bekerja: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

tetapi saya membutuhkan solusi yang lebih umum. pikiran?

Maiasaura
sumber

Jawaban:

139

Bagaimana dengan ini:

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

masukkan deskripsi gambar di sini

Josh O'Brien
sumber
Ini bagus, kecuali fungsinya tidak dapat menangani objek NULL.
Roman Luštrik
Josh. Aku cinta kamu. Telah menghabiskan 2 jam untuk ini sampai sekarang. Maukah Anda menjelaskan mengapa ini tidak berhasil: grid.arrange(plist[[1:length(plist)]], ncol = nCol))Saya mendapatkan kesalahan seperti ini: Error in hl.plots[[1:12]] : no such index at level 3Terima kasih!
Anto
2
@Anto Tampaknya ada beberapa hal yang salah dengan kode itu, tapi yang memberikan Anda kesalahan ditampilkan mungkin disebabkan oleh jenis yang sama kesalahan seperti yang ditunjukkan di sini: x <- list(1,2); x[[3:1]]. Lebih luas lagi, gunakan sesuatu seperti plist[...]daripada plist[[...]]melakukan subset Anda. Dan kemudian gunakan do.call(), yang harus kita gunakan karena grid.arrange()tidak diatur untuk mengambil daftar sebagai argumen pertamanya. Cheers, dan semoga sukses!
Josh O'Brien
31

Anda bisa menggunakan grid.arrange()dan arrangeGrob()dengan daftar selama Anda menentukan daftar menggunakan grobs =argumen di setiap fungsi. Misalnya dalam contoh yang Anda berikan:

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
Michael Ohlrogge
sumber
1
Butuh waktu terlalu lama untuk menemukan jawaban ini ... terima kasih! Ini yang paling sederhana.
Matt L.
16

Demi kelengkapan (dan karena pertanyaan lama yang sudah dijawab ini dihidupkan kembali, baru-baru ini ) saya ingin menambahkan solusi menggunakan cowplotpaket:

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

masukkan deskripsi gambar di sini

Uwe
sumber
ada ide mengapa melewatkan daftar plot menggunakan kode ini mengembalikan kesalahan ini: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie
Bagaimana plot dibuat? Menggunakan ggplot2paket atau grafik dasar?
Uwe
ggplot2. grid.arrangehampir berhasil untuk saya - tetapi, ternyata daftar plot saya tidak terisi. Saya memposting masalah sebagai pertanyaan: stackoverflow.com/questions/43216262/… . Jadi, saya bertanya-tanya apakah itu bisa menjadi masalah untuk cowplot juga
geog_newbie
10

Saya tahu pertanyaannya secara khusus menyatakan menggunakan paket gridExtra , tetapi wrap_plotsfungsi dari paket tambal sulam adalah cara terbaik untuk menangani daftar panjang variabel:

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)

masukkan deskripsi gambar di sini

Hal yang berguna tentang itu adalah Anda tidak perlu menentukan berapa banyak kolom yang diperlukan, dan akan bertujuan untuk menjaga jumlah kolom dan baris tetap sama. Sebagai contoh:

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

Cari tahu lebih lanjut tentang paket tambal sulam di sini

Michael Harper
sumber
Sepertinya saya tidak dapat menginstal paket yang Anda sebutkan di sini
baxx
Sudahkah Anda mencoba menjalankan jalur instalasi yang dikomentari di atas devtools::install_github("thomasp85/patchwork")?
Michael Harper
Terima kasih, saya tidak. Saya baru saja mencoba menggunakan penginstalan dari RStudio.
baxx
1
Paket ini belum tersedia di CRAN, jadi Anda harus menginstalnya melalui GitHub. Mudah-mudahan ini tidak akan terjadi lebih lama lagi karena ini adalah paket yang luar biasa!
Michael Harper
1

Untuk menyesuaikan semua plot dalam satu halaman, Anda dapat menghitung jumlah kolom dan baris seperti ini:

x = length(plots)

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

Karena sebagian besar fungsi plotting memiliki ncol dan nrow sebagai argumen, Anda dapat meletakkannya di sana. Saya suka ggarrange dari ggpubr.

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

Ini mendukung lebih banyak baris daripada kolom, jadi sebaliknya jika Anda menginginkan yang sebaliknya. Yaitu untuk 6 plot maka akan memberikan 3 baris dan 2 kolom bukan sebaliknya.

Adam Waring
sumber