如何在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
相关产品推荐
相关产品推荐

