如何解决R语言“plot.new has not been called yet”报错问题
解决sf包绘图报错:Error in plot.xy(...) : plot.new has not been called yet
核心问题原因
这个报错通常是绘图顺序错误,或是没正确用add = TRUE实现图层叠加导致的,手动调用plot.new()反而会干扰sf包的自动绘图流程。
正确实现步骤(以北卡罗来纳州地图为例)
直接用以下可运行代码替代教程代码,即可生成带质心的地图:
# 加载sf包 library(sf) # 加载sf自带的北卡罗来纳州矢量数据 nc <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE) # 计算各区域质心 nc_centroids <- st_centroid(nc) # 1. 先绘制区域底图(sf会自动初始化绘图设备) plot(st_geometry(nc), main = "北卡罗来纳州区域与质心") # 2. 叠加质心点,必须添加add = TRUE参数 plot(st_geometry(nc_centroids), add = TRUE, col = "darkred", pch = 19, cex = 0.6)
关键注意事项
- 禁止手动调用plot.new():sf的
plot()方法会自动完成绘图设备初始化,提前调用会导致图层上下文混乱,引发报错。 - 严格遵循绘图顺序:先画底图(区域面),再叠加质心点,叠加时必须指定
add = TRUE,否则会新开绘图窗口,无法实现图层合并。 - 确认质心对象类型:
st_centroid()返回的必须是sf点对象,若手动提取坐标转为普通向量,用points()叠加时要确保底图已绘制完成。
额外排查方向
如果仍报错,检查以下内容:
- 运行
packageVersion("sf")确认版本,低于0.9-0的旧版本可能存在绘图兼容问题,建议更新到最新版。 - 运行
st_is_valid(nc)检查矢量数据是否损坏,确保nc数据集加载正常。
内容的提问来源于stack exchange,提问作者Giulia Petrilli
相关产品推荐
相关产品推荐

