2013-08-23 13 views
11

ggplot_buildによって生成されたデータを変更することによって、ggplotで構築されたグラフを変更しています(理由は​​に似ています)。私がこのトピックで見つけた助けを理解する限り、結果にggsaveを呼び出す前にggplot_gtableとarrangeGrobを適用して結果を保存することができます(Saving grid.arrange() plot to file)。ggplot_buildとggplot_gtableを使ってグラフを保存する

私はエラー得るしかしまた、この単純なreproductible例で、「プロットはggplot2プロットする必要があります」:これが動作しない理由を

require('ggplot2') 
require('gridExtra') 
df <- data.frame(f1=factor(rbinom(100, 1, 0.45), label=c("m","w")), 
        f2=factor(rbinom(100, 1, 0.45), label=c("young","old")), 
        boxthis=rnorm(100)) 
g <- ggplot(aes(y = boxthis, x = f2, fill = f1), data = df) + geom_boxplot() 
dd <- ggplot_build(g) 

# Printing the graph works: 
print(arrangeGrob(ggplot_gtable(dd))) 

# Saving the graph doesn't: 
ggsave('test.png',arrangeGrob(ggplot_gtable(dd))) 

誰も説明できますか? ggplot_build()を使ってデータを変更した後、ggsaveを使用する方法はありますか?

(パッケージの私のバージョンはgridExtra_0.9.1とggplot2_0.9.3.1ある)

答えて

23

ggsaveがクラスggplotのオブジェクトを望んでいるので、あなたがグロブを渡している間、それは、動作しません。 arrangeGrobは、ggplotから継承を偽ってggsaveをトリックすることがありますが、少なくとも1つのgrobsがこのクラスに属している場合のみです。ここでは、gtableを渡すだけです。

おそらく最も簡単な回避策はggsaveのクローンを作成し、クラスのチェックをバイパスすることで、

ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2] 

編集: ggplot2のDEVのバージョンは、もはやggsavenow works with any grobとして、このハック*を必要としません。

* PS:このハックはもはや機能しません。これは、arrangeGrobがgtableを返すようになり、printメソッドがデバイスに描画されないためです。

+0

ありがとう、完璧に動作します。 –

+1

ありがとうございます。これは、[リンク](http://stackoverflow.com/a/20433318/2173340)と組み合わせて、 'ggplot2'によって作成されたプロットを 'gtable'と 'ggsave'を使って保存するという私の問題を修正しました。 –

+0

@baptiste私はあなたのトリックを上書きする 'ggsave'関数で試しましたが、私の場合はうまくいきません。同時に、 'ggplot'はまだ' 1.0.1'であり、問​​題はまだ解決されていません。あなたのメソッドを使うと、 'ggsave( 'test.pdf'、arrangeGrob(p1、p2))'を使ってpdfファイルを作成しますが、それはある意味で壊れています。同時に 'gtable 'がコンソールに表示されます。だから何かが正しく働いていない。 – drmariod

1

回避策は、gridableを使用してgtableオブジェクトをプロットし、dev.copy()を使用してプロットをファイルに転送することです。

dev.off()もまた後で使用することを忘れないでください。

関連する問題