Bir arsa diske görüntü olarak nasıl kaydedilir?


304

R kullanarak basit bir doğrusal regresyon çiziyorum. Bu görüntüyü PNG veya JPEG olarak kaydetmek istiyorum, otomatik olarak yapmak mümkün mü? (kod aracılığıyla)

İki farklı soru var: Birincisi, zaten monitörümdeki arsaya bakıyorum ve olduğu gibi kaydetmek istiyorum. İkincisi, henüz çizimi oluşturmadım, ancak çizim kodumu yürüttüğümde doğrudan diske kaydetmek istiyorum.


Belki de bu soru iki farklı senaryoyu soracak şekilde düzenlenmelidir: Birincisi, etkileşimli çalışıyor olabilirsiniz ve kaydetmek istediğiniz güzel bir plan oluşturmuş olabilirsiniz. Ya da, ikinci olarak, henüz bir çizim görmediniz ve önce bakmadan doğrudan diske yazmak istiyorsunuz - bu, sizin için birçok çizim oluşturmak için bir senaryo yazıyorsanız mantıklı olurdu. Şimdi düzenleyeceğim
Aaron McDaid

Yanıtlar:


376

Yakından ilişkili iki soru ve her biri için bir cevap var.


1. Senaryomda gelecekte bir görüntü oluşturulacak, bunu diske nasıl kaydedebilirim?

Bir çizimi kaydetmek için aşağıdakileri yapmanız gerekir:

  1. Kullanarak, bir cihazı açın png(), bmp(), pdf()veya benzeri
  2. Modelinizi çizin
  3. Cihazı kullanarak kapatın dev.off()

Grafiği bir pngdosyaya kaydetmek için bazı örnek kodlar :

fit <- lm(some ~ model)

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

Bu grafik formatları için (kombine) yardım sayfasında açıklanan ?png, ?bmp, ?jpegve ?tiffyanı sıra ayrı yardım sayfasında ?pdf.

Bununla birlikte, görüntünün disk üzerinde, örneğin ekran penceresini yeniden boyutlandırdıysanız, doğrudan ekranınıza çizilen aynı grafikle farklı görünebileceğini unutmayın.


Eğer planınız ya lattice da ggplot2çizimi açıkça yazdırmanız gerektiğine dikkat edin. Bunu daha ayrıntılı olarak açıklayan ve ayrıca R SSS'ye bağlantı veren bu cevaba bakın: ggplot'un qplot kaynağı kaynakta yürütülmüyor


2. Şu anda ekranımdaki bir plana bakıyorum ve onu 'olduğu gibi' diske kopyalamak istiyorum.

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

Bu, etkileşimli pencerede yaptığınız yeniden boyutlandırmaya saygı duyarak görüntüyü mükemmel bir şekilde kopyalamalıdır. Bu cevabın ilk bölümünde olduğu pdfgibi, diğer dosya türleriyle değiştirebilirsiniz png.


4
Eğer yolu (png (filename = "name.png") gibi) belirlemezseniz, kaydetme dizininigetwd()
JuanPablo

2
Bu yanıtı referans olarak ekledim dev.print. Farklı cevaplara ihtiyaç duyduğunu düşündüğüm birbiriyle ilişkili iki soru var. İkinci alt soru temel olarak "Ekranıma önceden çizdiğim bir görüntüyü nasıl kaydederim?". Düzenlemem çok iyi değilse özür dilerim, düzenlemelerimi geliştirmekten çekinmeyin.
Aaron McDaid

R bir "Seçim" istediğinde bunu nasıl yapabilirim? Örneğin m3=garchFit(~arma(3,0)+garch(1,1))ve kullanırsam plot(m3).
jacob

3
Figürü dpi = 3000 ile nasıl kaydedebilirim
Abhishek

2
8 yıl R'yi kullanarak ekranımda açılan geliştiriciyi bir dosyaya kaydedebileceğimi bilmeden kullanıyorum. Sanırım buna ihtiyacım yoktu ... ama çok teşekkürler: D
Simon C.

82

Grafiği R'de görmeye devam etmek istiyorsanız, başka bir seçenek kullanmaktır dev.copy:

X11 ()
plot (x,y)

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

R'de çok fazla çizim penceresinden oluşan bir karmaşaya ulaşırsanız, graphics.off()tüm çizim pencerelerini kapatmak için kullanın .


2
Mükemmel cevap! Bu, sonuçlardan memnun olana kadar X ile arazileri denemenizi ve ardından onları yerinde kaydetmenizi sağlar. Bu genellikle en uygun çalışma modudur.
Aaron McDaid

3
dev.printgörüntüyü tam olarak ekrandan kopyaladığı için daha iyidir. dev.copyher görüntüyü varsayılan olarak kare olmaya zorlar. Her şeyi güzelce etkileşimli bir şekilde ayarladıysanız bu sinir bozucu
Aaron McDaid

4
I kullanma dev.print()boyutlar için genişlik ve yükseklik parametreleri ile. ör. dev.copy(device = png, filename = 'MyPlot.png', width = 1000, height = 500) dev.off()
Scott

72

ggplot2Tercih ettiğiniz tasarruf yöntemini kullanmaktır ggsave. İlk olarak, aradığınız komployu oluşturduktan sonra, komplo yapmanız gerekir ggsave:

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

Görüntünün formatı dosya adı için seçtiğiniz uzantı tarafından belirlenir. Ek parametreler geçirilebilir ggsave, özellikle width, heightve dpi.


Bu bir döngüde iyi çalışıyor, dev.off benim için çalışmadı
princelySid

Bunun tersi tutarlı API ve cihazları açıp kapatmakla
uğraşmaya

Çözümlerin aksine dev, bu çözüm grafik aygıtları olmayan sanal bir makinede çalıştı.
miguelmorin

Keşke R'deki TÜM parseller için böyle güçlü ama basit bir yaklaşım olsaydı Her neyse, oyum burada.
SilSur

1
Hala neredeyse 7 yıl geçerli! Teşekkür ederim.
Nick

30

Bunun gibi

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

veya bu

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

veya bu

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

Ve muhtemelen diğerleri de. Hepsi yardım sayfalarında birlikte listelenmiştir.


R'nin dosya uzantısını otomatik olarak çıkarması için herhangi bir yol var mı (yani işleve göre)? Kullanılan adın yanı sıra dosya adını da değiştirmek sıkıcı gözüküyor.
Bonlenfum

11

İlk soru için, dev.printetkileşimli çalışırken en iyi olduğunu düşünüyorum. İlk olarak, grafiğinizi görsel olarak ayarladınız ve gördüğünüz şeyden memnun olduğunuzda, R'den mevcut grafiği diske kaydetmesini isteyebilirsiniz.

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

Gibi pdfdiğer biçimlerle değiştirebilirsiniz png.

Bu, görüntüyü tam olarak ekranda gördüğünüz gibi kopyalar. Sorun dev.copy, görüntünün genellikle farklı olması ve pencere boyutunu ve en boy oranını hatırlamamasıdır - grafiği varsayılan olarak kare olmaya zorlar.

İkinci soru için (diğerlerinin zaten yanıtladığı gibi), çizim komutlarınızı çalıştırmadan önce çıktıyı diske yönlendirmelisiniz

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/ kullanıyorsanız , çiziminizi istediğiniz format olarak ve seçtiğiniz herhangi bir çözünürlükte kaydetmek için özel bir menü vardır.


4
Bu, en azından Windows'taki R GUI'de de bulunur.
richiemorrisroe

bazen bu gizemli bir şekilde benim için başarısız, ama bir işlevi çağırmak her zaman çalışır
qwr

3

Kullandığınız bir cihazı açarsanız png(), bmp(), pdf()vb önerdiği gibi ANDRIE (en iyi cevap), araziler ile pencere açık açılır olmaz, sadece * .png, * bmp veya * .pdf dosyaları oluşturulur. Bu, büyük hesaplamalarda kullanışlıdır, çünkü R yalnızca sınırlı sayıda grafik penceresini işleyebilir.

Ancak, grafikleri görmek ve kaydedilmesini istiyorsanız, grafikler çizildikten ve bunları savePlot(filename, type)içeren pencere aktif olduktan sonra arayın .



0

Bu yanıtlara eklemek için, ekrana grafik oluşturan (yerel cihaz) çağrılar içeren bir R komut dosyanız varsa, bunların tümü bir pdf dosyasına (etkileşimli olmayan bir kabuk için varsayılan cihaz) kaydedilebilir "Rplots.pdf "(varsayılan ad), komut dosyasını terminalden R'ye yönlendirerek (linux veya OS X çalıştırdığınız varsayılarak), örneğin:

R < myscript.R --no-save

Bu gerekirse jpg / png'ye dönüştürülebilir


0

Bazı durumlarda, bir temel r grafiğinin kaydedilmesi ve yazdırılması istenir. Biraz zaman geçirdim ve bu yardımcı fonksiyon ile geldi:

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

Birinin kullanması gerektiğini unutmayın quote, aksi takdirde plot(x)çağrı global ortamda yapılır ve NULLiletilir basesave().


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.