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

使用Brewer调色板自定义ggplot2分区地图:分组与小数位数优化

问题解决与代码修正

直接把数值型的over30转成因子,会让每个唯一数值都变成独立分组,这就是你遇到分组过多、小数冗余的原因。下面是针对两个问题的解决方法和修正后的完整代码:

解决思路

  1. 五分位数分组:用quantile()生成五分位数断点,再用cut()把数值变量分成5个等数量的分组
  2. 保留两位小数:在生成分组标签时,把区间上下限四舍五入到两位小数后拼接

修正后的完整代码

library(ggplot2)

# 先计算over30的五分位数断点(包含0%、20%、40%、60%、80%、100%分位点)
quantile_breaks <- quantile(df_regions_ofcom$over30, probs = seq(0, 1, 0.2), na.rm = TRUE)

# 对over30按五分位数分箱,生成带两位小数标签的因子列
df_regions_ofcom$over30_grouped <- cut(
  df_regions_ofcom$over30,
  breaks = quantile_breaks,
  include.lowest = TRUE,  # 确保最小值被包含在第一个分组里
  labels = mapply(
    function(lower, upper) paste0(round(lower, 2), " - ", round(upper, 2)),
    quantile_breaks[-length(quantile_breaks)],  # 取每个区间的下限
    quantile_breaks[-1]  # 取每个区间的上限
  )
)

# 绘制地图
ggplot() +
  geom_polygon(
    data = df_regions_ofcom,
    aes(x = long, y = lat, group = group, fill = over30_grouped),
    color = "black",
    size = 0.1
  ) +
  theme_void() +
  labs(
    title = "英格兰地区下载速度超30Mbps线路占比(2022年5月)",
    caption = "数据来源:Ofcom",
    fill = "占比区间"  # 给图例加明确标题
  ) +
  theme(
    text = element_text(family = "A"),
    plot.title = element_text(size = 14, hjust = 0.01, face = "bold"),
    plot.caption = element_text(size = 12, hjust = 0.01),
    legend.title = element_text(size = 10, face = "bold"),
    legend.text = element_text(size = 10),
    legend.spacing.y = unit(.3, "cm")
  ) +
  scale_fill_brewer(palette = "BuGn")

关键细节说明

  • 用quantile()生成的断点能保证每个分组的样本数量大致相等,符合五分位数的要求
  • include.lowest = TRUE避免最小值因精度问题被排除在第一个分组外
  • mapply()遍历断点对,把每个区间的上下限格式化为两位小数后拼接成标签,解决小数冗余问题
  • 新增的over30_grouped列专门用于绘图,保留原始over30数值变量方便后续其他分析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:15:04