プロットを画像としてディスクに保存する方法は?


304

Rを使用して単純な線形回帰をプロットします。その画像をPNGまたはJPEGとして保存したいのですが、自動的に実行できますか?(コード経由)

2つの異なる質問があります。1つ目は、既にプロットをモニターで見ているので、そのまま保存したいです。2つ目は、まだプロットを生成していませんが、プロットコードを実行するときに直接ディスクに保存したいです。


おそらく、この質問を編集して2つの異なるシナリオについて質問する必要があります。まず、インタラクティブに作業していて、保存したい素敵なプロットを作成した可能性があります。または、2番目に、まだプロットを表示しておらず、最初にそれを表示せずにディスクに直接書き込みたい場合-これは、多くのプロットを生成するスクリプトを記述している場合に意味があります。私は今それを編集します
アーロン・マクダイド14

回答:


376

密接に関連する2つの質問と、それぞれに対する回答があります。


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 FAQへのリンクもあるこの回答を参照してください:ggplotのqplotがソースで実行されません


2.現在、画面上のプロットを見ており、それを「そのまま」ディスクにコピーしたい。

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

これにより、対話型ウィンドウに対して行ったサイズ変更を尊重して、画像が完全にコピーされます。この回答の最初の部分のように、pdfなどの他のファイルタイプに置き換えることができpngます。


4
png(filename = "name.png")のようにパスを設定しない場合は、保存先のディレクトリを確認できますgetwd()
JuanPablo

2
この回答を拡張して、への参照を含めましたdev.print。2つの密接に関連する質問があり、それぞれに異なる答えが必要だと思います。2番目のサブ質問は、基本的には「自分の画面に既にプロットした画像をどのように保存するのですか?」です。私の編集があまり良くない場合はお詫びします。私の編集を自由に改善してください。
Aaron McDaid 2015

Rが「選択」を要求した場合、どうすればよいですか?たとえばm3=garchFit(~arma(3,0)+garch(1,1))とを使用するとしplot(m3)ます。
ジェイコブ2016年

3
dpi = 3000で図を保存するにはどうすればよいですか
Abhishek

2
画面で開いた開発者を実際にファイルに保存できることを知らずにRを8年間使用しました。私はそれを必要としなかったと思います...しかし、感謝します:D
サイモンC.

82

Rでプロットを見続けたい場合は、次のオプションを使用することもできますdev.copy

X11 ()
plot (x,y)

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

Rでプロットウィンドウが多すぎる場合は、を使用graphics.off()してすべてのプロットウィンドウを閉じます。


2
正解です。これにより、結果に満足するまでXを介してプロットを実験し、その場で保存できます。これは通常、最も便利な操作モードです。
アーロン・マクデイド2013年

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、特に、widthheight、とdpi


これはループでうまく機能し、dev.offは私には機能しませんでした
princelySid

この
利点

のソリューションとは異なり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 2015年

11

最初の質問については、dev.printインタラクティブに作業するときに最高だと思います。まず、視覚的にプロットを設定し、表示に満足したら、Rに現在のプロットをディスクに保存するように要求できます。

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

pdfなどの他の形式に置き換えることができますpng

これにより、画面に表示されているとおりにイメージがコピーされます。の問題dev.copyは、画像が異なることが多く、ウィンドウサイズとアスペクト比を覚えていないことです。デフォルトでは、プロットは強制的に正方形になります。

2番目の質問については(他の人がすでに回答しているように)、プロットコマンドを実行する前に出力をディスクに送信する必要があります

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
これは、少なくともWindowsのR GUIにも存在します。
richiemorrisroe 2011

時々これは不思議なことに失敗しますが、関数の呼び出しは常に機能します
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)呼び出しはグローバル環境で実行され、NULLに渡されbasesave()ます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.