Bagaimana cara menyimpan plot sebagai gambar pada disk?

304

Saya merencanakan regresi linier sederhana menggunakan R. Saya ingin menyimpan gambar itu sebagai PNG atau JPEG, apakah mungkin untuk melakukannya secara otomatis? (melalui kode)

Ada dua pertanyaan berbeda: Pertama, saya sudah melihat plot di monitor saya dan saya ingin menyimpannya apa adanya. Kedua, saya belum membuat plot, tetapi saya ingin langsung menyimpannya ke disk ketika saya menjalankan kode plot saya.

blakc05
sumber
Mungkin pertanyaan ini harus diedit untuk menanyakan tentang dua skenario berbeda: Pertama, Anda mungkin bekerja secara interaktif dan telah membuat plot yang bagus yang ingin Anda simpan. Atau, kedua, Anda belum melihat plot apa pun dan Anda ingin menulisnya langsung ke disk tanpa melihatnya terlebih dahulu - ini masuk akal jika Anda menulis skrip untuk menghasilkan banyak plot untuk Anda. Saya akan mengeditnya sekarang
Aaron McDaid

Jawaban:

376

Ada dua pertanyaan yang terkait erat, dan jawaban untuk masing-masing.


1. Sebuah gambar akan dihasilkan di masa depan dalam skrip saya, bagaimana cara menyimpannya ke disk?

Untuk menyimpan plot, Anda perlu melakukan hal berikut:

  1. Buka perangkat, menggunakan png(), bmp(), pdf()atau serupa
  2. Plot model Anda
  3. Tutup perangkat menggunakan dev.off()

Beberapa contoh kode untuk menyimpan plot ke pngfile:

fit <- lm(some ~ model)

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

Hal ini dijelaskan dalam (gabungan) halaman bantuan untuk format grafis ?png, ?bmp, ?jpegdan ?tiffjuga di halaman bantuan terpisah untuk ?pdf.

Namun perhatikan bahwa gambar mungkin terlihat berbeda pada disk dengan plot yang sama langsung diplot ke layar Anda, misalnya jika Anda telah mengubah ukuran jendela di layar.


Perhatikan bahwa jika plot Anda dibuat oleh salah satu latticeatau ggplot2Anda harus mencetak plot secara eksplisit. Lihat jawaban ini yang menjelaskan hal ini lebih terinci dan juga tautan ke FAQ R: qplot ggplot tidak mengeksekusi pada sumber


2. Saya sedang melihat plot di layar saya dan saya ingin menyalinnya 'apa adanya' ke disk.

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

Ini harus menyalin gambar dengan sempurna, sesuai dengan ukuran yang telah Anda lakukan ke jendela interaktif. Anda dapat, seperti pada bagian pertama dari jawaban ini, ganti pdfdengan tipe file lain seperti png.

Andrie
sumber
4
jika Anda tidak menetapkan path, seperti png (filename = "name.png"), Anda dapat mengetahui direktori save withgetwd()
JuanPablo
2
Saya telah memperluas jawaban ini untuk memasukkan referensi ke dev.print. Ada dua pertanyaan terkait erat yang menurut saya memerlukan jawaban yang berbeda. Sub-pertanyaan kedua pada dasarnya adalah "Bagaimana cara saya menyimpan gambar yang sudah saya plot ke layar saya?". Mohon maaf jika hasil edit saya tidak terlalu bagus, silakan perbaiki hasil edit saya.
Aaron McDaid
Bagaimana saya melakukan ini ketika R meminta "Seleksi"? Misalnya Jika saya menggunakan m3=garchFit(~arma(3,0)+garch(1,1))dan plot(m3).
Jacobs
3
Bagaimana saya bisa menyimpan angka dengan dpi = 3000
Abhishek
2
8 tahun menggunakan R tanpa tahu saya sebenarnya bisa menyimpan dev dibuka di layar saya dalam file. Saya kira saya tidak membutuhkan itu ... tapi terima kasih banyak: D
Simon C.
82

Jika Anda ingin terus melihat plot di R, opsi lain adalah menggunakan dev.copy:

X11 ()
plot (x,y)

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

Jika Anda mencapai banyak jendela plot yang berantakan di R, gunakan graphics.off()untuk menutup semua jendela plot.

Itamar
sumber
2
Jawaban bagus! Ini memungkinkan Anda untuk bereksperimen dengan plot melalui X, sampai Anda puas dengan hasilnya, dan kemudian menyimpannya di tempat. Ini biasanya merupakan mode operasi yang paling nyaman.
Aaron McDaid
3
dev.printlebih baik karena menyalin gambar dari layar dengan tepat. dev.copymemaksa setiap gambar menjadi kotak secara default. Ini membuat frustasi jika Anda mengatur semuanya dengan baik secara interaktif
Aaron McDaid
4
Saya menggunakan dev.print()dengan parameter lebar dan tinggi untuk menentukan dimensi. misalnya dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott
72

Jika Anda menggunakan ggplot2cara penyimpanan yang disukai adalah menggunakan ggsave. Pertama, Anda harus memplot, setelah membuat plot yang Anda panggil ggsave:

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

Format gambar ditentukan oleh ekstensi yang Anda pilih untuk nama file. Parameter tambahan dapat dikirimkan ke ggsave, terutama width, height, dan dpi.

Paul Hiemstra
sumber
Ini bekerja dengan baik dalam satu lingkaran, dev.off tidak bekerja untuk saya
princelySid
sisi positifnya adalah API yang konsisten dan tidak perlu dipusingkan dengan menghidupkan dan mematikan perangkat
qwr
Tidak seperti solusi dengan dev, solusi ini bekerja pada mesin virtual tanpa perangkat grafis.
miguelmorin
Saya berharap ada pendekatan yang kuat, namun sederhana, seperti ini untuk SEMUA plot di R. Pokoknya, suara saya ada di sini.
SilSur
1
Masih berlaku hampir 7 Tahun lagi! Terima kasih.
Nick
30

Seperti ini

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

atau ini

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

atau ini

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

Dan mungkin yang lain juga. Mereka semua tercantum bersama di halaman bantuan.

Owen
sumber
Apakah ada cara bagi R untuk menyimpulkan ekstensi file secara otomatis (yaitu berdasarkan fungsi)? Tampaknya membosankan harus mengubah nama file serta fungsi yang digunakan.
Bonlenfum
11

Untuk pertanyaan pertama, saya menemukan dev.printyang terbaik ketika bekerja secara interaktif. Pertama, Anda mengatur plot Anda secara visual dan ketika Anda senang dengan apa yang Anda lihat, Anda dapat meminta R untuk menyimpan plot saat ini ke disk

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

Anda dapat mengganti pdfdengan format lain seperti png.

Ini akan menyalin gambar persis seperti yang Anda lihat di layar. Masalahnya dev.copyadalah bahwa gambar sering berbeda dan tidak ingat ukuran jendela dan aspek rasio - memaksa plot menjadi persegi secara default.

Untuk pertanyaan kedua, (seperti yang sudah dijawab orang lain), Anda harus mengarahkan output ke disk sebelum Anda menjalankan perintah plotting Anda

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

Jika Anda menggunakan R Studio http://rstudio.org/ ada menu khusus untuk menghemat plot Anda sebagai format apa pun yang Anda suka dan pada resolusi apa pun yang Anda pilih

efstratios charitos
sumber
4
Ini juga ada di R GUI di Windows, setidaknya.
richiemorrisroe
terkadang ini secara misterius gagal bagi saya, tetapi memanggil fungsi selalu berfungsi
qwr
3

Jika Anda membuka perangkat menggunakan png(), bmp(), pdf()dll seperti yang disarankan oleh Andrie (jawaban terbaik), jendela dengan plot tidak akan muncul terbuka, hanya * .png, * bmp atau file * .pdf akan dibuat. Ini nyaman dalam perhitungan besar, karena R hanya dapat menangani jumlah jendela grafis yang terbatas.

Namun, jika Anda ingin melihat plot dan juga menyimpannya, panggil savePlot(filename, type)setelah plot digambar dan jendela yang memuatnya aktif.

Alex Fainshtein
sumber
2
plotpath<- file.path(path, "PLOT_name",paste("plot_",file,".png",sep=""))

png(filename=plotpath)

plot(x,y, main= file)

dev.off()
Gijs
sumber
kombinasi dari apa yang disebutkan di atas dan r-bloggers.com/automatically-save-your-plots-to-a-folder Ini berhasil bagi saya!
Gijs
0

Untuk menambah jawaban ini, jika Anda memiliki skrip R yang berisi panggilan yang menghasilkan plot ke layar (perangkat asli), maka semua ini dapat disimpan ke file pdf (perangkat default untuk shell non-interaktif) "Rplots.pdf "(nama default) dengan mengarahkan ulang skrip ke R dari terminal (dengan asumsi Anda menjalankan linux atau OS X), misalnya:

R < myscript.R --no-save

Ini dapat dikonversi ke jpg / png seperlunya

waferthin
sumber
0

Dalam beberapa kasus seseorang ingin menyimpan dan mencetak plot r dasar. Saya menghabiskan sedikit waktu dan membuat fungsi utilitas ini:

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

Perhatikan bahwa seseorang harus menggunakan quote, jika tidak, plot(x)panggilan dijalankan di lingkungan global dan NULLditeruskan ke basesave().

Hapus
sumber
0
dev.copy(png,'path/pngFile.png')
plot(YData ~ XData, data = mydata)
dev.off()
orientchen1978
sumber