ฉันจะได้รับ ggplots ตาราง 'ไม่สมดุล' ได้อย่างไร?


94

ด้วยgrid.arrangeฉันสามารถจัดเรียงggplotตัวเลขหลายตัวในตารางเพื่อให้ได้รูปหลายแผงโดยใช้สิ่งต่างๆเช่น:

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

สร้าง ggplot2 บางแปลงจากนั้น

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

ฉันจะได้รับเลย์เอาต์ 2 col ที่ 'ไม่สมดุล' กับหนึ่งพล็อตใน col แรกทั้งหมดและสามพล็อตใน col ที่สองได้อย่างไร ฉันเล่นด้วยวิธี 'กริด - กริด' โดยพยายามใช้grid.arrangeเพื่อพล็อตกริดหนึ่ง (เช่นplot5ด้านบน) กับพล็อตอื่น แต่ได้รับ:

เกิดข้อผิดพลาดในการจัดเรียง (... , as.table = as.table, clip = clip, main = main,: input ต้องเป็น grobs!

อัปเดต:

ขอบคุณสำหรับคำแนะนำ. ผมจะมองเข้าไปในและviewports gridในขณะเดียวกันขอบคุณ @DWin layOutฟังก์ชันในแพ็คเกจ 'wq' ทำงานได้ดีมากสำหรับรูปรวบรวมในSweaveเอกสารของฉัน: ป้อนคำอธิบายภาพที่นี่

อัปเดต 2:

arrangeGrobคำสั่ง (แนะนำโดย @baptiste) ยังทำงานได้ดีและดูเหมือนง่ายมาก - อย่างน้อยมันก็เป็นเรื่องง่ายที่จะแก้ไขความกว้างของทั้งสองคอลัมน์ นอกจากนี้ยังมีประโยชน์ที่จะไม่ต้องใช้แพ็คเกจ `` wq '

เช่นนี่คือรหัสจากไฟล์ Sweave ของฉัน:

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

ซึ่งสร้างผลลัพธ์ต่อไปนี้: ป้อนคำอธิบายภาพที่นี่

BTW มีใครบอกฉันว่าทำไม '> NA' จึงปรากฏขึ้น?


คุณอาจต้องตั้งค่าวิวพอร์ตด้วยตัวเอง - grid.arrangeอาจไม่ยืดหยุ่นเพียงพอ (ค้นหา stackoverflow สำหรับ "[r] grid viewport")
Ben Bolker

2
@BenBolker gridได้ชี้ให้คุณในทิศทางที่มีผลใช้ ดูหนังสือ ggplot2 ของ Hadley ตอน 8.4.2 ด้วย
Ari B. Friedman

1
@BenBolker grid.arrangeสามารถใช้กับวิวพอร์ตที่ซ้อนกันได้โดยใช้คู่หูarrangeGrob(โดยพื้นฐานแล้วจะส่งคืน a gTree) ดังตัวอย่างที่ฉันให้ไว้ด้านล่าง
baptiste

1
plot5ไม่จำเป็นต้องมอบหมายงานสุดท้ายของคุณให้เป็นgrid.arrangeผลตอบแทน (NULL) หากคุณต้องการบันทึกผล grob ให้ใช้arrangeGrobอีกครั้ง (และgrid.drawเพื่อแสดง)
baptiste

คำตอบ:


73

grid.arrangeดึงโดยตรงบนอุปกรณ์ หากคุณต้องการรวมเข้ากับวัตถุกริดอื่น ๆ ที่คุณต้องการarrangeGrobเช่นเดียวกับใน

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

แก้ไข (07/2015): ด้วย v> 2.0.0 คุณสามารถใช้layout_matrixอาร์กิวเมนต์

 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))เมทริกซ์อธิบายการจัดเรียงตัวเลขได้อย่างไร?
Ron Gejman

5
@RonGejman มันง่ายมากถ้าคุณพิมพ์เมทริกซ์ 3x2 บนหน้าจอ: คอลัมน์แรกคือ 1s ทั้งหมดนั่นคือที่ที่พล็อตแรกมีชีวิตอยู่ซึ่งครอบคลุมทั้งสามแถว คอลัมน์ที่สองประกอบด้วยพล็อต 2, 3, 4 แต่ละอันครอบครองหนึ่งแถว
baptiste

17

ฉันพยายามหามันด้วยเส้นตารางและคิดว่าฉันทำมันลงแล้ว แต่ก็ล้มเหลว (แม้ว่าตอนนี้ดูรหัสในฟังก์ชั่นที่ฉันอ้างถึงด้านล่างฉันจะเห็นว่าฉันอยู่ใกล้จริงๆ ... :-)

แพ็คเกจ 'wq' มีlayOutฟังก์ชันที่จะทำเพื่อคุณ:

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

ป้อนคำอธิบายภาพที่นี่


ว้าวเป็นฟังก์ชันที่มีประโยชน์! ฉันคิดว่าการคัดลอก + วางอาจทำให้คุณล้มเหลว คุณไม่ได้หมายถึงg1, g2ฯลฯ จะเป็นทั้งหมดp1?
joran

3
@joran: ฉันทำ. ฉันจำไม่ได้ว่า "คุณธรรมสามประการของการเขียนโปรแกรม" ข้อใดคือความเกียจคร้าน แต่ฉันรู้ว่ามีอยู่ที่ไหนสักแห่ง
IRTFM

ขอบคุณ! ทำงานได้ดีมาก ดูด้านบน.
user441706

2

อีกทางเลือกหนึ่งคือpatchworkแพ็คเกจของ Thomas Lin Pedersen

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

สร้างพล็อตบางส่วน

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

ตอนนี้จัดแปลง

p1 + (p2 / p3 / p4)

ป้อนคำอธิบายภาพที่นี่


1

นอกจากนี้ยังมีแพ็คเกจหลายรูปแบบที่ควรค่าแก่การกล่าวถึง ดูคำตอบนี้ด้วย

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 โดยแพ็คเกจ reprex (v0.2.0.9000)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.