sf包生成的plot图形使用locator()选点不准是何原因?
问题背景
确认是否可对plot.sf生成的图形使用locator()函数交互创建新点位。
运行下述示例代码时,点击图中对应位置(例如非蓝色区域的质心位置),locator()返回的坐标数值看似处于合理范围,但将返回坐标转换为sf对象回绘到图上时存在明显偏差,所有选中点均未落在实际点击的对应区域内:
library(sf) nc = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) plot(nc["SID74"], reset = FALSE) pts <- locator() pts <- st_sfc(st_multipoint(do.call(cbind, pts)), crs = st_crs(nc)) plot(pts, add = TRUE, pch = 16)
偏差原因
- 基础函数
graphics::locator()按照当前绘图设备的全局用户坐标系返回坐标,但plot.sf绘制带属性着色的图层时,默认会在绘图区右侧预留约12%的宽度放置色阶图例,实际地理要素仅绘制在左侧88%的横向区域内,全局坐标系没有扣除图例占用的横向空间,直接读取坐标会出现横向偏移。 plot.sf默认强制设置asp=1保证地理要素无变形,地理要素不会完全铺满整个绘图设备的空间,边缘留白区域也会进一步导致基础locator()返回的坐标和实际地理坐标不匹配。
解决方案
- 方案1:绘图时关闭右侧图例,让地理要素铺满全局坐标区,此时基础
locator()返回的坐标可直接使用:
library(sf) nc = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) # key.pos = NULL 参数用于关闭默认色条图例 plot(nc["SID74"], reset = FALSE, key.pos = NULL) pts <- locator() pts <- st_sfc(st_multipoint(do.call(cbind, pts)), crs = st_crs(nc)) plot(pts, add = TRUE, pch = 16, col = "red")
- 方案2:需要保留图例时,直接调用sf包内置的适配版
sf::locator()函数,该函数会自动识别plot.sf的绘图偏移、宽高比设置,返回的坐标本身就是带正确坐标系的sfc对象,无需手动转换:
library(sf) nc = st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) plot(nc["SID74"], reset = FALSE) # 调用sf内置的locator方法,自动适配绘图坐标偏移 pts <- sf::locator() plot(pts, add = TRUE, pch = 16, col = "red")
内容的提问来源于stack exchange,提问作者agila
相关产品推荐
相关产品推荐

