在 cowplot 中使用 axis_canvas 的边缘图:如何在主面板和边缘图之间插入间隙
Marginal plots using axis_canvas in cowplot: How to insert gap between main panel and marginal plots
以下内容出现在对的评论中axis_canvas()
在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)
正如我们在此示例中所见,边缘箱线图直接触及主绘图面板。目标是产生一些差距。如何做到这一点?
我看到两个选项:
插入空图
我们可以迭代地应用insert_xaxis_grob()
/ insert_yaxis_grob()
函数来插入多个grobs,其中一个可以为空。这样,我们就可以在边缘地块的任一侧插入指定数量的space。在这里,我将展示如何在内部执行此操作,以在主面板和边缘地块之间产生间隙:
# 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 绘制的,我们可以只指定在适当位置生成 space 的轴限制。即,我们通过以下方式定义 xbox2
和 ybox2
,而不是原始代码中的 xbox
和 ybox
:
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
(右侧)在底部如何有额外的 space,这是通过从 -2 开始轴创建的,即使第一个箱线图位于位置1. 有关如何为这些边缘图选择轴范围的更多信息,请参见
以下内容出现在对axis_canvas()
在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)
正如我们在此示例中所见,边缘箱线图直接触及主绘图面板。目标是产生一些差距。如何做到这一点?
我看到两个选项:
插入空图
我们可以迭代地应用insert_xaxis_grob()
/ insert_yaxis_grob()
函数来插入多个grobs,其中一个可以为空。这样,我们就可以在边缘地块的任一侧插入指定数量的space。在这里,我将展示如何在内部执行此操作,以在主面板和边缘地块之间产生间隙:
# 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 绘制的,我们可以只指定在适当位置生成 space 的轴限制。即,我们通过以下方式定义 xbox2
和 ybox2
,而不是原始代码中的 xbox
和 ybox
:
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
(右侧)在底部如何有额外的 space,这是通过从 -2 开始轴创建的,即使第一个箱线图位于位置1. 有关如何为这些边缘图选择轴范围的更多信息,请参见