21

grid.arrange を使用して、ggplot によって生成された同じページに複数のグラフを表示しようとしています。プロットは同じ x データを使用しますが、y 変数は異なります。y データのスケールが異なるため、プロットの次元が異なります。

ggplot2 内でさまざまなテーマ オプションを使用して、プロット サイズを変更し、y 軸ラベルを移動しようとしましたが、プロットを整列させるものはありませんでした。各プロットが同じサイズで x 軸が揃うように、プロットを 2 x 2 の正方形に配置します。

ここにいくつかのテストデータがあります:

A <- c(1,5,6,7,9)
B <- c(10,56,64,86,98)
C <- c(2001,3333,5678,4345,5345)
D <- c(13446,20336,24333,34345,42345)
L <- c(20,34,45,55,67)
M <- data.frame(L, A, B, C, D)

そして、私がプロットするために使用しているコード:

x1 <- ggplot(M, aes(L, A,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')
x2 <- ggplot(M, aes(L, B,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')
x3 <- ggplot(M, aes(L, C,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')
x4 <- ggplot(M, aes(L, D,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')
grid.arrange(x1,x2,x3,x4,nrow=2)

このコードを実行すると、y 軸の単位が長いため、下の 2 つのプロットのプロット領域が小さいことがわかります。

実際のプロット ウィンドウを同じにするにはどうすればよいですか?

4

5 に答える 5

21

編集

より簡単な解決策は次のとおりです。1)cowplotパッケージを使用します(こちらの回答を参照)。または 2) egggithub で利用可能なパッケージを使用します。

# devtools::install_github("baptiste/egg")
library(egg)
library(grid)

g = ggarrange(x1, x2, x3, x4, ncol = 2)
grid.newpage()
grid.draw(g)

オリジナル

マイナーな編集:コードの更新。

軸ラベルを保持したい場合は、いくつかいじり、hereからコードを借用すると、これでうまくいきます。

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

# Get the widths
gA <- ggplotGrob(x1)
gB <- ggplotGrob(x2)
gC <- ggplotGrob(x3)
gD <- ggplotGrob(x4)
maxWidth = unit.pmax(gA$widths[2:3], gB$widths[2:3], 
                     gC$widths[2:3], gD$widths[2:3])

# Set the widths
gA$widths[2:3] <- maxWidth
gB$widths[2:3] <- maxWidth
gC$widths[2:3] <- maxWidth
gD$widths[2:3] <- maxWidth

# Arrange the four charts
grid.arrange(gA, gB, gC, gD, nrow=2)

ここに画像の説明を入力

代替ソリューション:パッケージには、グロブを 1 つのグロブに結合する関数が ありrbindます。ここのグラフでは、 を使用して幅を設定する必要がありますが、CRAN バージョンのではエラーがスローされます。cbindgtablesize = "max"gtable

grid.arrange1 つのオプションは、プロットを調べてから、size = "first"または size = "last"` オプションを使用することです。

# Get the ggplot grobs
gA <- ggplotGrob(x1)  
gB <- ggplotGrob(x2)
gC <- ggplotGrob(x3)
gD <- ggplotGrob(x4)

# Arrange the four charts
grid.arrange(gA, gB, gC, gD, nrow=2)

# Combine the plots   
g = cbind(rbind(gA, gC, size = "last"), rbind(gB, gD, size = "last"), size = "first")

# draw it
grid.newpage()
grid.draw(g)

2 番目のオプションは、パッケージbindから関数を ing することです。gridExtra

# Get the ggplot grobs
gA <- ggplotGrob(x1)  
gB <- ggplotGrob(x2)
gC <- ggplotGrob(x3)
gD <- ggplotGrob(x4)

# Combine the plots
g = cbind.gtable(rbind.gtable(gA, gC, size = "max"), rbind.gtable(gB, gD, size = "max"), size = "max")

# Draw it
grid.newpage()
grid.draw(g)
于 2012-12-01T07:39:58.073 に答える
11

これはまさに、私がcowplotパッケージを作成したときの種類の問題です。そのパッケージでは 1 行で実行できます。

require(cowplot) # loads ggplot2 as dependency
# re-create the four plots
A <- c(1,5,6,7,9)
B <- c(10,56,64,86,98)
C <- c(2001,3333,5678,4345,5345)
D <- c(13446,20336,24333,34345,42345)
L <- c(20,34,45,55,67)
M <- data.frame(L, A, B, C, D)
x1 <- ggplot(M, aes(L, A,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')
x2 <- ggplot(M, aes(L, B,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')
x3 <- ggplot(M, aes(L, C,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')
x4 <- ggplot(M, aes(L, D,xmin=10,ymin=0)) + geom_point() + stat_smooth(method='lm')

# arrange into grid and align
plot_grid(x1, x2, x3, x4, align='vh')

これが結果です: ここに画像の説明を入力 (cowplot はデフォルトの ggplot2 テーマを変更することに注意してください。本当にしたい場合は、灰色のものを元に戻すことができます。)

おまけ機能として、各グラフの左上隅にプロット ラベルを追加することもできます。

plot_grid(x1, x2, x3, x4, align='vh', labels=c('A', 'B', 'C', 'D'))

結果: ここに画像の説明を入力

labels私が作成するほとんどすべてのマルチパート グラフでこのオプションを使用します。

于 2015-07-04T06:24:00.653 に答える
9

この問題にはファセットを使用します。

library(reshape2)
dat <- melt(M,"L") # When in doubt, melt!

ggplot(dat, aes(L,value)) + 
geom_point() + 
stat_smooth(method="lm") + 
facet_wrap(~variable,ncol=2,scales="free")

例

注: 素人は、ファセット間でスケールが異なることを見逃す可能性があります。

于 2012-12-01T05:55:28.197 に答える