web-dev-qa-db-ja.com

R-マルチプロットをファイルに保存

次の問題について、ご協力いただければ幸いです。単一のプロットをファイルに保存するいくつかの方法を知っています。私の質問は:multiplotをファイルに正しく保存するにはどうすればよいですか?

まず、私は経験豊富なRユーザーではありません。私はggplot2を使用してプロットを作成していますが、もう1つ言っておきたいのは、RStudio GUIを使用していることです。 Rクックブックの example を使用すると、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())のみを保存し、完全なマルチプロットは保存しません。

これまでに試したこと:

  1. Ggsaveの使用

    ggsave(filename = "D:/R/plots/Myplots.jpg")
    

    これにより、サブプロット1dのみが保存されます。

  2. 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を理解していないことが、解決策を見つけようとしている理由です。誰かが私が間違っていることを説明し、おそらく私の問題を解決する方法を提案できますか?

29
M_Vermeulen

これは、Myplotがマルチプロット関数からの戻り値であり、何も返さないためです(その仕事はグラフを印刷することです)。 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()

うまくいくはずです。

22
Spacedman

サンプルコード (Rクックブック)を使用すると、私にとってはうまくいきます

png("chickweight.png")
multiplot(p1, p2, p3, p4, cols=2)
dev.off()

enter image description here

17
dickoa

そして、完全を期すために、ggsaveは、最後に印刷されたggplotオブジェクトを保存するだけで機能しません。これは、multiplotがggplotオブジェクトをグラフィックスデバイス全体の異なるサブセットに描画することでプロットを作成するために発生します。もう1つの方法は、ggplotオブジェクトを1つの大きなggplotオブジェクトに組み合わせてプロットを作成し、オブジェクトを印刷することです。これはggsaveと互換性があります。このアプローチは、arrangeGrobパッケージのgridExtraによって実装されます。

6
Paul Hiemstra