プロットをオブジェクトに保存する


83

ではggplot2、グラフィックをRオブジェクトに簡単に保存できます。

p = ggplot(...) + geom_point()      # does not display the graph
p                                   # displays the graph

標準関数plotは、グラフィックをvoid関数として生成し、NULLを返します。

p = plot(1:10)     # displays the graph
p                  # NULL

によって作成さplotれたグラフィックをオブジェクトに保存することはできますか?


plotはジェネリックでありplot、私が知る限り、さまざまなメソッドがそのようなオブジェクトを返します。plot.defaultただし、実際にはを返しますNULL
Konrad Rudolph

グラフをpオブジェクトとして保存した後、入力するだけでグラフを再プロットできるようにすることを目標としていますか?または、たとえば値を変更できるオブジェクトとして保存しますか?
LyzandeR 2015

保存したグラフィックの上に他のグラフィックをオーバーレイしたい場合がありますが、作成および保存されたプロットを変更することは目的としていません。私はあなたの質問に答えましたか?Thks
Remi.b

@ Remi.bありがとうございます。私は役立つかもしれない解決策を投稿しました。
LyzandeR 2015

回答:


95

ベースグラフィックはデバイス上に直接描画されます。

あなたが使うことができます

1- recordPlot

2-ベースグラフィックを同等のグリッドに変換するための最近導入されたgridGraphicsパッケージ

これが最小限の例です、

plot(1:10) 

p <- recordPlot()
plot.new() ## clean up device
p # redraw

## grab the scene as a grid object
library(gridGraphics)
library(grid)
grid.echo()
a <- grid.grab()

## draw it, changes optional
grid.newpage()
a <- editGrob(a, vp=viewport(width=unit(2,"in")), gp=gpar(fontsize=10))
grid.draw(a)

1
私にはわかりません。(1)と(2)は同じ目標を達成するための別々の方法ですか、それともOPの質問に答えるために2つのステップが必要ですか?
NLi10Me 2017年

@ NLi10Me2つの異なる方法。
zx8754 2018年

を試してsaveRDS(object = p, file = "p.Rds")から、新しいRセッションをロードし、実行しp <- readRDS(file = "p.Rds")てからp、を実行すると、というエラーが表示されますError in replayPlot(x) : loading snapshot from a different sessionpオブジェクトを間違って保存していますか?
user5359531 2018年

私が得ていたエラーは、R 3.3.0で解決されたようで、そのバージョンを使用して動作します。gridGraphicsここに示す方法を使用した場合、再描画されたプロットの色は、次の場合でも混乱し続けましたgrid.grab(wrap=TRUE)
user5359531 2018年

34

私はこれに非常に遅れていますが、質問を検索したときに最初に表示された質問でした。それで、私は質問に出くわす将来の視聴者のために私の解決策を追加したいと思います。

オブジェクトの代わりに関数を使用してこれを解決しました。たとえば、パラメータが異なる2つのベータ分布を比較するとします。実行できます:

z1<-rbeta(10000,5,5)
z2<-rbeta(10000,20,20)
plotit<-function(vector,alpha,beta){
plot(density(vector),xlim=c(0,1))
abline(v=alpha/(alpha+beta),lty="longdash")
}

そして、プロットをオブジェクトではなく関数として保存します。

z.plot1<-function(){plotit(z1,5,5)}
z.plot2<-function(){plotit(z2,20,20)}

次に、2つのプロットをオブジェクトではなく関数として呼び出すだけで、必要に応じて各プロットを呼び出すことができます。

z.plot1()

最初のプロットをプロットし、

z.plot2()

2番目をプロットします。

後でこれに遭遇する誰かを助けることを願っています!


これはとても便利です!プリセットプロットを準備するのは素晴らしいアイデアだと思います。これが私が探していたものです
Jojostack 2018

これは天才ベースRアプローチです!recordPlot間違いなく便利です(ウィンドウが既に開いている場合)が、この回答は、人々がこの投稿にアクセスしたときにまさに探しているものです。+1!
森林生態学者2018年

複雑な複数のプロットに特に役立ちます。
ジョー

このトリックを本当に感謝している人々の合唱団に参加させてください。また、私の学生に代わって:-)
LaryxDecidua19年

字句スコープが再び救助に!:)
ジェイソン

17

pryr作成されたオブジェクトの値を直接変更したくない場合は、パッケージのアクティブバインディング機能を使用できます。

library(pryr)
a %<a-% plot(1:10,1:10)

aコンソールで入力するたびに、グラフが画面に再印刷されます。%<a-%オペレータは、(1つのグラフの場合には、これは私が考える問題ではありません)、スクリプトを毎回再実行します。したがって、基本的にa、コードを使用するたびにコードが再実行され、グラフが作成されます。もちろん、グラフを操作(別のプロットを上にオーバーレイ)したりpng、たとえばを使用して保存したりできます。aただし、値自体は格納されません。値は引き続きNULLになります。

上記があなたが探しているものであるかどうかはわかりませんが、それは許容できる解決策かもしれません。


ありがとうございました。これは非常に便利なソリューションです。プロットが複数の線(plot(1:10);abline(v=4)たとえば)で作成されている場合、これが機能するかどうか知っていますか?+1
Remi.b 2015

@ Remi.bもちろんそうです。ただし、このように入力する必要があります」a %<a-% {plot(1:10);abline(v=4)}。中かっこ内に入力すると、必要な数の行を含めることができます。また、値を再割り当てするa場合は、で削除してrm(a)から、で再割り当てする必要があります。%<a-%オペレータそうでない場合は警告を取得し、これがなぜ起こるか私にはわからないが、私はそれは大したことではないと思います。。
LyzandeR

これは本当にクールです!この奇妙な関数%<a-%が実行していることを実行することは不可能に思えるので、このパッケージについて少し読む必要があります。ありがとう
Remi.b 2015

ええ、それはハドリーが作った本当にクールなパッケージのもう一つです。R言語を深く理解できる関数のセットです。%<d-%同様に見てください、それは後で役に立つかもしれません。私が助けてくれてうれしいです:)
LyzandeR 2015

1
@LyzandeR保存されたプロットをマルチプロットに結合することは可能ですか?
user2300940 2016年

-4
library(ggplot2)
# if mygraph is a plot object
ggsave("myplot1.png",mygraph)

# if the plot is in a list (e.g. created by the Bibliometrics package)
ggsave("myplot1.png",mygraphs[[1]])

あなたの答えは「正しい」ように見えますが(私はRプログラマーではありません)、「簡潔な」コードのみのブロックを投稿するのではなく、StackOverflowで説明テキストを追加するのが通常の方法です。これにより、回答は長期的に、そしてより幅広いユーザーにとってより価値のあるものになります。(しかし、とにかく賛成票を持ってください!)
エイドリアンモール

3
OPは、ggplot2使用せずにこれを行う方法について質問していました。
ジェイソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.