grid.arrangeを使用してプロットの可変リストをどのように配置しますか?


92
library(ggplot2)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above.

私が使用してプロット手配したいと思いgrid.arrange()でをgridExtra

のプロット数plistが可変の場合、どうすればよいですか?

これは機能します: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

しかし、もっと一般的な解決策が必要です。考え?

回答:


139

これはどう:

library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))

ここに画像の説明を入力してください


関数がNULLオブジェクトを処理できないことを除いて、これは素晴らしいです。
RomanLuštrik2012

ジョシュ。わたしは、あなたを愛しています。今までこれに2時間費やしてきました。これが機能しない理由を説明してもらえますか?次のgrid.arrange(plist[[1:length(plist)]], ncol = nCol))ようなエラーが発生します:Error in hl.plots[[1:12]] : no such index at level 3ありがとう!
Anto、2015

2
@Antoそのコードにはいくつかの問題があるようですが、表示されたエラーを提供するものは、おそらくここに示されているのと同じ種類のエラーが原因ですx <- list(1,2); x[[3:1]]。より広義には、サブセット化を行うのplist[...]ではなく、次のようなものを使用plist[[...]]します。次に、を使用しますdo.call()。これはgrid.arrange()、最初の引数としてリストを取得するように設定されていないために使用する必要があります。乾杯、そして幸運を!
Josh O'Brien

31

あなたは使用することができますgrid.arrange()し、arrangeGrob()あなたが使用してリストを指定限り、リストをgrobs =各関数で引数を。たとえば、あなたが与えた例では:

library(ggplot2)
library(gridExtra)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

grid.arrange(grobs = plist, ncol = 2) ## display plot
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2))  ## save plot

1
私にこの答えを見つけるには長すぎました...ありがとう!これが最も簡単です。
Matt L.

16

完全を期すために(そして、この古い、すでに回答された質問が復活しました、最近cowplotパッケージを使用してソリューションを追加したいと思います:

cowplot::plot_grid(plotlist = plist, ncol = 2)

ここに画像の説明を入力してください


このコードを使用してプロットのリストを渡すと次のエラーが返される理由: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie

プロットはどのように生成されましたか?ggplot2パッケージまたは基本グラフィックスを使用していますか?
Uwe 2017

ggplot2grid.arrangeほとんど私のために働いた-しかし、プロットの私のリストが作成されていないことが判明 問題を質問として投稿しました: stackoverflow.com/questions/43216262/… 。それで、それがカウプロットにとっても問題であったのではないかと思います
geog_newbie

10

私は質問がgridExtra パッケージの使用を具体的に述べていることを知っていwrap_plotsますが、パッチワークパッケージの関数は可変長リストを処理するための優れた方法です。

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

wrap_plots(plist)

ここに画像の説明を入力してください

これについての便利な点は、必要な列の数を指定する必要がなく、列と行の数を同じに保つことを目的とすることです。例えば:

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

パッチワークパッケージの詳細については、こちらをご覧ください


ここで述べたパッケージをインストールできないようです
baxx

上記のコメントアウトされているインストール行を実行してみましたdevtools::install_github("thomasp85/patchwork")か?
Michael Harper

ありがとう、私はしませんでした。RStudioからのインストールを使用しようとしました。
baxx

1
このパッケージはCRANではまだ利用できないため、GitHub経由でインストールする必要があります。うまくいけば、これは優れたパッケージなので、これ以上長くは続かないでしょう!
Michael Harper

1

すべてのプロットを1ページに収めるために、次のように列と行の数を計算できます。

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

ほとんどの複数のプロット関数は引数としてncolとnrowを持っているので、これらをそこに置くことができます。私はggpubrのggarrangeが好きです。

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

これは列よりも多くの行を優先するので、反対にする場合は逆にします。つまり、6つのプロットの場合、3行と2列の逆ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.