You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R的tmap/ggplot2中调整图例按键的间距与形状?

调整ggplot2地图图例按键间距的解决方案

针对你遇到的ggplot2图例按键间距无法灵活调整的问题,我有几个具体的修改方案可以帮你实现符合设计规范的效果:

核心解决思路

在ggplot2中,legend.spacing.y控制的是整个图例条目(包含按键和文本)之间的间距,而如果要单独调整图例按键本身的垂直间距,需要在颜色比例尺中通过guide_legend()来设置key.spacing.y参数。同时,你还可以调整按键的内边距来进一步优化样式。

修改后的完整代码

# 定义主题选项
theme_opts <- list(
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major = element_blank(),
    panel.background = element_blank(),
    plot.background = element_blank(),
    panel.border = element_blank(),
    axis.line = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    legend.position = c(0.015, 0.7),
    legend.background = element_rect(fill = alpha("white", 0)),
    legend.key.width = unit(1, "cm"),
    legend.key.height = unit(0.2, "cm"),
    # 控制整个图例条目(按键+文本)的间距
    legend.spacing.y = unit(0.8, "cm"),
    legend.title = element_text(size = 14, family = "Tahoma"),
    # 调整文本与按键的水平间距
    legend.text = element_text(size = 12, family = "Tahoma", margin = margin(l = 0.3, unit = "cm")),
    # 调整按键的内边距(让矩形按键内部更宽松)
    legend.key = element_rect(fill = NA, color = NA, margin = margin(t = 0.1, b = 0.1, unit = "cm"))
  )
)

p <- ggplot() +
  geom_sf(data = map_data_full, aes(fill = TransmissionClassification), size = 0.5, color = "gray10") +
  scale_fill_manual(
    values = colours,
    breaks = transmission_levels,
    # 关键:设置按键之间的垂直间距
    guide = guide_legend(
      key.spacing.y = unit(0.4, "cm"),
      label.position = "right",
      title.position = "top"
    )
  ) +
  geom_sf(data = map_data_borders, fill = NA, size = 1, color = "black") +
  coord_sf(xlim = c(1405044, 7120890), ylim = c(1291822, 5218781)) +
  theme_opts

参数解释

  • key.spacing.y:直接控制图例按键之间的垂直空白间距,你可以根据需求调整unit()里的数值(比如0.4cm、0.6cm)。
  • legend.spacing.y:控制整个图例条目(按键+对应文本)之间的间距,和key.spacing.y配合使用可以实现更精准的布局。
  • legend.key的margin:调整按键自身的内边距,让矩形按键看起来更舒展,避免内容太拥挤。
  • legend.text的margin:调整文本和按键之间的水平间距,优化视觉对齐效果。

关于tmap的补充说明

如果你还是想尝试tmap,可以通过tm_layout()里的参数组合调整,不仅能改按键间距,还能把正方形按键改成矩形:

tm_shape(map_data_full) +
  tm_fill(
    col = "TransmissionClassification", 
    palette = colours, 
    breaks = transmission_levels,
    # 把正方形按键改成矩形,数值越大按键越扁宽
    legend.key.aspect = 5
  ) +
  tm_shape(map_data_borders) +
  tm_borders(col = "black", lwd = 1) +
  tm_layout(
    legend.position = c("left", "top"),
    legend.bg.color = NA,
    legend.key.size = unit(0.2, "cm"),
    legend.key.width = unit(1, "cm"),
    # 控制图例条目间距
    legend.spacing.y = unit(0.5, "cm"),
    legend.title.size = 1.4,
    legend.text.size = 1.2,
    legend.text.fontface = "plain",
    legend.title.fontface = "plain"
  )

内容的提问来源于stack exchange,提问作者Gakku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:47:51