如何调整plot.sf中颜色图例的宽高参数?(仿spplot实现)
如何调整plot.sf颜色图例的宽高(类似spplot的效果)
你说的没错——plot.sf自带的图例控制参数确实有点受限:当设置key.pos=1(底部图例)时,key.size只能调整高度,没法直接像spplot那样同时指定宽高。不过有三种实用的方法可以解决这个问题:
方法1:用sf原生参数(新版本推荐)
如果你的sf版本是1.0.0及以上,其实已经新增了key.width参数,可以直接和key.size配合,同时控制图例的宽高,用法和spplot的逻辑非常接近:
library(sf) nc_sf <- st_read(system.file("shape/nc.shp", package="sf")) plot(nc_sf["AREA"], main = "sf with custom legend size", key.pos = 1, key.size = lcm(1.2), # 控制图例高度(厘米单位) key.width = lcm(8)) # 控制图例宽度(厘米单位)
你可以根据需求调整lcm()里的数值,轻松实现和spplot一样的宽高控制效果。
方法2:调整绘图边距间接控制(兼容旧版本)
如果你的sf版本比较旧,不支持key.width,可以通过调整绘图边距来间接扩大图例的宽度。plot.sf的图例会占用绘图区域的边距空间,我们用par(mar)扩大底部边距后,图例就能横向展开:
library(sf) nc_sf <- st_read(system.file("shape/nc.shp", package="sf")) # 调整底部边距(第一个数值代表底部边距,单位是行) par(mar = c(6, 4, 4, 2) + 0.1) plot(nc_sf["AREA"], main = "sf with adjusted legend width via mar", key.pos = 1, key.size = lcm(1.2)) # 控制高度,宽度由边距空间决定
这种方法不需要额外依赖包,适合快速调整旧版本的图例效果。
方法3:手动绘制图例(完全自定义)
如果需要极致的控制(比如精确到像素的尺寸、自定义刻度样式),可以先隐藏默认图例,再用基础绘图工具手动添加:
library(sf) library(fields) # 需要先安装:install.packages("fields") nc_sf <- st_read(system.file("shape/nc.shp", package="sf")) # 先绘制地图,不显示默认图例 plot(nc_sf["AREA"], main = "sf with fully custom legend", key.pos = NULL) # 获取数据范围和颜色映射 area_minmax <- range(nc_sf$AREA) color_palette <- sf.colors(10) # 手动添加底部图例,精确控制宽高 image.plot( zlim = area_minmax, col = color_palette, legend.only = TRUE, horizontal = TRUE, legend.width = 8, # 宽度(单位:字符) legend.height = 1, # 高度(单位:字符) mar = c(3, 0, 0, 0), axis.args = list(at = seq(area_minmax[1], area_minmax[2], length.out = 5)), xpd = TRUE, plot.axes = axis(1, at = seq(area_minmax[1], area_minmax[2], length.out = 5)) )
这种方法完全脱离plot.sf的默认图例系统,灵活性和spplot不相上下,适合需要高度定制的场景。
小总结
- 新版本
sf直接用key.width + key.size就能快速搞定,最方便; - 旧版本可以通过调整
par(mar)间接控制宽度; - 追求极致自定义就手动绘制图例。
内容的提问来源于stack exchange,提问作者user3715135
相关产品推荐
相关产品推荐

