如何让tmap图例适配下标、斜体等文本格式?
tmap图例用expression()格式化后右侧多余空白的解决办法
问题描述
在tmap中使用expression()为图例标题添加下标、斜体等格式时,图例框右侧会出现大量不必要的空白,而普通文本标题的图例框能正常适配内容。
问题重现代码
library(tmap) library(sf) # 加载测试数据 nc <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE) # 正常图例(无空白) map1 <- tm_shape(nc) + tm_polygons("AREA", title = "Area[avg] (km^2)") + tm_layout(bg.color = "grey", legend.frame = TRUE, legend.bg.color = "white") # 有多余空白的图例(使用expression格式化) map2 <- tm_shape(nc) + tm_polygons("AREA", title = expression(Area[avg]~(italic(km)^2))) + tm_layout(bg.color = "grey", legend.frame = TRUE, legend.bg.color = "white")
已尝试的无效方案
tm_layout(legend.width):无法覆盖系统自动检测的最小宽度- 调整全局字体参数:会影响整个图例标题,无法针对性解决空白问题
tm_credit():添加的内容始终被图例遮挡- 空白标题+
grid.text手动加标签:难以精准调整间距,适配性差 - 用引号内空格替代
~:对减少空白几乎无效 - 使用
as.expression(bquote()):多余空白问题仍存在 - 移除图例边框/背景色:不符合实际需求
有效解决方法
方法1:强制指定图例宽度+调整内边距
通过tm_layout手动设置图例宽度,并调整内边距压缩空白,结合str2expression生成格式化标题:
map_fixed <- tm_shape(nc) + tm_polygons("AREA", title = str2expression("Area[avg]~(italic(km)^2)")) + tm_layout( bg.color = "grey", legend.frame = TRUE, legend.bg.color = "white", legend.width = 0.2, # 按需调整数值 legend.inner.margin = 0.1 # 缩小内边距减少空白 )
方法2:用grid包修改图例组件
先绘制地图,再通过grid包获取图例对象并修改其宽度:
library(grid) # 绘制存在问题的地图 print(map2) # 获取图例背景的grob对象 legend_bg <- grid.get("legend.bg") # 修改宽度(数值按需调整) legend_bg$width <- unit(0.2, "npc") # 重新绘制图例 grid.draw(legend_bg)
方法3:转为交互式leaflet地图(可选)
如果业务允许使用交互式地图,转为leaflet后图例宽度会自动适配内容:
tmap_leaflet(map2)
内容的提问来源于stack exchange,提问作者Chris Shipway
相关产品推荐
相关产品推荐

