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
相关产品推荐
相关产品推荐

