ฉันจะจัดเรียงรายการตัวแปรของแปลงโดยใช้ 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.

ฉันต้องการจัดแปลงโดยใช้grid.arrange()ในgridExtra.

ฉันจะทำสิ่งนี้ได้อย่างไรหากจำนวนพล็อตในplistเป็นตัวแปร

ใช้งานได้: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

แต่ฉันต้องการวิธีแก้ปัญหาทั่วไปมากกว่านี้ ความคิด?

คำตอบ:


139

แล้วสิ่งนี้ล่ะ:

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

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


นี่เป็นสิ่งที่ดียกเว้นว่าฟังก์ชันไม่สามารถจัดการกับวัตถุ NULL ได้
Roman Luštrik

จอช. ผมรักคุณ. ใช้เวลา 2 ชั่วโมงในการนี้จนถึงขณะนี้ คุณช่วยอธิบายได้ไหมว่าเหตุใดจึงใช้ไม่ได้: grid.arrange(plist[[1:length(plist)]], ncol = nCol))ฉันได้รับข้อผิดพลาดดังนี้Error in hl.plots[[1:12]] : no such index at level 3ขอบคุณ!
Anto

2
@Anto ดูเหมือนจะมีหลายสิ่งที่ผิดปกติกับรหัสที่ x <- list(1,2); x[[3:1]]แต่อย่างหนึ่งที่ให้คุณแสดงข้อผิดพลาดที่อาจเกิดจากการเรียงกันของข้อผิดพลาดจะแสดงที่นี่: ในวงกว้างให้ใช้บางสิ่งเช่นplist[...]แทนที่จะใช้plist[[...]]การตั้งค่าย่อยของคุณ จากนั้นใช้do.call()ซึ่งเราต้องใช้เนื่องจากgrid.arrange()ไม่ได้ตั้งค่าให้ใช้รายการเป็นอาร์กิวเมนต์แรก ไชโยและขอให้โชคดี!
Josh O'Brien

32

คุณสามารถใช้grid.arrange()และarrangeGrob()กับรายการได้ตราบเท่าที่คุณระบุรายการโดยใช้grobs =อาร์กิวเมนต์ในแต่ละฟังก์ชัน เช่นในตัวอย่างที่คุณให้ไว้:

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
ใช้เวลานานเกินไปในการค้นหาคำตอบนี้ ... ขอบคุณ! นี่เป็นวิธีที่ง่ายที่สุด
Matt L.

16

เพื่อความสมบูรณ์ (และเมื่อเร็ว ๆ นี้คำถามที่ตอบแล้วได้รับการฟื้นฟูเมื่อเร็ว ๆ นี้ ) ฉันต้องการเพิ่มโซลูชันโดยใช้cowplotแพ็คเกจ:

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

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


ความคิดใด ๆ ว่าทำไมการส่งรายการแปลงโดยใช้รหัสนี้ส่งกลับข้อผิดพลาดนี้: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie

แผนการสร้างขึ้นได้อย่างไร? ใช้ggplot2แพคเกจหรือกราฟิกพื้นฐาน?
Uwe

ggplot2. grid.arrangeเกือบจะได้ผลสำหรับฉัน - แต่ปรากฎว่ารายการแปลงของฉันไม่ได้รับการเติมข้อมูล ฉันโพสต์ปัญหานี้เป็นคำถาม stackoverflow.com/questions/43216262/… . ดังนั้นฉันจึงสงสัยว่านั่นอาจเป็นปัญหาสำหรับ cowplot ด้วยหรือไม่
geog_newbie

10

ฉันรู้ว่าคำถามระบุโดยเฉพาะโดยใช้ แพ็คเกจgridExtraแต่wrap_plotsฟังก์ชันจากแพ็คเกจการเย็บปะติดปะต่อกันเป็นวิธีที่ยอดเยี่ยมในการจัดการรายการความยาวตัวแปร:

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)

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

สิ่งที่มีประโยชน์คือคุณไม่จำเป็นต้องระบุจำนวนคอลัมน์ที่ต้องการและจะพยายามรักษาจำนวนคอลัมน์และแถวให้เท่ากัน ตัวอย่างเช่น:

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับแพ็คเกจการเย็บปะติดปะต่อกันได้ที่นี่


ฉันไม่สามารถติดตั้งแพ็คเกจที่คุณพูดถึงที่นี่ได้
baxx

คุณได้ลองเรียกใช้สายการติดตั้งที่แสดงความคิดเห็นไว้ด้านบนdevtools::install_github("thomasp85/patchwork")หรือไม่
Michael Harper

ขอบคุณฉันไม่ได้ ฉันเพิ่งลองใช้การติดตั้งจาก RStudio
baxx

1
แพคเกจนี้ยังไม่พร้อมใช้งานบน CRAN ดังนั้นคุณต้องติดตั้งผ่าน GitHub หวังว่าจะไม่เป็นเช่นนั้นนานกว่านี้เพราะเป็นแพ็คเกจที่ยอดเยี่ยม!
Michael Harper

1

เพื่อให้พอดีกับพล็อตทั้งหมดในหน้าเดียวคุณสามารถคำนวณจำนวนคอลัมน์และแถวได้ดังนี้:

x = length(plots)

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

เนื่องจากฟังก์ชันการพล็อตหลายรายการส่วนใหญ่มี ncol และ nrow เป็นอาร์กิวเมนต์คุณสามารถใส่สิ่งเหล่านี้ลงในนั้นได้ ฉันชอบ ggarrange จาก ggpubr

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

สิ่งนี้ชอบแถวมากกว่าคอลัมน์ดังนั้นให้ย้อนกลับถ้าคุณต้องการตรงข้าม เช่นสำหรับ 6 พล็อตจะให้ 3 แถวและ 2 คอลัมน์ไม่ใช่ทางอื่น

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