You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2绘制sf对象时如何按因子映射点色、大小并生成对应图例

基于sf对象直接绘制分类映射空间图的实现方法

前置背景

现有完成坐标转换(已执行shp_4283 <- sf::st_transform(shp, crs = 4283))的带经纬度shp格式sf数据,共3个字段,需要将Substrate字段的不同分类因子映射为差异化颜色,匹配对应geometry空间位置绘图,同时自动生成颜色与因子匹配的图例。
此前采用分层叠加geom_sf的代码可正常出图但无法生成图例,调整过程中触发Error in x[j] : invalid subscript type 'list'报错,同时考虑过拆分因子、提取坐标转普通数据框的实现路线。

报错原因

此前的报错由参数位置错误导致:show.legend = "point"是geom_sf()的图层控制参数,原代码中将其写入了subset()的内部参数位,subset()仅接受逻辑型筛选条件,传入其他类型参数会触发下标类型不匹配错误。

最简实现代码

不需要手动拆分图层、不需要提取坐标转普通数据框,直接在aes()中完成字段到视觉属性的映射即可,代码可直接复用原有配色方案:

library(ggplot2)
library(sf)

ggplot() +
  geom_sf(
    data = shp_4283,
    # 核心映射:将颜色、大小属性绑定到Substrate分类字段
    aes(color = Substrate, size = Substrate),
    show.legend = "point"
  ) +
  # 自定义各分类匹配的颜色,和原有分层配色完全一致
  scale_color_manual(
    values = c(
      "Sand" = "yellow",
      "Mixed reef and sand" = "green",
      "None modelled with certainty" = "grey",
      "Reef" = "black"
    ),
    name = "底质类型"
  ) +
  # 自定义各分类匹配的点大小,和原有分层设置一致
  scale_size_manual(
    values = c(
      "Sand" = 1,
      "Mixed reef and sand" = 1,
      "None modelled with certainty" = 2,
      "Reef" = 2
    ),
    guide = "none" # 隐藏大小对应的冗余图例,仅保留颜色图例
  ) +
  coord_sf()

提取坐标转数据框路线的注意事项

如果选择拆分因子、提取坐标的实现路线,需要注意:st_coordinates()仅会返回几何对象的XY坐标矩阵,会丢失包括Substrate在内的所有属性字段,因此确实需要在提取坐标前保留分类字段,再与提取出的坐标结果合并才能正确标记分类。但该路线需要重复筛选、合并操作,效率远低于直接基于sf对象的映射写法,不推荐使用。


内容的提问来源于stack exchange,提问作者rdfleay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:51:21