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

R语言使用usmaps包结合ggplot2自定义分箱与配色问题求解

问题原因及解决方案

第一次代码失效原因

  • 你调用的scale_colour_gradientn调整的是图形的描边颜色,而plot_usmap的分级填充映射的是fill美学,二者完全不匹配
  • 你设置的色阶范围limits = c(0, 100)远大于你的实际数据最大值(0.4),色阶映射完全错位

第二次代码仅显示3个分箱的原因

scale_fill_brewer默认会自动丢弃没有对应观测值的分箱因子水平,如果你当前数据集里没有落在0.3以上区间的州数据,对应分箱就会被自动隐藏不显示。

修复方案

方案1:保留所有分箱水平(推荐)

修改scale_fill_brewer参数,添加drop = FALSE强制保留所有分箱水平,同时可以自定义分箱标签提升可读性:

# 提前分箱时可以直接指定有序因子,自定义区间标签更清晰
Ces_State_only$Ninety_bin <- cut(
  Ces_State_only$`1990`,
  breaks = c(0,0.2, 0.25, 0.3, 0.33, 0.36, 1),
  labels = c("0-0.2", "0.2-0.25", "0.25-0.3", "0.3-0.33", "0.33-0.36", ">0.36"),
  ordered_result = TRUE
)

plot_usmap(data = Ces_State_only, values = "Ninety_bin") + 
  scale_fill_brewer(
    palette = "Blues", 
    aesthetics = "fill", 
    na.value = "grey50",
    drop = FALSE, # 核心参数:强制保留所有分箱水平,哪怕无数据
    name = "1990年数值" # 可以自定义图例标题
  ) + 
  theme(legend.position = "right")

方案2:无需提前分箱,用连续色阶实现离散断点效果

如果不想提前处理数据,也可以直接用scale_fill_binned实现分箱效果,代码更简洁:

plot_usmap(data = Ces_State_only, values = "1990") + 
  scale_fill_binned(
    type = "seq",
    palette = "Blues",
    breaks = c(0,0.2, 0.25, 0.3, 0.33, 0.36, 1),
    limits = c(0, 1),
    na.value = "grey50",
    name = "1990年数值"
  ) + 
  theme(legend.position = "right")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:39:02