16

次のように、2 つのグラフを上下に配置しています。

library(ggplot2)
library(gridExtra)
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- p2 + facet_grid(cyl ~ .)
grid.arrange(p1, p2, ncol=1)

このためには、上と下のグラフの x 軸を揃える必要がありますが、左にストリップがあるため、ファセット グラフは上のグラフよりも狭くなります。次を使用して、ストリップを非表示にできます。

theme(strip.text.y = element_blank())
theme(strip.background = element_blank())

ただし、これはストリップが占有するスペースを取り除くわけではありません。したがって、ストリップを完全に取り除く方法が必要です。または、ファセット グラフを別々のグラフに分割し、それらの間で同じ y 軸ラベルを何らかの方法で共有する方法が必要です。私のグラフには、あまり高くない 2 つのファセット パネルがあり、それぞれに適切なサイズの y 軸を配置するのに十分なスペースがありません。

助言がありますか?

4

4 に答える 4

9

私の解決策は、ストリップの幅を見つけてから、両方のプロットの余白をゼロに設定することですが、ストリップのないプロットをわずかに小さく (ストリップの幅) 縮小して、同じサイズに見えるようにします。試行錯誤の結果、ストリップの幅は約 0.5 行のようです (ただし、プログラムでこれを把握できると思います)。したがって、ストリップ テキストのないプロットの右プロット マージンが、目に見えないストリップを含むプロット マージンよりも 0.5 行大きいことを確認してください。

#  Add a line of width 0.5 on the left but set all other margins to zero
p1 <- p1 + theme( plot.margin = unit( c(0,0.5,0,0) , units = "lines" ) )
#  Set all margins to zero, the strip will take up a phantom amount of invisible space
p2 <- p2 + theme(strip.text.y = element_blank() , 
  strip.background = element_blank(),
  plot.margin = unit( c(0,0,0,0) , units = "lines" ) )

grid.arrange(p1, p2, ncol=1)

明らかに、余白を必要に応じて調整できます (たとえば、各数値ベクトルの最初の位置に 1 を追加してplot.margin、各プロットの上部に沿って 1 行の境界線を取得します)、右の境界線に 0.5 行以上の余白を維持する限り2 番目のプロットでは、それらは同じように見えます。

ここに画像の説明を入力

于 2013-06-17T10:10:32.650 に答える
2

gtableパッケージの関数を使用した別のソリューション。プロットを揃えますが、ストリップ テキストは保持します。関数を使用して、 のストリップ テキストの幅に等しいgtableの右側に列を挿入します。p1p2

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

p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- p2 + facet_grid(cyl ~ .)

g1 = ggplotGrob(p1)
# gtable_show_layout(g1)  # View the layout
# g1$widths               # Get the widths of g1

g2 = ggplotGrob(p2)
# gtable_show_layout(g2)  # View the layout
# g2$widths               # Check the widths of g2

#  Add new column to the right of g1 equal in width the strip width of g2.
#  In g2, strip width is the 6th element the vector g2$widths
g1 <- gtable_add_cols(g1, g2$widths[6])  
grid.arrange(g1, g2, ncol=1)

ここに画像の説明を入力

## But note that if the y-axis titles and/or labels take up different widths, 
#  the two plots are not aligned
p1 <- ggplot(mtcars, aes(mpg, wt)) + geom_point() +
   theme(axis.title.y = element_text(vjust = .5, angle = 0, size = 30))
p2 <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p2 <- p2 + facet_grid(cyl ~ .)

g1 = ggplotGrob(p1)
g2 = ggplotGrob(p2)

g1 <- gtable_add_cols(g1, g2$widths[6])  # New column added to the right
grid.arrange(g1, g2, ncol=1)             # Plots are not aligned

ここに画像の説明を入力

# Need to set widths to the maximums in the two plots, 
# i.e., set g2 widths to be the same as g1 widths
g2$widths <- g1$widths
grid.arrange(g1, g2, ncol=1)            # Plots are aligned

ここに画像の説明を入力

編集:または、baptiste で提案されているように、gtablerbind()関数を使用します。

g1 = ggplotGrob(p1)
g2 = ggplotGrob(p2)

g1 <- gtable_add_cols(g1, g2$widths[6], 5)  # New column added to the right 

library(grid)
grid.draw(rbind(g1, g2, size = "first"))
于 2014-06-03T02:15:33.750 に答える
1

viewportと を使用した別のソリューションを次に示しgrid.layoutます。2 つの異なるレイアウトで 2 つのビューポートを作成します。次に、引数 vp を使用して ggplot2 プロットを配置します。

library(grid)
pushViewport(plotViewport(c(1,1,1,1),layout = grid.layout(2, 1)))
print(p2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1))
pushViewport(viewport(layout.pos.row=1,
  layout = grid.layout(1, 2,widths = unit(c(1,1),c("null",'lines')))))
print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
upViewport(2)             

ここに画像の説明を入力

于 2013-06-17T10:54:42.840 に答える