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

如何在geom_sf中手动设置特定要素颜色且不影响连续刻度?

解决方案

核心思路

无需将sf对象转为数据框,直接通过分层绘制实现需求:先绘制正常范围的区域,再单独绘制需要标红的异常区域,同时固定连续色标的范围。

完整代码

require(sf)
require(ggplot2)

tmp1 <- tempfile()
tmp2 <- tempfile()

download.file("http://api.thenmap.net/v2/se-4/geo/2020-06-03", destfile = tmp1)
download.file("http://api.thenmap.net/v2/se-7/geo/2020-06-03", destfile = tmp2)

county <- read_sf(tmp1)
county$id <- as.numeric(county$id)
county$id[5] <- NA

# 模拟异常值:将id为10和21的郡设为100(对应实际异常值)
county$id[county$id %in% c(10, 21)] <- 100

# 分层绘制
ggplot() +
  # 第一步:绘制所有非异常郡(id≠100),使用连续色标映射
  geom_sf(data = county[county$id != 100, ], aes(fill = id)) +
  # 第二步:绘制异常郡(id=100),直接设置填充色为红色
  geom_sf(data = county[county$id == 100, ], fill = "red", color = "black") +
  # 固定连续色标范围为1-20,同时设置NA值的填充色
  scale_fill_viridis_c(limits = c(1, 20), na.value = "gray80") +
  theme_void()

关键说明

  • 分层绘制逻辑:先画正常区域,再画异常区域,后者会覆盖前者,确保异常郡显示为红色。
  • 色标范围固定:通过scale_fill_viridis_c(limits = c(1, 20))强制色标范围,不受异常值(100)干扰。
  • NA值处理:用na.value设置NA值对应的填充色(示例为浅灰色),保证图面风格统一。
  • 修复geom_polygon问题:你之前的代码把fill="red"放在aes()里,导致ggplot将其识别为离散映射。如果一定要用geom_polygon,需把fill移到aes外面:geom_polygon(data=large, aes(x=lng, y=lat, group=id), fill="red", colour="black"),但用sf原生的geom_sf更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:50:38