Làm thế nào để lưu một âm mưu như hình ảnh trên đĩa?


304

Tôi vẽ một hồi quy tuyến tính đơn giản bằng R. Tôi muốn lưu hình ảnh đó dưới dạng PNG hoặc JPEG, liệu có thể thực hiện tự động không? (thông qua mã)

Có hai câu hỏi khác nhau: Đầu tiên, tôi đã xem xét cốt truyện trên màn hình của mình và tôi muốn lưu nó như hiện tại. Thứ hai, tôi chưa tạo ra cốt truyện, nhưng tôi muốn trực tiếp lưu nó vào đĩa khi tôi thực thi mã âm mưu của mình.


Có lẽ câu hỏi này nên được chỉnh sửa để hỏi về hai kịch bản riêng biệt: Thứ nhất, bạn có thể làm việc tương tác và đã tạo ra một cốt truyện hay mà bạn muốn lưu lại. Hoặc, thứ hai, bạn chưa thấy bất kỳ cốt truyện nào và bạn muốn viết nó trực tiếp vào đĩa mà không cần nhìn vào nó trước - điều này sẽ có ý nghĩa nếu bạn đang viết một kịch bản để tạo ra nhiều âm mưu cho bạn. Tôi sẽ chỉnh sửa nó ngay bây giờ
Aaron McDaid

Câu trả lời:


376

Có hai câu hỏi liên quan chặt chẽ và một câu trả lời cho mỗi câu hỏi.


1. Một hình ảnh sẽ được tạo ra trong tương lai trong tập lệnh của tôi, làm cách nào để lưu nó vào đĩa?

Để lưu một cốt truyện, bạn cần làm như sau:

  1. Mở một thiết bị, sử dụng png(), bmp(), pdf()hoặc tương tự
  2. Vẽ mô hình của bạn
  3. Đóng thiết bị bằng dev.off()

Một số mã ví dụ để lưu cốt truyện vào một pngtệp:

fit <- lm(some ~ model)

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

Này được mô tả trong phần (kết hợp) trang trợ giúp cho các định dạng đồ họa ?png, ?bmp, ?jpeg?tiffcũng như trong các trang trợ giúp riêng cho ?pdf.

Tuy nhiên, xin lưu ý rằng hình ảnh có thể trông khác trên đĩa với cùng một âm mưu được vẽ trực tiếp trên màn hình của bạn, ví dụ nếu bạn đã thay đổi kích thước cửa sổ trên màn hình.


Lưu ý rằng nếu cốt truyện của bạn được thực hiện bởi một trong hai latticehoặc ggplot2bạn phải in rõ ràng cốt truyện. Xem câu trả lời này giải thích điều này chi tiết hơn và cũng liên kết đến Câu hỏi thường gặp về R: qplot của ggplot không thực thi về tìm nguồn cung ứng


2. Tôi hiện đang xem một âm mưu trên màn hình của mình và tôi muốn sao chép nó 'như hiện trạng' vào đĩa.

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

Điều này sẽ sao chép hình ảnh một cách hoàn hảo, tôn trọng bất kỳ thay đổi kích thước nào bạn đã thực hiện với cửa sổ tương tác. Bạn có thể, như trong phần đầu tiên của câu trả lời này, thay thế pdfbằng các kiểu tệp khác như png.


4
nếu bạn không đặt đường dẫn, như png (filename = "name.png"), bạn có thể biết thư mục lưu vớigetwd()
JuanPablo

2
Tôi đã mở rộng câu trả lời này để bao gồm một tài liệu tham khảo dev.print. Có hai câu hỏi liên quan chặt chẽ mà tôi nghĩ cần câu trả lời khác nhau. Câu hỏi phụ thứ hai về cơ bản là "Làm cách nào để lưu hình ảnh mà tôi đã vẽ lên màn hình?". Xin lỗi nếu chỉnh sửa của tôi không tốt lắm, vui lòng cải thiện các chỉnh sửa của tôi.
Aaron McDaid

Làm thế nào để tôi làm điều này khi R yêu cầu "Lựa chọn"? Ví dụ: Nếu tôi sử dụng m3=garchFit(~arma(3,0)+garch(1,1))plot(m3).
jacob

3
Làm cách nào tôi có thể lưu số liệu với dpi = 3000
Abhishek

2
8 năm sử dụng R mà không biết tôi thực sự có thể lưu dev được mở trên màn hình của mình trong một tệp. Tôi đoán tôi không cần điều đó ... nhưng cảm ơn rất nhiều: D
Simon C.

82

Nếu bạn muốn tiếp tục xem cốt truyện trong R, một tùy chọn khác là sử dụng dev.copy:

X11 ()
plot (x,y)

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

Nếu bạn gặp phải sự lộn xộn của quá nhiều cửa sổ cốt truyện trong R, hãy sử dụng graphics.off()để đóng tất cả các cửa sổ lô.


2
Câu trả lời chính xác! Điều này cho phép bạn thử nghiệm các lô thông qua X, cho đến khi bạn hài lòng với kết quả và sau đó lưu chúng ngay tại chỗ. Đây thường là chế độ hoạt động thuận tiện nhất.
Aaron McDaid

3
dev.printlà tốt hơn vì nó sao chép hình ảnh từ màn hình chính xác. dev.copybuộc mọi hình ảnh phải vuông theo mặc định. Điều này thật khó chịu nếu bạn thiết lập mọi thứ tương tác độc đáo
Aaron McDaid

4
Tôi sử dụng dev.print()với các tham số chiều rộng và chiều cao để xác định kích thước. ví dụ dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott

72

Nếu bạn sử dụng ggplot2cách tiết kiệm ưa thích là sử dụng ggsave. Trước tiên, bạn phải vẽ, sau khi tạo cốt truyện bạn gọi ggsave:

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

Định dạng của hình ảnh được xác định bởi phần mở rộng bạn chọn cho tên tệp. Tham số bổ sung có thể được chuyển tới ggsave, đáng chú ý width, heightdpi.


Điều này hoạt động tốt trong một vòng lặp, dev.off đã không làm việc cho tôi
PrinceelySid

mặt trái của điều này là API nhất quán và không cần phải lộn xộn với việc bật và tắt thiết bị
qwr

Không giống như các giải pháp với dev, giải pháp này hoạt động trên một máy ảo không có thiết bị đồ họa.
Miguelmorin

Tôi ước có một cách tiếp cận mạnh mẽ nhưng đơn giản như thế này cho TẤT CẢ các âm mưu trong R. Dù sao, phiếu bầu của tôi sẽ ở đây.
SilSur

1
Vẫn còn hiệu lực gần 7 năm! Cảm ơn bạn.
Nick

30

Như thế này

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

hoặc cái này

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

hoặc cái này

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

Và có lẽ những người khác cũng vậy. Tất cả đều được liệt kê cùng nhau trong các trang trợ giúp.


Có cách nào để R tự động suy ra phần mở rộng tập tin (tức là dựa trên chức năng) không? Có vẻ tẻ nhạt khi phải thay đổi tên tệp cũng như chức năng được sử dụng.
Bonlenfum 04/11/2015

11

Đối với câu hỏi đầu tiên, tôi thấy dev.printlà tốt nhất khi làm việc tương tác. Đầu tiên, bạn thiết lập âm mưu của mình một cách trực quan và khi bạn hài lòng với những gì bạn thấy, bạn có thể yêu cầu R lưu lại âm mưu hiện tại vào đĩa

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

Bạn có thể thay thế pdfbằng các định dạng khác như png.

Điều này sẽ sao chép hình ảnh chính xác như bạn nhìn thấy trên màn hình. Vấn đề với dev.copylà hình ảnh thường khác nhau và không nhớ kích thước cửa sổ và tỷ lệ khung hình - nó buộc cốt truyện phải vuông theo mặc định.

Đối với câu hỏi thứ hai, (như những người khác đã trả lời), bạn phải hướng đầu ra vào đĩa trước khi bạn thực hiện các lệnh vẽ biểu đồ của mình

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

8

Nếu bạn sử dụng R Studio http://rstudio.org/, có một menu đặc biệt để lưu lại âm mưu của bạn theo bất kỳ định dạng nào bạn thích và ở bất kỳ độ phân giải nào bạn chọn


4
Điều này cũng tồn tại trong GUI R trên Windows, ít nhất.
richiemorrisroe

đôi khi điều này làm tôi thất bại một cách bí ẩn, nhưng việc gọi một chức năng luôn hoạt động
qwr

3

Nếu bạn mở một thiết bị sử dụng png(), bmp(), pdf()vv như đề xuất bởi Andrie (câu trả lời tốt nhất), các cửa sổ với âm mưu sẽ không bật lên mở, chỉ * .png, * bmp hoặc * .pdf sẽ được tạo ra. Điều này thuận tiện trong các tính toán lớn, vì R chỉ có thể xử lý số lượng hạn chế của các cửa sổ đồ họa.

Tuy nhiên, nếu bạn muốn xem các ô và cũng đã lưu chúng, hãy gọi savePlot(filename, type)sau khi các ô được vẽ và cửa sổ chứa chúng đang hoạt động.



0

Để thêm vào các câu trả lời này, nếu bạn có tập lệnh R chứa các cuộc gọi tạo ra âm mưu để sàng lọc (thiết bị gốc), thì tất cả chúng có thể được lưu vào tệp pdf (thiết bị mặc định cho trình bao không tương tác) "Rplots.pdf "(Tên mặc định) bằng cách chuyển hướng tập lệnh vào R từ thiết bị đầu cuối (giả sử bạn đang chạy linux hoặc OS X), ví dụ:

R < myscript.R --no-save

Điều này có thể được chuyển đổi sang jpg / png khi cần thiết


0

Trong một số trường hợp, người ta muốn vừa lưu và in một âm mưu cơ sở. Tôi đã dành một chút thời gian và đưa ra chức năng tiện ích này:

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

Lưu ý rằng người ta phải sử dụng quote, nếu không, plot(x)cuộc gọi được chạy trong môi trường toàn cầu và NULLđược chuyển đến basesave().


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.