ggplotの「アンバランス」グリッドを取得するにはどうすればよいですか?


94

では、グリッドにgrid.arrange複数のggplot図を配置して、次のようなものを使用してマルチパネル図を作成できます。

library(ggplot2)
library(grid)
library(gridExtra)

いくつかのggplot2プロットを生成し、

plot5 <- grid.arrange(plot4, plot1, heights=c(3/4, 1/4), ncol=1, nrow=2)

最初の列全体に1つのプロットがあり、2番目の列に3つのプロットがある「アンバランス」2列レイアウトを取得するにはどうすればよいですか?私は、grid.arrangeあるグリッド(たとえばplot5、上記)を別のプロットに対してプロットするために使用して「グリッドのグリッド」アプローチを試してみましたが、以下が得られました。

ArrangeGrob(...、as.table = as.table、clip = clip、ma​​in = main、のエラー:入力はグロブでなければなりません!

更新:

アドバイスありがとうございます。私はになりますviewportsgrid。その間、@ DWinのおかげlayOutで、私のSweaveドキュメントのコンパイル図では、「wq」パッケージの関数が非常にうまく機能しました。 ここに画像の説明を入力してください

アップデート2:

arrangeGrobコマンドは(@baptisteにより示唆されるように)もうまく機能し、非常に直感的なようだ-少なくともそれは、2つの列のALTER幅に簡単でした。また、 `wq 'パッケージを必要としないという利点もあります。

たとえば、以下は私のSweaveファイルのコードです。

<<label=fig5plot, echo=F, results=hide>>=
plot5<-grid.arrange(plot4, arrangeGrob(plot1, plot2, plot3, ncol=1), 
                    ncol=2, widths=c(1,1.2))
@
\begin{figure}[]
    \begin{center}
<<label=fig5,fig=TRUE,echo=T, width=10,height=12>>=
<<fig5plot>>
@
\end{center}
\caption{Combined plots using the `arrangeGrob' command.}
\label{fig:five}
\end{figure}

次の出力が生成されます。 ここに画像の説明を入力してください

ところで、なぜ「> NA」が表示されるのか教えてください。


ビューポートを自分で設定する必要grid.arrangeがあるかもしれません- 十分な柔軟性がないかもしれません( "[r] grid viewport"のstackoverflowを検索してください)
Ben Bolker

2
@BenBolkerは、を使用して実りある方向を示していgridます。Hadleyのggplot2ブック、セクション8.4.2も参照してください。
Ari B. Friedman

1
@BenBolker grid.arrangeは、以下に示した例のように、そのコンパニオンarrangeGrob(基本的にはを返すgTree)を使用してネストされたビューポートで使用できます。
バティスト

1
何も返さない(NULL)ので、最終的な割り当てplot5は不要ですgrid.arrange。結果のグロブを保存したい場合は、arrangeGrob再度使用します(そしてそれgrid.drawを表示します)。
バティスト

回答:


73

grid.arrangeデバイスに直接描画します。必要な他のグリッドオブジェクトと組み合わせたい場合はarrangeGrob

 p = rectGrob()
 grid.arrange(p, arrangeGrob(p,p,p, heights=c(3/4, 1/4, 1/4), ncol=1),
              ncol=2)

編集(2015年7月):v> 2.0.0では、layout_matrix引数を使用できます。

 grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4)))

6
cbind(c(1,1,1), c(2,3,4))マトリックスが図の配置をどのように説明しているかを説明できますか?
Ron Gejman、2015

5
@RonGejman 3x2マトリックスを画面に印刷するのは簡単です。最初の列はすべて1です。これは、3つの行にまたがる最初のプロットが存在する場所です。2列目には、それぞれ1行を占める2、3、4のプロットが含まれています。
バプティスト2015

17

私はグリッドでそれを考え出してみましたが、ダウンしていると思いましたが、失敗しました(以下で引用する関数のコードを見ると、本当に近いことがわかります... :-)

'wq'パッケージにはlayOutそれを行う関数があります:

p1 <- qplot(mpg, wt, data=mtcars)
layOut(list(p1, 1:3, 1),   # takes three rows and the first column
        list(p1, 1, 2),    # next three are on separate rows
         list(p1, 2,2), 
          list(p1, 3,2))

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


うわー、それは便利な機能です!ただし、コピーと貼り付けで失敗した可能性があります。あなたがのために意味したg1g2すべてであることを、等p1
joran

3
@joran:やった。「プログラミングの3つの美徳」のどれが怠惰なのか覚えていませんが、それがどこかにあるのはわかっています。
IRTFM

ありがとう!とてもうまくいきました。上記を参照。
user441706

2

別の選択肢は、patchworkThomas Lin Pedersenによるパッケージです。

# install.packages("devtools")
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

いくつかのプロットを生成します。

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + facet_grid(rows = vars(gear))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))

プロットを配置します。

p1 + (p2 / p3 / p4)

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


1

言及する価値のあるmultipanelfigureパッケージもあります。この回答も参照してください。

library(ggplot2)
theme_set(theme_bw())

q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
q4 <- ggplot(mtcars) + geom_bar(aes(carb))

library(magrittr)
library(multipanelfigure)

figure1 <- multi_panel_figure(columns = 2, rows = 3, panel_label_type = "upper-roman")

figure1 %<>%
  fill_panel(q1, column = 1, row = 1:3) %<>%
  fill_panel(q2, column = 2, row = 1) %<>%
  fill_panel(q3, column = 2, row = 2) %<>%
  fill_panel(q4, column = 2, row = 3)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
figure1

reprexパッケージ(v0.2.0.9000)によって2018-07-16に作成されました。

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