web-dev-qa-db-ja.com

grid.arrange()プロットをファイルに保存

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

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

ただし、ggsave()を使用してgrid.arrange()呼び出しの出力を保存する方法がわからないため、次のコードで link から取得します。

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()?
125
I Like to Code

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

Ggplotオブジェクトとは異なる動作をする理由は、指定されていない場合はデフォルトで最後のプロットが保存されるためです。ggplot2は目に見えないように最新のプロットを追跡し、grid.arrangeはこのカウンターを台無しにしないパッケージにプライベート。

128
baptiste

私はバプティストの提案にいくつか問題を抱えていましたが、ついにそれを手に入れました。使用すべきものは次のとおりです。

 # 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

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

39
user2B4L2

Grid.arrangeをPDFファイルに保存する別の簡単な方法は、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以外のものをマージできます...

20
JohnBee

これに追加する価値があると思いました。上記で問題が発生し、ggsaveでエラーが発生しました:「プロットは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

今ではうまく動作します。

6
docjg

別の簡単なソリューション:grid.arrange()の直後

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

あなたはdev.copy()をします

dev.copy(pdf,"whatever.pdf")
dev.off()
1
TeYaP