grid.arrange()プロットをファイルに保存しています


137

を使用して複数のプロットをプロットしggplot2、を使用してそれらを配置しようとしていますgrid.arrange()。私が持っている正確な問題を説明している誰かを見つけることができたので、リンクの問題の説明から引用しました:

私が使用したggsave()grid.arrange()、すなわち

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

グリッドプロットは保存しませんが、最後の個別のggplotを保存します。grid.arrange()を使用して、ggsave()または同様のものを表示して 、実際にプロットを保存する方法はありますか?古い方法を使用する以外

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

同じリンクは以下の解決策を提供します:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

ただし、linkから取得した次のコードでggsave()は、grid.arrange()呼び出しの出力を保存する方法を理解できません。

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?

6
使用png(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie

2
違いprint(ggplot())ますか?
IRTFM 2013年

@DWinはい、おそらく!:-)
Andrie

1
@Andrieあなたの提案は機能しますが、画像の解像度が非常に低くなります。ggplotを使用して1つを保存するggsave()と、画像の解像度がはるかに高くなります。で出力をgrid.arrange()単一のプロットで保存した場合と同様に、の出力を高解像度で保存する方法はありggsave()ますか?たとえばオプションを指定png(...,height=1600, width=2500)すると、画像が非常にぼやけて見えます。
にコーディングしたい

回答:


142

grid.arrangeデバイスに直接描画します。arrangeGrob一方、何も描画されませんが、グロブを返しgあなたに渡すことができ、ggsave(file="whatever.pdf", g)

これがggplotオブジェクトとは異なる動作をする理由は、指定されていない場合、デフォルトで最後のプロットが保存されるため、ggplot2が不可視に最新のプロットを追跡grid.arrangeしているためであり、このカウンターをパッケージ専用に変更しないでください。


3
これを試してみると、gが正しい型ではないというエラーメッセージが表示されますか?
Jack Aidley、2014年

@JackAidleyは、最小限の自己完結型の再現可能な例とsessionInfo()を使用して新しい質問をします(Rとパッケージの最新バージョンがあることを確認してください)。
バプティスト2014年

3
@DaveXは、この誤解を招く情報を広めないでください。gtableを表示する正しい方法でplot(g)はありませんgrid.draw(g)。代わりに使用してください。
バティスト

@baptiste感謝&リワーク:メモの結果を参照しようとした場合ということg <-arrangeGrob(...)print(g)、あなたがグラフィックオブジェクトではなく、グラフィックを一覧テキスト表を取得します。grid.draw(g)グラフィックをグラフィックとしてレンダリングしてみてください。–
デイブX

7
ggsaveは(一部またはすべての)grobsで動作しなくなりました。
2015年

47

babptisteの提案には問題がありましたが、ようやく手に入れました。これはあなたが使うべきものです:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

これはうまくいくはずです。


24

grid.arrangeをpdfファイルに保存するもう1つの簡単な方法は、pdf()を使用することです。

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

それはテーブルのような配置でggplots以外のものをマージすることができます...


7

これに追加する価値があると思いました。上記の問題があり、ggsaveでエラーが発生しました:「plotはggplot2プロットである必要があります」

この回答のおかげ:ggplot_buildとggplot_gtable使用した後にggsaveでグラフを保存する上記のコードを修正しました。

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

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

エラーを修正するために必要な上記の行

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

今ではうまくいきます。


私はこれが必要でした。どうやらggplot2の開発バージョンはこのようにclass-test-faultを削除しますが、CRANバージョンは現在(2015-10-21)は削除しません。
Dave X

2
これはmarrangeGrobでは機能しますが、arrangeGrobやgrid.arrange。@ DaveXでは機能しません。上記のようにggsaveを変更する以外に、何かをする必要がありますか?ありがとう!
k13 2013年

3

あなたは、arrangeGrobを使用する必要はありません、あなたはgrid.arrangeの結果をプロットに直接割り当て、ggsaveを使用してそれを保存することができます:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

2

別の簡単な解決策:直後に grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

あなたはする dev.copy()

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