1. ホーム
  2. r

[解決済み] grid.arrangeを使って任意の数のggplotを並べるにはどうしたらいいですか?

2023-03-10 23:51:39

質問

これは ggplot2 の google グループに投稿されたものです。

私の状況は、私は 関数で作業している この関数は任意の数のプロットを出力します (ユーザーによって提供された入力データによって異なります)。この関数は n 個のプロットのリストを返し、私はそれらのプロットを 2 x 2 の形に並べたいと考えています。という同時問題で苦労しています。

  1. どのようにして、任意の (n) 個のプロットを渡される柔軟性を持たせることができますか。
  2. 2 x 2 のレイアウトを指定するにはどうすればよいですか。

私の現在の戦略では grid.arrange から gridExtra パッケージから取得します。特に、これが重要なのですが、おそらく最適ではないでしょう。 は全く機能しません。 . 以下は私がコメントしたサンプルコードで、3つのプロットで実験しています。

library(ggplot2)
library(gridExtra)

x <- qplot(mpg, disp, data = mtcars)
y <- qplot(hp, wt, data = mtcars)
z <- qplot(qsec, wt, data = mtcars)

# A normal, plain-jane call to grid.arrange is fine for displaying all my plots
grid.arrange(x, y, z)

# But, for my purposes, I need a 2 x 2 layout. So the command below works acceptably.
grid.arrange(x, y, z, nrow = 2, ncol = 2)

# The problem is that the function I'm developing outputs a LIST of an arbitrary
# number plots, and I'd like to be able to plot every plot in the list on a 2 x 2
# laid-out page. I can at least plot a list of plots by constructing a do.call()
# expression, below. (Note: it totally even surprises me that this do.call expression
# DOES work. I'm astounded.)
plot.list <- list(x, y, z)
do.call(grid.arrange, plot.list)

# But now I need 2 x 2 pages. No problem, right? Since do.call() is taking a list of
# arguments, I'll just add my grid.layout arguments to the list. Since grid.arrange is
# supposed to pass layout arguments along to grid.layout anyway, this should work.
args.list <- c(plot.list, "nrow = 2", "ncol = 2")

# Except that the line below is going to fail, producing an "input must be grobs!"
# error
do.call(grid.arrange, args.list)

私はよくやるように、謙虚に隅に身を寄せ、私よりはるかに賢明なコミュニティからの賢明なフィードバックを待ち望んでいます。 特に、私がこれを必要以上に難しくしているのであればなおさらです。

どのように解決するのですか?

もう少しのところです。問題は do.call は、引数が名前付きの list オブジェクトにあることを期待します。リストに入れたのは文字列であり、リストの項目名ではありません。

これでうまくいくはずです。

args.list <- c(plot.list, 2,2)
names(args.list) <- c("x", "y", "z", "nrow", "ncol")

Ben と Joshua がコメントで指摘したように、私はリストを作成するときに名前を割り当てることができました。

args.list <- c(plot.list,list(nrow=2,ncol=2))

または

args.list <- list(x=x, y=y, z=x, nrow=2, ncol=2)