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

新手求教:如何绘制K-Means聚类图并导出画布?

K-Means新手问题解答:聚类图绘制与画布导出

你的现有代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import cdist
# gonna change k into a input
np.random.seed(14)
n = 20
p = 3
k = 3 
x = np.random.random((n,p))
plt.scatter(x[:,0], x[:,1])
centers = x[np.random.choice(n, k, replace=False)]
((x[0]-centers[0])**2).sum()**0.5
((x-centers[0])**2).sum(axis=1)
((x.reshape(n,1,p)-centers.reshape(1,k,p))**2).sum(axis=2)**0.5
distances = np.zeros((n,k))
for i in range(k):
    distances[:,i] = ((x-centers[i])**2).sum(axis=1)**0.5
distances
distances = cdist(x, centers)
closest = np.argmin(distances, axis=1)
x[closest == 0].mean(axis=0)
for i in range (k):
    centers[i, :] = x[closest == i].mean(axis=0)
centers
np.random.seed(4160659)
centers = x[np.random.choice(n, k, replace=False)]
closest = np.zeros(n).astype(int)
while True:
    old_closest = closest.copy()
    print(closest)
    distances = cdist(x, centers)
    closest = np.argmin(distances, axis=1)

    for i in range (k):
        centers[i, :] = x[closest == i].mean(axis=0)
    
    if all(closest == old_closest):
        break
plt.scatter(x[:,0],x[:,1],c=closest)
plt.xlabel('age')
plt.ylabel('income ($)')

1. 如何绘制K-Means聚类图?

你代码最后一行的plt.scatter(x[:,0],x[:,1],c=closest)其实已经完成了基础聚类图的绘制——c=closest会根据每个样本所属的簇,给点染上不同颜色,直接区分开各个聚类。

如果想让图更直观,还可以加几个实用优化:

  • 标记聚类中心:把计算出的聚类中心用更显眼的样式画出来,比如红色大叉,一眼就能看到每个簇的核心位置:
    plt.scatter(centers[:,0], centers[:,1], c='red', marker='X', s=200, label='聚类中心')
    
  • 添加图例:让看图的人明确知道不同元素的含义:
    plt.legend()
    
  • 添加标题:给图加个清晰的主题,方便理解:
    plt.title('K-Means聚类结果(年龄vs收入)')
    

把这些补充到你现有绘图代码后,最终的绘图段会变成:

plt.scatter(x[:,0],x[:,1],c=closest)
plt.scatter(centers[:,0], centers[:,1], c='red', marker='X', s=200, label='聚类中心')
plt.xlabel('age')
plt.ylabel('income ($)')
plt.title('K-Means聚类结果(年龄vs收入)')
plt.legend()
# 需要显示图的话就加下面这句
# plt.show()

2. 如何导出(打印)画布?

用Matplotlib自带的plt.savefig()函数就能直接把画布导出成图片文件,操作非常简单:

在所有绘图代码的最后(注意要放在plt.show()之前,因为plt.show()会清空画布)添加这句:

plt.savefig('kmeans聚类图.png', dpi=300, bbox_inches='tight')

参数说明:

  • 'kmeans聚类图.png':自定义的保存文件名和格式,支持png、jpg、pdf等,改后缀即可切换格式。
  • dpi=300:设置图片分辨率,数值越高越清晰,300dpi足够用于打印或高清分享。
  • bbox_inches='tight':避免图中的轴标签、标题被切掉,保证完整导出所有内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:05:25