在cowplot中使用axis_canvas的边际图:如何在主面板和边际图之间插入间隙

Posted

技术标签:

【中文标题】在cowplot中使用axis_canvas的边际图:如何在主面板和边际图之间插入间隙【英文标题】:Marginal plots using axis_canvas in cowplot: How to insert gap between main panel and marginal plots 【发布时间】:2018-05-12 13:48:58 【问题描述】:

在this post:的评论中出现了以下内容在cowplot中使用axis_canvas()函数制作边缘图时,我们如何在主图和边缘图之间创建间隙?

示例代码:

require(cowplot)

pmain <- ggplot(data = mpg, aes(x = cty, y = hwy, color = factor(cyl))) + 
  geom_point() + 
  xlab("City driving (miles/gallon)") +
  ylab("Highway driving (miles/gallon)") +
  theme_minimal()

xbox <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = factor(cyl), color = factor(cyl))) + 
  scale_x_discrete() + coord_flip()
ybox <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = factor(cyl), color = factor(cyl))) +
  scale_x_discrete()

p1 <- insert_xaxis_grob(pmain, xbox, grid::unit(0.6, "in"), position = "top")
p2 <- insert_yaxis_grob(p1, ybox, grid::unit(0.6, "in"), position = "right")
ggdraw(p2)

正如我们在这个例子中看到的,边缘箱线图直接接触到主绘图面板。目标是产生一些差距。如何做到这一点?

【问题讨论】:

【参考方案1】:

我看到两个选项:

插入空白图

我们可以迭代地应用 insert_xaxis_grob() / insert_yaxis_grob() 函数来插入多个 grobs,其中一个可以为空。通过这种方式,我们可以在边缘图的任一侧插入指定数量的空间。在这里,我将展示如何在内部执行此操作,以在主面板和边缘图之间产生间隙:

# pmain, xbox, ybox are defined as in the question
pnull <- ggdraw() # generate empty plot

p1 <- insert_xaxis_grob(
        insert_xaxis_grob(pmain, xbox, grid::unit(0.6, "in"), position = "top"),
        pnull, grid::unit(0.2, "in"), position = "top")

p2 <- insert_yaxis_grob(
        insert_yaxis_grob(p1, ybox, grid::unit(0.6, "in"), position = "right"),
        pnull, grid::unit(0.2, "in"), position = "right")
ggdraw(p2)

在边际图中创建间隙

另外,由于边缘图是用 ggplot2 绘制的,我们可以只指定在适当位置生成空间的轴限制。即,我们通过以下方式定义xbox2ybox2,而不是原始代码中的xboxybox

xbox2 <- axis_canvas(pmain, axis = "x", coord_flip = TRUE) + 
  geom_boxplot(data = mpg, aes(y = cty, x = as.numeric(factor(cyl)), color = factor(cyl))) + 
  scale_x_continuous(limits = c(-2, 4.5)) + coord_flip()
ybox2 <- axis_canvas(pmain, axis = "y") + 
  geom_boxplot(data = mpg, aes(y = hwy, x = as.numeric(factor(cyl)), color = factor(cyl))) +
  scale_x_continuous(limits = c(-2, 4.5))

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

要了解这里发生了什么,让我们并排比较 xboxxbox2

plot_grid(xbox + panel_border("black"), 
          xbox2 + panel_border("black"), nrow = 1, scale = 0.9)

我们看到xbox2(右侧)在底部有额外的空间,这是通过将轴从 -2 开始创建的,即使第一个箱形图位于位置 1。有关如何选择的更多信息这些边缘图的轴范围可以在here.

【讨论】:

以上是关于在cowplot中使用axis_canvas的边际图:如何在主面板和边际图之间插入间隙的主要内容,如果未能解决你的问题,请参考以下文章

使用 plot_grid 和 cowplot 删除 NULL 图上的标签

使用cowplot包的多图的居中X轴标签

使用 cowplot 时减少绘图之间的边距

如何使用cowplot包在R中的同一页面上制作几个图?

使用 cowplot 拼凑图时颜色渐变不正确

我在 R 中使用 cowplot 和 ggplot2 的 plot_grids 缺少网格中的四个图之一?