30

次の問題について、お役に立てれば幸いです。単一のプロットをファイルに保存する方法をいくつか知っています。私の質問は、マルチプロットをファイルに正しく保存するにはどうすればよいですか?

そもそも、私は経験豊富な R ユーザーではありません。私は ggplot2 を使用してプロットを作成していますが、おそらく言及すべきもう 1 つのことは、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()) のみを保存することができました。

私がこれまでに試したこと:

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

4

3 に答える 3

24

その理由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()

動作するはずです。

于 2012-07-30T12:26:35.257 に答える
19

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

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

ここに画像の説明を入力

于 2012-07-30T12:29:18.810 に答える
7

完全を期すためにggsave、最後に印刷された ggplot オブジェクトのみを保存するため、機能しません。これは、あなたの場合は最後のプロットです。これは、マルチプロットが ggplot オブジェクトをグラフィックス デバイス全体の異なるサブセットに描画することによってプロットを作成するという事実が原因です。別の方法として、ggplot オブジェクトを 1 つの大きな ggplot オブジェクトに結合してプロットを作成し、オブジェクトを印刷する方法があります。これは と互換性がありggsaveます。このアプローチはarrangeGrobgridExtraパッケージ内で実装されています。

于 2012-07-30T15:19:56.233 に答える