ggplot2 | 调整图形的边框和边距


专注系列化高质量的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
777f68b6609fec36ef0a56a89034d626.png

1 两个区域

ggplot2绘图系统中存在panelplot两个区域概念。

分别使用panel.borderplot.background参数展示它们的位置:

p + theme(
  panel.border = element_rect(color = "red", size = 2, fill = NA),
  plot.background = element_rect(color = "blue", size = 2)
)
2fa8e3bfd0507b746b1df1ee923fd6b5.png
  • 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)
)
2a3ae4e762e26944ae69fda59991013d.png

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()
)
15bcb7a5a1003087cb1c5097c73f3471.png

上面使用的margin()函数的语法结构如下:

margin(t = 0, r = 0, b = 0, l = 0, 
       unit = "pt")
  • trbl分别表示上、右、下、左四侧边距;

  • unit为间距单位,可以使用ptcmin等。

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"
)
53933e60e02b32548b5a42ad6946b7f7.png

使用axis.titleaxis.textaxis.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")
)
296b2f5d38c59a605d34d94df9f254ba.png

由此可见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")
)
dcc6161369a5fa11b17a8498747c1c6e.png
  • 这里保留边框是为了当作参考线,实际绘图时不需要保留panel.borderplot.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)
)
4e82f1dd1eda026abb6ccc0da9feb705.png

使用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)
)
8604bc8cb223c1f156191e65eff27a14.png
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值