使用Brewer调色板自定义ggplot2分区地图:分组与小数位数优化
问题解决与代码修正
直接把数值型的over30转成因子,会让每个唯一数值都变成独立分组,这就是你遇到分组过多、小数冗余的原因。下面是针对两个问题的解决方法和修正后的完整代码:
解决思路
- 五分位数分组:用
quantile()生成五分位数断点,再用cut()把数值变量分成5个等数量的分组 - 保留两位小数:在生成分组标签时,把区间上下限四舍五入到两位小数后拼接
修正后的完整代码
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
相关产品推荐
相关产品推荐

