次の問題について、ご助言をいただければ幸いです。単一のプロットをファイルに保存する方法はいくつか知っています。質問は、マルチプロットファイルに?
まず、私は経験豊富なRユーザーではありません。グラフを作成するためにggplot2を使用しています。また、RStudio GUIを使用していることも言及しておくべきでしょう。例R クックブックを使用すると、1 つのウィンドウに複数のプロットを作成できます。
このいわゆるマルチプロットをファイル(できれば jpeg)に保存したいのですが、どういうわけかそれができません。
次のようにマルチプロットを作成しています。
##define multiplot function
multiplot <- function(..., plotlist=NULL, cols) {
require(grid)
# Make a list from the ... arguments and plotlist
plots <- c(list(...), plotlist)
numPlots = length(plots)
# Make the panel
plotCols = cols # Number of columns of plots
plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
vplayout <- function(x, y)
viewport(layout.pos.row = x, layout.pos.col = y)
# Make each plot, in the correct location
for (i in 1:numPlots) {
curRow = ceiling(i/plotCols)
curCol = (i-1) %% plotCols + 1
print(plots[[i]], vp = vplayout(curRow, curCol ))
}
}
## define subplots (short example here, I specified some more aesthetics in my script)
plot1a <- qplot(variable1,variable2,data=Mydataframe1)
plot1b <- qplot(variable1,variable3,data=Mydataframe1)
plot1c <- qplot(variable1,variable2,data=Mydataframe2)
plot1d <- qplot(variable1,variable3,data=Mydataframe2)
## plot in one frame
Myplot <- multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)
これで、目的の結果が得られます。問題は、ファイルに保存しようとすると発生します。RStudio で手動でこれを行うことができます ([エクスポート] -> [プロットを画像として保存] を使用) が、すべてをスクリプトで実行したいと思います。subplot1d (last_plot()) のみを保存でき、完全なマルチプロットは保存できません。
これまで試したこと:
ggsaveの使用
ggsave(filename = "D:/R/plots/Myplots.jpg")
この結果、サブプロット 1d のみが保存されます。
jpeg()、print()、dev.off() を使用する
jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE) print(Myplot) dev.off()
この結果、完全に白い画像 (背景だけだと思います) が作成されます。print(Myplot) は NULL を返します。
ここで何を間違っているのかよくわかりません。R を理解していないため、解決策を見つけられずにいます。私が何を間違っているのか説明し、問題を解決する方法を提案してくれる人はいませんか?
ベストアンサー1
これは、Myplot
multiplot 関数からの戻り値であり、何も返さないためです (グラフを印刷するのがその役割です)。jpeg デバイスを開いた状態で multiplot を呼び出す必要があります。
jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE)
multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)
dev.off()
動作するはずです。