จะบันทึกพล็อตเป็นอิมเมจบนดิสก์ได้อย่างไร?


304

ฉันวางแผนการถดถอยเชิงเส้นอย่างง่ายโดยใช้อาร์ฉันต้องการบันทึกภาพนั้นเป็น PNG หรือ JPEG เป็นไปได้ไหมที่จะทำโดยอัตโนมัติ? (ผ่านรหัส)

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


บางทีคำถามนี้ควรได้รับการแก้ไขเพื่อถามเกี่ยวกับสถานการณ์ที่แตกต่างกันสองสถานการณ์: อันดับแรกคุณอาจทำงานแบบโต้ตอบและได้สร้างโครงเรื่องที่ดีที่คุณต้องการบันทึก หรืออย่างที่สองคุณยังไม่เห็นพล็อตใด ๆ และคุณต้องการเขียนลงดิสก์โดยตรงโดยไม่ต้องดูก่อน - นี่จะสมเหตุสมผลถ้าคุณเขียนสคริปต์เพื่อสร้างพล็อตให้คุณมากมาย ฉันจะแก้ไขทันที
Aaron McDaid

คำตอบ:


376

มีคำถามที่เกี่ยวข้องกันสองคำถามและคำตอบสำหรับแต่ละคำถาม


1. รูปภาพจะถูกสร้างขึ้นในอนาคตในสคริปต์ของฉันฉันจะบันทึกลงดิสก์ได้อย่างไร

ในการบันทึกพล็อตคุณต้องทำสิ่งต่อไปนี้:

  1. เปิดอุปกรณ์ที่ใช้png(), bmp(), pdf()หรือคล้ายกัน
  2. พล็อตโมเดลของคุณ
  3. ปิดอุปกรณ์โดยใช้ dev.off()

ตัวอย่างโค้ดสำหรับบันทึกพล็อตไปยังpngไฟล์:

fit <- lm(some ~ model)

png(filename="your/file/location/name.png")
plot(fit)
dev.off()

นี้ได้อธิบายไว้ใน (รวม) หน้าความช่วยเหลือสำหรับรูปแบบกราฟิก?png, ?bmp, ?jpegและเช่นเดียวกับในหน้าแยกต่างหากสำหรับความช่วยเหลือ?tiff?pdf

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


โปรดทราบว่าถ้าพล็อตของคุณจะทำโดยการอย่างใดอย่างหนึ่งlatticeหรือggplot2คุณต้องชัดเจนพิมพ์พล็อต ดูคำตอบที่อธิบายรายละเอียดเพิ่มเติมและเชื่อมโยงไปยังคำถามที่พบบ่อย R: qplot ของ ggplot ไม่ได้ดำเนินการเกี่ยวกับการจัดหา


2. ขณะนี้ฉันกำลังดูโครงเรื่องบนหน้าจอของฉันและฉันต้องการคัดลอก 'ตามสภาพ' ไปยังดิสก์

dev.print(pdf, 'filename.pdf')

สิ่งนี้ควรคัดลอกรูปภาพอย่างสมบูรณ์โดยคำนึงถึงการปรับขนาดที่คุณทำกับหน้าต่างแบบโต้ตอบ คุณสามารถเช่นเดียวกับในส่วนแรกของคำตอบนี้แทนpdfกับประเภทไฟล์อื่น ๆ pngเช่น


4
หากคุณไม่ได้ตั้งค่าเส้นทางเช่น png (filename = "name.png") คุณสามารถทราบไดเรกทอรีการบันทึกด้วยgetwd()
JuanPablo

2
dev.printฉันได้ขยายคำตอบนี้จะรวมถึงการอ้างอิงถึง มีสองคำถามที่เกี่ยวข้องอย่างใกล้ชิดซึ่งฉันคิดว่าต้องการคำตอบที่แตกต่างกัน คำถามย่อยที่สองนั้นเป็นคำถามที่ว่า "ฉันจะบันทึกรูปภาพที่ได้วางแผนไว้บนหน้าจอของฉันได้อย่างไร?" ขออภัยหากการแก้ไขของฉันไม่ดีนักอย่าลังเลที่จะปรับปรุงการแก้ไขของฉัน
Aaron McDaid

ฉันจะทำสิ่งนี้ได้อย่างไรเมื่อ R ขอให้มี "การเลือก"? ตัวอย่างเช่นถ้าผมใช้และm3=garchFit(~arma(3,0)+garch(1,1)) plot(m3)
jacob

3
ฉันจะบันทึกตัวเลขด้วย dpi = 3000 ได้อย่างไร
Abhishek

2
8 ปีที่ใช้ R โดยไม่รู้ตัวฉันสามารถบันทึก dev ที่เปิดบนหน้าจอเป็นไฟล์ได้ ฉันเดาว่าฉันไม่ต้องการสิ่งนั้น ... แต่ขอบคุณมาก: D
Simon C.

82

หากคุณต้องการเห็นพล็อตใน R ตัวเลือกอื่นคือdev.copy:

X11 ()
plot (x,y)

dev.copy(jpeg,filename="plot.jpg");
dev.off ();

หากคุณมีหน้าต่างพล็อตมากเกินไปใน R ให้ใช้graphics.off()เพื่อปิดหน้าต่างพล็อตทั้งหมด


2
คำตอบที่ดี! สิ่งนี้ช่วยให้คุณสามารถทดลองแปลงผ่าน X ได้จนกว่าคุณจะพอใจกับผลลัพธ์แล้วบันทึกลงในจุดนั้น นี่เป็นโหมดการทำงานที่สะดวกที่สุด
Aaron McDaid

3
dev.printมันดีกว่าที่มันจะคัดลอกภาพจากหน้าจออย่างแน่นอน dev.copyบังคับให้ทุกภาพเป็นสี่เหลี่ยมโดยปริยาย สิ่งนี้น่าผิดหวังหากคุณตั้งค่าทุกอย่างแบบโต้ตอบได้ดี
Aaron McDaid

4
ฉันใช้dev.print()กับพารามิเตอร์ความกว้างและความสูงเพื่อกำหนดขนาด เช่น dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
สกอตต์

72

หากคุณใช้วิธีที่ต้องการของการประหยัดคือการใช้งานggplot2 ggsaveก่อนอื่นคุณต้องลงจุดหลังจากสร้างจุดที่คุณเรียกว่าggsave:

ggplot(...)
ggsave("plot.png")

รูปแบบของภาพนั้นพิจารณาจากนามสกุลที่คุณเลือกสำหรับชื่อไฟล์ พารามิเตอร์เพิ่มเติมสามารถส่งผ่านไปggsaveสะดุดตาwidth, และheightdpi


สิ่งนี้ใช้ได้ดีในวงวน dev.off ไม่ได้ผลสำหรับฉัน
princelySid

ส่วนต่าง ๆ ของข้อนี้เป็น API ที่สอดคล้องกันและไม่จำเป็นต้องยุ่งกับการเปิดและปิดอุปกรณ์
34932

โซลูชั่นdevนี้ทำงานบนเครื่องเสมือนที่ไม่มีอุปกรณ์กราฟิก
miguelmorin

ฉันหวังว่าจะมีวิธีที่ทรงพลัง แต่เรียบง่ายเช่นนี้สำหรับทุกแปลงใน R. อย่างไรก็ตามการลงคะแนนของฉันไปที่นี่
SilSur

1
ยังคงใช้งานได้เกือบ 7 ปี! ขอบคุณ.
Nick

30

แบบนี้

png('filename.png')
# make plot
dev.off()

หรือสิ่งนี้

# sometimes plots do better in vector graphics
svg('filename.svg')
# make plot
dev.off()

หรือสิ่งนี้

pdf('filename.pdf')
# make plot
dev.off()

และอาจอื่น ๆ ด้วย รายการทั้งหมดอยู่ในรายการช่วยเหลือในหน้าช่วยเหลือ


มีวิธีใดบ้างที่ R จะอนุมานนามสกุลไฟล์โดยอัตโนมัติ (เช่นตามฟังก์ชั่น) ดูเหมือนน่าเบื่อที่จะต้องเปลี่ยนชื่อไฟล์รวมถึงฟังก์ชั่นที่ใช้
Bonlenfum

11

สำหรับคำถามแรกฉันพบว่าdev.printดีที่สุดเมื่อทำงานแบบโต้ตอบ ขั้นแรกให้คุณตั้งค่าพล็อตของคุณด้วยสายตาและเมื่อคุณพอใจกับสิ่งที่คุณเห็นคุณสามารถขอให้ R บันทึกพล็อตปัจจุบันลงในดิสก์

dev.print(pdf, file="filename.pdf");

คุณสามารถแทนที่pdfด้วยรูปแบบอื่น ๆ pngเช่น

นี่จะเป็นการคัดลอกรูปภาพตามที่คุณเห็นบนหน้าจอ ปัญหาdev.copyคือภาพมักจะแตกต่างกันและจำไม่ได้ว่าขนาดของหน้าต่างและอัตราส่วนกว้างยาว - มันบังคับให้พล็อตให้เป็นสี่เหลี่ยมโดยปริยาย

สำหรับคำถามที่สอง (ตามที่คนอื่นได้ตอบไปแล้ว) คุณต้องนำเอาต์พุตไปยังดิสก์ก่อนที่คุณจะรันคำสั่งการวางแผนของคุณ

pdf('filename.pdf')
plot( yourdata )
points (some_more_data)
dev.off() # to complete the writing process and return output to your monitor

8

หากคุณใช้ R Studio http://rstudio.org/มีเมนูพิเศษที่จะช่วยให้คุณบันทึกเป็นรูปแบบใดก็ได้ตามที่คุณต้องการและความละเอียดที่คุณเลือก


4
สิ่งนี้มีอยู่ใน R GUI บน Windows อย่างน้อย
richiemorrisroe

บางครั้งการทำเช่นนี้จะล้มเหลวอย่างลึกลับสำหรับฉัน แต่การเรียกใช้ฟังก์ชั่นจะใช้งานได้ตลอดเวลา
qwr

3

ถ้าคุณเปิดใช้อุปกรณ์png(), bmp(), pdf()ฯลฯ ตามที่แนะนำโดยAndrie (คำตอบที่ดีที่สุด), หน้าต่างที่มีแผนการจะไม่ปรากฏขึ้นเปิดเพียง * .png, * * * * * * * * BMP หรือไฟล์ PDF จะถูกสร้างขึ้น สิ่งนี้สะดวกในการคำนวณขนาดใหญ่เนื่องจาก R สามารถจัดการหน้าต่างกราฟิกได้ในจำนวนที่ จำกัด เท่านั้น

อย่างไรก็ตามถ้าคุณต้องการดูแปลงและบันทึกไว้แล้วให้เรียกsavePlot(filename, type)หลังจากวาดโครงและหน้าต่างที่มีอยู่นั้นเปิดใช้งานอยู่



0

หากต้องการเพิ่มคำตอบเหล่านี้หากคุณมีสคริปต์ R ที่มีการโทรที่สร้างแปลงหน้าจอ (อุปกรณ์เนทีฟ) สิ่งเหล่านี้จะสามารถบันทึกลงในไฟล์ pdf ได้ (อุปกรณ์เริ่มต้นสำหรับเปลือกที่ไม่มีการโต้ตอบ) "Rplots.pdf "(ชื่อเริ่มต้น) โดยเปลี่ยนเส้นทางสคริปต์เป็น R จากเทอร์มินัล (สมมติว่าคุณใช้งาน linux หรือ OS X) เช่น:

R < myscript.R --no-save

สิ่งนี้สามารถแปลงเป็น jpg / png ตามความจำเป็น


0

ในบางกรณีเราต้องการบันทึกและพิมพ์พล็อตฐาน r ฉันใช้เวลาสักครู่และมาพร้อมกับฟังก์ชั่นยูทิลิตี้นี้:

x = 1:10

basesave = function(expr, filename, print=T) {
  #extension
  exten = stringr::str_match(filename, "\\.(\\w+)$")[, 2]

  switch(exten,
         png = {
           png(filename)
           eval(expr, envir = parent.frame())
           dev.off()
         },
         {stop("filetype not recognized")})


  #print?
  if (print) eval(expr, envir = parent.frame())

  invisible(NULL)
}

#plots, but doesn't save
plot(x)

#saves, but doesn't plot
png("test.png")
plot(x)
dev.off()

#both
basesave(quote(plot(x)), "test.png")

#works with pipe too
quote(plot(x)) %>% basesave("test.png")

หมายเหตุว่าต้องใช้quoteมิฉะนั้นplot(x)โทรทำงานในสภาพแวดล้อมของโลกและได้รับการส่งผ่านไปยังNULLbasesave()


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