กำลังบันทึก grid.arrange () พล็อตไปยังไฟล์


141

ฉันพยายามที่จะพล็อตหลายแปลงโดยใช้การจัดพวกเขาโดยใช้ggplot2 grid.arrange()เนื่องจากฉันสามารถหาคนที่อธิบายปัญหาที่แท้จริงได้ฉันจึงอ้างจากคำอธิบายปัญหาจากลิงค์ :

เมื่อฉันใช้ggsave()หลังจากgrid.arrange()นั้นคือ

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

ฉันไม่ได้บันทึกพล็อตกริด แต่เป็น ggplot แต่ละรายการสุดท้าย มีวิธีใดในการบันทึกพล็อตตามที่แสดงโดยgrid.arrange()ใช้ ggsave()หรือสิ่งที่คล้ายกันหรือไม่? นอกเหนือจากการใช้วิธีที่เก่ากว่า

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

ลิงค์เดียวกันให้คำตอบด้านล่าง:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

อย่างไรก็ตามฉันไม่สามารถหาวิธีใช้ggsave()เพื่อบันทึกผลลัพธ์ของการgrid.arrange()โทรในรหัสต่อไปนี้ซึ่งนำมาจากลิงค์ :

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?

6
ใช้png(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie

2
ไม่print(ggplot())?
IRTFM

@DWin ใช่อาจจะ! :-)
Andrie

1
@Andrie สิ่งที่คุณแนะนำใช้ได้ แต่ความละเอียดของภาพต่ำมาก เมื่อฉันบันทึกggplotโดยใช้ครั้งเดียวggsave()ความละเอียดของภาพจะสูงขึ้นมาก มีวิธีการบันทึกการส่งออกของที่grid.arrange()มีความละเอียดสูงที่สุดเท่าที่จะเป็นว่ามันเป็นพล็อตเดียวกับที่บันทึกไว้ggsave()? หากฉันให้ตัวอย่างตัวเลือกpng(...,height=1600, width=2500)ภาพจะดูพร่ามัวมาก
ฉันชอบรหัส

คำตอบ:


149

grid.arrangeดึงโดยตรงบนอุปกรณ์ arrangeGrobในทางกลับกันไม่ได้วาดอะไรเลย แต่ส่งคืน grob gที่คุณสามารถผ่านไปggsave(file="whatever.pdf", g)ได้

เหตุผลที่มันทำงานแตกต่างจากอ็อบเจ็กต์ ggplot โดยที่ค่าเริ่มต้นพล็อตสุดท้ายจะถูกบันทึกหากไม่ได้ระบุไว้คือ ggplot2 ติดตามพล็อตล่าสุดอย่างมองไม่เห็นและฉันไม่คิดว่าgrid.arrangeควรยุ่งกับตัวนับนี้แบบส่วนตัวกับแพ็คเกจ


3
เมื่อฉันลองสิ่งนี้ฉันได้รับข้อผิดพลาดที่แจ้งว่า g ไม่ใช่ประเภทที่ถูกต้อง?
Jack Aidley

@JackAidley ถามคำถามใหม่พร้อมตัวอย่างขั้นต่ำที่สามารถทำซ้ำได้ในตัวและ sessionInfo () ของคุณ (ตรวจสอบให้แน่ใจว่าคุณมี R และแพ็คเกจเวอร์ชันล่าสุด)
baptiste

3
@DaveX โปรดอย่าเผยแพร่ข้อมูลที่ทำให้เข้าใจผิดนี้ plot(g)คือไม่ได้วิธีการที่เหมาะสมในการแสดง gtable ใช้grid.draw(g)แทน
baptiste

@baptiste ขอขอบคุณและขอนํา: หมายเหตุว่าถ้าคุณลองไปดูผลมาจากการg <-arrangeGrob(...)ที่มีprint(g)ให้คุณได้รับข้อความตารางรายชื่อกราฟิกวัตถุมากกว่ากราฟิก พยายามgrid.draw(g)แสดงภาพเป็นภาพกราฟิก -
Dave X

7
ggsave ไม่ทำงานกับ grobs (บางส่วนหรือทั้งหมด) อีกต่อไป
vak

49

ฉันมีปัญหากับข้อเสนอของ babptiste แต่ในที่สุดก็ทำสำเร็จ นี่คือสิ่งที่คุณควรใช้:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

สิ่งนี้ควรใช้งานได้ดี


25

อีกวิธีง่ายๆในการบันทึก grid.ar จัดเป็นไฟล์ pdf คือการใช้ pdf ():

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

อนุญาตให้รวมสิ่งอื่นที่ไม่ใช่ ggplots ในการจัดเรียงเช่นตาราง ...


7

ฉันคิดว่ามันคุ้มค่าที่จะเพิ่มสิ่งนี้ ฉันมีปัญหากับข้างต้นโดย ggsave ทำให้เกิดข้อผิดพลาด: "พล็อตควรเป็นพล็อต ggplot2"

ขอบคุณสำหรับคำตอบนี้: การบันทึกกราฟด้วย ggsave หลังจากใช้ ggplot_build และ ggplot_gtable ฉันมีการแก้ไขโค้ดด้านบน

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

บรรทัดด้านบนจำเป็นในการแก้ไขข้อผิดพลาด

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

ตอนนี้มันใช้งานได้ดีสำหรับฉัน


ฉันต้องการสิ่งนี้ เห็นได้ชัดว่า ggplot2 เวอร์ชันพัฒนาจะลบ class-test-fault เช่นนี้ แต่เวอร์ชัน CRAN ในปัจจุบัน (2015-10-21) ไม่มี
Dave X

2
สิ่งนี้ใช้ได้กับ marrangeGrob สำหรับฉัน แต่ไม่ใช่กับ ArrangeGrob หรือ grid.arrange @DaveX คุณต้องทำอะไรอีกไหมเพื่อให้มันใช้งานได้นอกเหนือจากการแก้ไข ggsave ตามที่แสดงด้านบน ขอบคุณ!
k13

5

คุณไม่จำเป็นต้องใช้ sortGrob คุณสามารถกำหนดผลลัพธ์ของ grid.arrange ให้กับพล็อตโดยตรงและบันทึกโดยใช้ ggsave:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

2

อีกวิธีง่ายๆ: หลังจากที่คุณ grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

คุณทำ dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()

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