R语言如何计算向量分位数与自然断点实现数据分类
城市化率5类分群实现方案
你之前使用的切分逻辑是按向量的存储位置每4个元素硬分一组,完全没有参考数值本身的分布特征,得到的分类自然不符合配色映射的需求。针对分布差异大的城市化率数据,下面两种方法都可以输出和输入长度一致、仅含5个唯一分类值的结果,直接对接绘图配色即可。
方法1:分位数分类(等样本量分组)
不需要额外安装依赖,核心逻辑是按数值的20%分位、40%分位…100%分位切分,保证每个分类下的样本数量基本均匀,适合需要各组样本数平衡的绘图场景。
# 示例向量测试,实际使用时替换为你的数据字段即可 myVec <- c(0.2, 0.6, 0.34, 0.78, 0.66, 0.5, 0.8, 0.99) # 计算5类对应的分位数断点 break_q <- quantile( network_object$nodes$X.Urban, # 替换成你的实际字段 probs = seq(0, 1, 0.2), na.rm = TRUE ) # 为每个元素分配分类标签 urban_class_q <- cut( network_object$nodes$X.Urban, breaks = break_q, include.lowest = TRUE, # 确保最小值被纳入第一组,避免出现NA labels = c("极低城市化率", "较低城市化率", "中等城市化率", "较高城市化率", "极高城市化率") ) # 结果校验 length(urban_class_q) # 和原向量长度一致,你的数据对应长度为99 length(unique(urban_class_q)) # 唯一分类值固定为5
如果遇到数据重复值多、分位点重合的情况,可以调整quantile()的type参数(取值1-9,默认是7),即可得到不重叠的断点。
方法2:自然间断点(Jenks)分类(适配偏态分布)
这是社会经济类数据绘图最常用的分类方法,算法会自动寻找数据中数值差异最大的位置作为断点,实现组内差异最小、组间差异最大的效果,完美适配你提到的“数据分布差异大”的场景,需要借助classInt包实现。
# 首次使用先安装包 # install.packages("classInt") library(classInt) # 计算自然断点 break_jenks <- classIntervals( network_object$nodes$X.Urban, n = 5, style = "jenks", na.rm = TRUE )$brks # 分配分类标签 urban_class_jenks <- cut( network_object$nodes$X.Urban, breaks = break_jenks, include.lowest = TRUE, labels = c("极低城市化率", "较低城市化率", "中等城市化率", "较高城市化率", "极高城市化率") ) # 结果校验 length(urban_class_jenks) # 与原向量长度一致 length(unique(urban_class_jenks)) # 固定返回5个分类
注意:如果原始数据存在缺失值,保留代码中的
na.rm = TRUE参数即可,打标签时缺失值会自动保留为NA,不会改变向量总长度,也不影响绘图时的配色映射。输出的分类向量可以直接传入ggplot2等绘图包的aes(fill=)或aes(color=)参数,自动按类别分配配色。
内容的提问来源于stack exchange,提问作者griff123
相关产品推荐
相关产品推荐

