3

对此帖子的评论中出现了以下内容:使用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)

在此处输入图像描述

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

4

1 回答 1

3

我看到两个选项:

插入空图

我们可以迭代地应用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 绘制的,我们可以只指定在适当位置生成空间的轴限制。即,代替原始代码中的xboxand ,我们定义and via:yboxxbox2ybox2

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)

在此处输入图像描述

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

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

在此处输入图像描述

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

于 2017-11-28T23:48:17.807 回答