cowplot: How to customize the gaps between main panel & marginal plots by modifying axis limits?

谁说胖子不能爱 提交于 2019-12-06 02:57:38

With a continuous x-axis scale, you can use expand_limits to add some empty space between the main plot and the marginal plots.

For example, your ybox2 is a single box plot with a continuous x-axis scale. By default, the x-range for this plot is roughly 0.6 to 1.4 (you can see this by running ggplot(mpg, aes(y=hwy, x=1)) + geom_boxplot()). The following code sets the lower x-axis limit to 0.2 instead, meaning that about 0.4/(0.8+0.4) = 33% of the x-axis range will be the margin between the main plot and the marginal plot. We do the same for xbox2.

ybox2 <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = 1)) +
  expand_limits(x = 0.2)

xbox2 <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = 1))  + 
  coord_flip() +
  expand_limits(x = 0.2)

p1 <- insert_xaxis_grob(pmain, xbox2, grid::unit(0.4, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox2, grid::unit(0.4, "in"), position = "right")

ggdraw(p2)

The accepted answer is correct. To provide some additional information:

First, you can use the layer_scales() function to figure out exactly what the scales limits of a plot are. For example:

ybox2 <- axis_canvas(pmain, axis = "y") +  
    geom_boxplot(data = mpg, aes(y = hwy, x = 1))
layer_scales(ybox2)
#$x
#<ScaleContinuousPosition>
# Range:  0.625 -- 1.38
# Limits: 0.625 -- 1.38
#
#$y
#<ScaleContinuousPosition>
# Range:    12 --   44
# Limits: 10.4 -- 45.6

Second, it can be helpful to look at the marginal plots in a theme that shows the axes, like so:

ybox2 + theme_bw()

We see that the boxplot completely fills the entire x range of the plot, hence there are no margins. If we expand the axis, as suggested in the other answer, we get:

ybox2 + expand_limits(x = 0.2) + theme_bw()

In the original figure I had made, with four boxplots, using these methods you can see that the boxplots are at positions 1, 2, 3, 4, therefore it made sense to set the axis range from -2 to 4.5. However, the upper limit of 4.5 wasn't chosen perfectly, and created some additional gap on the other side of the boxplots. The expand_limits() approach is probably better.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!