Bagaimana saya bisa mendapatkan petak ggplot yang 'tidak seimbang'?

94

Dengan grid.arrangesaya dapat mengatur banyak ggplotgambar dalam kotak untuk mencapai gambar multi-panel dengan menggunakan sesuatu seperti:

library(ggplot2)
library(grid)
library(gridExtra)

buat beberapa plot ggplot2, lalu

plot5 <- grid.arrange(plot4, plot1, heights=c(3/4, 1/4), ncol=1, nrow=2)

Bagaimana saya bisa mendapatkan tata letak 2 kolom yang 'tidak seimbang' dengan satu plot di seluruh kolom pertama dan tiga plot di kolom kedua? Saya bermain-main dengan pendekatan 'grid-of-grids' dengan mencoba menggunakan grid.arrangeuntuk memplot satu grid (misalnya plot5, di atas) terhadap plot lain, tetapi memperoleh:

Kesalahan dalam mengaturGrob (..., as.table = as.table, clip = clip, main = main,: input harus grobs!

Memperbarui:

Terima kasih atas sarannya. Saya akan memeriksa viewportsdan grid. Sementara itu, terima kasih kepada @DWin, layOutfungsi dalam paket 'wq' bekerja sangat baik untuk gambar kompilasi di Sweavedokumen saya : masukkan deskripsi gambar di sini

Perbarui 2:

Itu arrangeGrob perintah (seperti yang disarankan oleh @baptiste) juga bekerja dengan baik, dan tampaknya sangat intuitif - setidaknya itu mudah untuk lebar alter dari dua kolom. Ini juga memiliki keuntungan karena tidak membutuhkan paket `wq '.

mis. Ini kode dari file Sweave saya:

<<label=fig5plot, echo=F, results=hide>>=
plot5<-grid.arrange(plot4, arrangeGrob(plot1, plot2, plot3, ncol=1), 
                    ncol=2, widths=c(1,1.2))
@
\begin{figure}[]
    \begin{center}
<<label=fig5,fig=TRUE,echo=T, width=10,height=12>>=
<<fig5plot>>
@
\end{center}
\caption{Combined plots using the `arrangeGrob' command.}
\label{fig:five}
\end{figure}

yang menghasilkan keluaran sebagai berikut: masukkan deskripsi gambar di sini

BTW, Ada yang bilang kenapa '> NA' muncul?

pengguna441706
sumber
Anda mungkin harus menyiapkan area pandang sendiri - grid.arrangemungkin tidak cukup fleksibel (penelusuran stackoverflow untuk "[r] grid viewport")
Ben Bolker
2
@BenBolker Telah mengarahkan Anda ke arah yang bermanfaat menggunakan grid. Lihat juga buku ggplot2 Hadley, Bagian 8.4.2.
Ari B. Friedman
1
@BenBolker grid.arrangedapat digunakan dengan viewports bersarang menggunakan pendampingnya arrangeGrob(pada dasarnya mengembalikan a gTree), seperti pada contoh yang saya berikan di bawah.
baptiste
1
tugas terakhir Anda ke plot5tidak diperlukan karena grid.arrangetidak mengembalikan apa-apa (NULL). Jika Anda ingin menyimpan grob yang dihasilkan, gunakan arrangeGroblagi (dan grid.drawuntuk menampilkannya).
baptiste

Jawaban:

73

grid.arrangemenggambar langsung di perangkat; jika Anda ingin menggabungkannya dengan objek grid lain yang Anda butuhkan arrangeGrob, seperti pada

 p = rectGrob()
 grid.arrange(p, arrangeGrob(p,p,p, heights=c(3/4, 1/4, 1/4), ncol=1),
              ncol=2)

Edit (07/2015): dengan v> 2.0.0 Anda dapat menggunakan layout_matrixargumen,

 grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4)))
baptiste
sumber
6
Bisakah Anda menjelaskan bagaimana cbind(c(1,1,1), c(2,3,4))matriks menjelaskan susunan gambar?
Ron Gejman
5
@RonGejman mudah jika Anda mencetak matriks 3x2 di layar: kolom pertama adalah semua 1, di situlah plot pertama berada, mencakup tiga baris; Kolom kedua berisi plot 2, 3, 4 yang masing-masing menempati satu baris.
baptiste
17

Saya mencoba mengetahuinya dengan grid dan mengira saya telah menurunkannya tetapi akhirnya gagal (meskipun sekarang melihat kode dalam fungsi yang saya kutip di bawah, saya dapat melihat bahwa saya benar-benar dekat ... :-)

Paket 'wq' memiliki layOutfungsi yang akan melakukannya untuk Anda:

p1 <- qplot(mpg, wt, data=mtcars)
layOut(list(p1, 1:3, 1),   # takes three rows and the first column
        list(p1, 1, 2),    # next three are on separate rows
         list(p1, 2,2), 
          list(p1, 3,2))

masukkan deskripsi gambar di sini

IRTFM
sumber
Wow, itu fungsi yang berguna! Saya pikir salin + tempel mungkin telah mengecewakan Anda; maksud Anda untuk g1, g2, dll untuk semua be p1?
joran
3
@joran: Ya. Saya tidak dapat mengingat yang mana dari "tiga kebajikan pemrograman" yang merupakan Kemalasan, tetapi saya tahu itu ada di suatu tempat.
IRTFM
Terima kasih! Bekerja dengan sangat baik. Lihat di atas.
pengguna441706
2

Alternatif lain adalah patchworkpaket oleh Thomas Lin Pedersen.

# install.packages("devtools")
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

Buat beberapa plot.

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + facet_grid(rows = vars(gear))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))

Sekarang atur plotnya.

p1 + (p2 / p3 / p4)

masukkan deskripsi gambar di sini

markus
sumber
1

Ada juga paket multipanelfigure yang layak untuk disebutkan. Lihat juga jawaban ini .

library(ggplot2)
theme_set(theme_bw())

q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
q4 <- ggplot(mtcars) + geom_bar(aes(carb))

library(magrittr)
library(multipanelfigure)

figure1 <- multi_panel_figure(columns = 2, rows = 3, panel_label_type = "upper-roman")

figure1 %<>%
  fill_panel(q1, column = 1, row = 1:3) %<>%
  fill_panel(q2, column = 2, row = 1) %<>%
  fill_panel(q3, column = 2, row = 2) %<>%
  fill_panel(q4, column = 2, row = 3)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
figure1

Dibuat pada 16-07-2018 oleh paket reprex (v0.2.0.9000).

Tung
sumber