12

を使用して複数のプロットを 1 つの画像に配置gridExtra::grid.arrangeしていますが、結合されたプロットを、返されたオブジェクトのリストの一部として関数内から返されるオブジェクトとして保存するオプションが必要です。理想的には、プロット オブジェクトを印刷せずにこれを行いたいと思います。

以下のコードは、2 つのプロットを作成し、それらを と組み合わせてgrid.arrange、結果を に保存しようとしますx。ただし、 にx評価されNULL、プロットが印刷されます。のドキュメントは、を使用してプロットをオフにできることを示しており、 を使用してオフにできることを示唆していgrid.arrangeますが、 はグロブ オブジェクトではないため、それを試みるとエラーが発生します。arrangeGrobplot=FALSEFALSE

私が理解していないことに対する提案はありますか?

# R under development
# Windows 7 (32 bit)
# ggplot2 1.0.0
# gridExtra 0.9.1

p1 <- ggplot(mtcars, aes(x=factor(cyl), y=mpg)) + geom_boxplot()

p2 <- ggplot(mtcars, aes(x=factor(cyl), y=wt)) + geom_boxplot()

x <- gridExtra::grid.arrange(p1, p2)

x

コメントごとに、この編集を追加しています。で試してみるとarrangeGrob、まったく出力が得られません。

> gridExtra::arrangeGrob(p1, p2)
> print(gridExtra::arrangeGrob(p1, p2))
Error: No layers in plot
> x <- gridExtra::arrangeGrob(p1, p2)
> x
Error: No layers in plot
4

2 に答える 2

6

をロードしなかったため、編集中のコードは正しく機能しませんgridExtra

library(gridExtra)
y <- arrangeGrob(p1, p2, ncol = 1)
class(y)
#[1] "gtable" "grob"   "gDesc"
grid.draw(y)

ここに画像の説明を入力

編集: バージョン 2.0.0 以降、以下の依存関係に関する私のコメントgridは無効になりましgridた。

編集: gridExtra バージョン >= 2.0.0 では、どちらのパッケージも添付する必要はありません。

p <- ggplot2::qplot(1,1)
x <- gridExtra::arrangeGrob(p, p)
grid::grid.draw(x)
于 2015-03-16T08:49:19.050 に答える
3

これが最近尋ねられたのはおかしいです-今週もこの問題に遭遇していて、少しハッキーな方法で解決できましたが、私が満足できる他の解決策を見つけることができませんでした.

問題 1:ggplotGrobが見つからない

ggplot2 がロードされていることを確認する必要がありました。何が起こっているのか完全には理解していません (インポート/依存/アタッチなどを完全には理解していないことは認めます) が、次の修正で修正されます。これが非常に危険な場合は、フィードバックをお待ちしております。

if (!"package:ggplot2" %in% search()) {
  suppressPackageStartupMessages(attachNamespace("ggplot2"))
  on.exit(detach("package:ggplot2"))
}

他の誰かがこのブログ投稿にリンクしており、それもうまくいくと思いますが、私の(完全ではない)理解からすると、この解決策はそれほどひどいものではありません. おもう。

問題 2: プロットにレイヤーがない

あなたも発見したように、その問題を修正すると を使用できますgrid.arrangeが、NULL が返され、オブジェクトへの保存が許可されません。だから私も使いたかったarrangeGrobのですが、gridExtraがまだロードされていないときに上記のエラーにも遭遇しました。問題 1 の修正を再度適用してもうまくいかないようです (おそらく、パッケージの切り離しが早すぎるのでしょうか?)。grid::grid.drawしかし、arrangeGrob の結果を呼び出すと、エラーなしで正常に出力されることに気付きました。そこで私は、arrangeGrob の出力にカスタム クラスを追加し、単純に grid.draw を呼び出す汎用の印刷メソッドを追加しました。

f <- function() {
  plot <- gridExtra::arrangeGrob(...)
  class(plot) <- c("ggExtraPlot", class(plot))
  plot
}
print.ggExtraPlot <- function(x, ...) {
  grid::grid.draw(x)
}

これで、パッケージを明示的にロードせずに新しい R セッションを開くことができ、グロブを作成して後で出力する関数を正常に呼び出すことができます!


GitHub の私のパッケージで コードの動作を確認できます。

于 2015-03-26T20:37:56.887 に答える