'Dengesiz' bir ggplot ızgarası nasıl elde edebilirim?


94

İle grid.arrange, aşağıdaki ggplotgibi bir şey kullanarak çok panelli bir şekil elde etmek için bir ızgarada birden çok figür düzenleyebilirim :

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

bazı ggplot2 grafikleri oluşturun, sonra

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

İlk sütunun tamamında bir grafik ve ikinci sütunda üç grafik içeren 'dengesiz' bir 2 sütun düzeni nasıl elde edebilirim? grid.arrangeBir ızgarayı (örneğin plot5yukarıda) başka bir arsaya göre çizmeye çalışarak 'ızgaralar ızgarası' yaklaşımıyla oynadım, ancak şunu elde ettim :

EditGrob (..., as.table = as.table, clip = clip, main = main,: input, grobs olmalıdır!

Güncelleme:

Tavsiye için teşekkürler. Bakacağım viewportsve grid. Bu arada @DWin sayesinde layOut, 'wq' paketindeki işlev belgemdeki derleme figürü için çok iyi çalıştı Sweave: görüntü açıklamasını buraya girin

Güncelleme 2:

arrangeGrob(Aynı @baptiste önerdiği) komutu da iyi çalışıyor ve çok sezgisel görünüyor - bu iki sütunun alter genişlikleri kolaydı, en azından. Ayrıca wq paketine ihtiyaç duymama avantajına da sahiptir.

örn. Sweave dosyamdaki kod:

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

aşağıdaki çıktıyı üretir: görüntü açıklamasını buraya girin

BTW, Bana neden '> NA' göründüğünü söyleyen var mı?


grid.arrange
Görüntü

2
@BenBolker kullanarak verimli bir yöne işaret etti grid. Ayrıca Hadley'in ggplot2 kitabı, Bölüm 8.4.2'ye bakın.
Ari B. Friedman

1
@BenBolker grid.arrange, aşağıda verdiğim örnekte olduğu gibi yoldaşını kullanarak arrangeGrob(esasen a döndürerek gTree) iç içe geçmiş görünümlerle kullanılabilir .
baptiste

1
hiçbir şey döndürmediği için (NULL) için son atamanız plot5gerekli değildir grid.arrange. Ortaya çıkan grob'u kaydetmek istiyorsanız, arrangeGrobtekrar kullanın (ve grid.drawgörüntülemek için).
baptiste

Yanıtlar:


73

grid.arrangedoğrudan cihaz üzerinde çizim yapar; İhtiyacınız olan diğer ızgara nesneleriyle birleştirmek istiyorsanız arrangeGrob,

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

Düzenleme (07/2015): v> 2.0.0 ile layout_matrixargümanı kullanabilirsiniz ,

 grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4)))

6
cbind(c(1,1,1), c(2,3,4))Matrisin şekillerin dizilişini nasıl tanımladığını açıklayabilir misiniz ?
Ron Gejman

5
@RonGejman, ekrana 3x2 matrisi yazdırırsanız kolaydır: ilk sütun 1'lerin tümüdür, üç satırı kapsayan ilk çizimin yaşadığı yer burasıdır; ikinci sütun, her biri bir satır kaplayan 2, 3, 4 çizimlerini içerir.
baptiste

17

Bunu grid ile bulmayı denedim ve düştüğümü düşündüm ama başarısızlıkla sonuçlandı (şimdi aşağıda alıntı yaptığım fonksiyondaki koda bakmamıza rağmen, gerçekten yakın olduğumu görebiliyorum ... :-)

'Wq' paketinin layOutbunu sizin için yapacak bir işlevi vardır:

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

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


Vay canına, bu kullanışlı bir işlev! Sanırım kopyala + yapıştır, başarısız olmuş olabilir; sizin için demek istedi g1, g2tüm edilecek, vs p1?
joran

3
@joran: Yaptım. "Programlamanın üç erdeminden" hangisinin Tembellik olduğunu hatırlayamıyorum, ama bunun orada bir yerlerde olduğunu biliyorum.
IRTFM

Teşekkürler! Çok güzel çalıştı. Yukarıyı görmek.
user441706

2

Diğer bir alternatif ise patchworkThomas Lin Pedersen'in paketidir.

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

Bazı grafikler oluşturun.

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

Şimdi arazileri düzenleyin.

p1 + (p2 / p3 / p4)

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


1

Ayrıca bahsetmeye değer çoklu şekil paketi de var. Bu yanıta da bakın .

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

2018-07-16 tarihinde reprex paketi (v0.2.0.9000) tarafından oluşturulmuştur .

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.