专注系列化、高质量的R语言教程
推文《基础绘图系统(二)—— 绘图参数及par函数》介绍了基础绘图系统的图形存在4种边框和区域。本篇来介绍ggplot2绘图系统中的一些边框和区域概念,以及调整它们间距的方法。
本篇目录如下:
1 两个区域
2 边距
3 patchwork工具包
示例数据:
set.seed(0314)
data <- data.frame(
x = 1:5,
y = rpois(5, 12),
z = c(1,2,2,1,1)
)
library(ggplot2)
p <- ggplot(data) +
geom_col(aes(x, y, fill = z)) +
labs(fill = expression(PM[2.5](mu*g/m^3)))
p

1 两个区域
ggplot2绘图系统中存在panel
和plot
两个区域概念。
分别使用panel.border
和plot.background
参数展示它们的位置:
p + theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2)
)

panel区域(红色边框内)相当于基础绘图系统的plot区域;
plot区域(蓝色边框内)相当于基础绘图系统的device区域。
如果存在子图,每个子图都有自己的panel区域:
p +
facet_wrap(vars(z)) +
theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2)
)

2 边距
从前面的图形可以看出,默认状况下两个区域是存在间距的。
使用plot.margin
参数调整间距:
p + theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2),
plot.margin = margin()
)

上面使用的margin()
函数的语法结构如下:
margin(t = 0, r = 0, b = 0, l = 0,
unit = "pt")
t
、r
、b
、l
分别表示上、右、下、左四侧边距;
unit
为间距单位,可以使用pt
、cm
、in
等。
margin()
函数默认设置四侧边距都为0,但为何上图除了上间距为0(红色边框和蓝色边框重合)外,其余三侧间距都不为0呢?
这是因为在这三侧之间还存在其他要素:左、下存在坐标刻度和文本,右侧存在图例。为了使两个区域在四侧都重合,需要去除这些要素。
使用legend.position
参数去除图例后,可以发现右侧边框重合了:
p + theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2),
plot.margin = margin(),
legend.position = "none"
)

使用axis.title
、axis.text
、axis.ticks.length
三个参数去除坐标刻度、文本等内容,可以发现左侧和下侧边框也重合了:
p + theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2),
plot.margin = margin(),
legend.position = "none",
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks.length = unit(0, "pt")
)

由此可见plot.margin
参数的作用逻辑。
下面使用plot.margin
参数调整边距(两侧留白):
p + theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2),
plot.margin = margin(0.5,2.5,0.5,2.5, unit = "cm")
)

这里保留边框是为了当作参考线,实际绘图时不需要保留
panel.border
和plot.background
参数。
3 patchwork工具包
前面学堂君用了几篇推文介绍patchwork
工具包的组图功能。该包的plot_spacer()
函数还未介绍,它可以生成空白图形,再结合组图操作符或函数也可以实现调整图形边距的功能。
library(patchwork)
p0 <- plot_spacer()
p0 + p + p0 &
theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2)
)

使用plot_layout()
函数调整比例:
p0 + p + p0 +
plot_layout(widths = c(0.2,1,0.2)) &
theme(
panel.border = element_rect(color = "red", size = 2, fill = NA),
plot.background = element_rect(color = "blue", size = 2)
)
