聚类数据散点图绘制优化:基于簇中心与聚类结果修正脚本
修正聚类散点图的步骤与代码
你的图表混乱核心问题在于簇中心是随机生成的,完全和实际聚类结果不匹配,另外还有几个细节可以优化,让图表更清晰易读。我来一步步帮你修正:
核心问题拆解
- 你用
np.random.randn(1, 2)生成的簇中心是随机值,和你的聚类结果毫无关联,这直接导致中心位置完全错误,图表自然混乱。 - 坐标轴标签用了通用的
x/y,没有体现实际的特征名称,可读性极差。 - 没有添加图例,无法区分不同簇和簇中心的含义。
修正后的完整代码
假设你是用K-Means完成的聚类(如果是其他聚类算法,比如层次聚类,簇中心的获取方式只需稍作调整,核心逻辑一致),下面是完整的可运行代码:
# 先确保完成聚类流程(以K-Means为例) from sklearn.cluster import KMeans import matplotlib.pyplot as plt import numpy as np # 提取用于聚类的特征数据 X = df_diabetes_normalizado[['Glicose', 'Massa Corporal']] # 训练K-Means模型(替换成你确定的最优簇数) kmeans = KMeans(n_clusters=你的最优簇数, random_state=42) df_diabetes_normalizado['clusters'] = kmeans.fit_predict(X) # 获取真实的簇中心(这是解决问题的关键!) centers = kmeans.cluster_centers_ # 提取绘图变量 x = df_diabetes_normalizado['Glicose'] y = df_diabetes_normalizado['Massa Corporal'] Cluster = df_diabetes_normalizado['clusters'] # 绘制散点图 fig = plt.figure(figsize=(14,9)) ax = fig.add_subplot(111) # 绘制数据点,按簇分配颜色,添加透明度让重叠点更清晰 scatter = ax.scatter(x, y, c=Cluster, s=50, cmap='viridis', alpha=0.7) # 绘制簇中心,用大号红色加号标记,确保显眼 ax.scatter(centers[:, 0], centers[:, 1], s=200, c='red', marker='+', label='簇中心') # 设置坐标轴标签(用实际特征名,提升可读性) ax.set_xlabel('Glicose', fontsize=12) ax.set_ylabel('Massa Corporal', fontsize=12) # 添加图例:自动生成簇的标签,同时标记簇中心 handles, labels = scatter.legend_elements(title='簇') ax.legend(handles=handles + [plt.Line2D([], [], marker='+', color='red', linestyle='', markersize=15)], labels=labels + ['簇中心'], loc='upper right') # 显示图表(plt.show()比fig.show()兼容性更好) plt.show()
关键优化点说明
- 使用真实簇中心:通过聚类模型的
cluster_centers_属性获取每个簇的真实中心,彻底解决中心位置错误的问题。 - 视觉与可读性优化:用实际特征名作为坐标轴标签,添加透明度让重叠数据点更清晰,选用友好的颜色映射
viridis。 - 图例完善:自动生成簇的图例,同时给簇中心单独标记,让图表信息一目了然。
- 兼容性提升:用
plt.show()替代fig.show(),在Python脚本、Jupyter Notebook等不同环境下都能正常显示。
如果你的聚类算法不是K-Means,比如层次聚类,只需把获取簇中心的步骤换成计算每个簇的均值即可,核心逻辑保持不变。
内容的提问来源于stack exchange,提问作者Caio Euzébio
相关产品推荐
相关产品推荐

