1. ホーム
  2. r

[解決済み] grid.arrange()のプロットをファイルに保存する

2022-04-25 23:36:55

質問

を使用して複数のプロットを作成しようとしています。 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

しかし、このような場合、どのようにして 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()?

解決方法は?

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

指定されなければデフォルトで最後のプロットが保存されるggplotオブジェクトと異なる動作をする理由は、ggplot2が目に見えない形で最新のプロットを追跡しているからです。 grid.arrange は、このパッケージのプライベートなカウンターをいじくるべきです。