Python3如何绘制39个不同颜色的K-means聚类散点图并解决相关报错
问题原因
- 直接报错的根源是你错误使用了
enumerate()函数:enumerate(cluster_labels)返回的是(索引值, 聚类标签)的元组,你拿这个元组作为key去颜色字典里查询,自然会触发KeyError。 - 即便去掉
enumerate(),原有逻辑依然有问题:mcolors.BASE_COLORS和mcolors.CSS4_COLORS的key都是字符串格式的颜色名(比如'red'、'skyblue'),而聚类标签是0-38的整数,直接拿整数去查字符串为key的字典,依然会报错。 - 额外注意:你绘制散点图的时候经纬度坐标传反了,经度(LONG)应该作为x轴,纬度(LAT)作为y轴,否则点位位置会出错。
解决方法
不用自己手动构建颜色映射,matplotlib的scatter方法原生支持直接传入类别标签作为颜色依据,只需指定c参数为聚类标签,再搭配一个支持多色的颜色映射表(cmap)即可,39个类别推荐用hsv色系,它可以生成任意数量差异明显的颜色。
修正后代码
# K-means客户聚类 from sklearn.cluster import KMeans import matplotlib.pyplot as plt km_model = KMeans(n_clusters=39, random_state=42) # 加random_state保证结果可复现 cluster_labels = km_model.fit_predict(hvc_hvposition[["LAT", "LONG"]]) # fit_predict等价于fit+predict,更简洁 # 绘制点位 plt.figure(figsize=(8, 8)) # 先画底图邮编点位,用浅灰避免抢主点位的视觉焦点 plt.scatter(postcodes_df["LONG"], postcodes_df["LAT"], s=2, color='lightgray') # 画客户点位,按聚类标签着色 plt.scatter(hvc_hvposition["LONG"], hvc_hvposition["LAT"], c=cluster_labels, cmap='hsv', s=6) # 可选:加颜色条对应聚类标签 plt.colorbar(label='聚类标签') plt.xlabel('经度') plt.ylabel('纬度') plt.show()
如果你一定要手动生成颜色列表,可以用以下方式实现:
from matplotlib import cm import numpy as np # 生成39个不同的颜色 color_list = cm.hsv(np.linspace(0, 1, 39)) # 每个样本对应自己聚类标签的颜色 cluster_colors = [color_list[label] for label in cluster_labels]
内容的提问来源于stack exchange,提问作者MRT
相关产品推荐
相关产品推荐

