如何使用matplotlib添加簇内各点到对应质心的线段
Matplotlib绘制簇内点到质心连线的实现方法
在matplotlib中可以直接实现该效果,无需额外第三方依赖,你当前使用的「样本点层+质心层」双层叠加的绘图逻辑不需要改动,只需要在两层之间新增连线绘制步骤即可。
- 当前已实现的绘图效果:

- 目标实现效果:

实现逻辑
连线绘制放在样本点绘制完成后、质心绘制前即可,建议给连线设置较低的透明度和较细的线宽,避免遮挡散点本身的展示效果,连线颜色可和对应簇的散点颜色保持一致,视觉上更统一。
基础实现(小数据量适用)
假设你代码中已经定义好以下变量:
X:所有样本点的二维坐标数组,形状为(样本总数, 2)labels:每个样本对应的簇标签数组,形状为(样本总数,)centroids:所有簇的质心坐标数组,形状为(簇总数, 2)
核心代码如下:
import matplotlib.pyplot as plt # 保留你原有的样本散点绘制代码 # plt.scatter(X[:, 0], X[:, 1], c=labels, s=30, edgecolor='k') # 新增:逐簇逐点绘制到质心的连线 for cluster_id in range(len(centroids)): # 筛选当前簇的所有样本点 cluster_pts = X[labels == cluster_id] cx, cy = centroids[cluster_id] # 遍历点画线段 for (x, y) in cluster_pts: plt.plot([x, cx], [y, cy], color=plt.cm.tab10(cluster_id), alpha=0.3, linewidth=1) # 保留你原有的质心绘制代码(放在连线之后,保证质心显示在最上层) # plt.scatter(centroids[:, 0], centroids[:, 1], c='gold', s=200, marker='X', edgecolor='k') # plt.show()
性能优化实现(大数据量适用)
如果单簇样本量过万,逐点循环调用plt.plot会导致绘图变慢,可以使用LineCollection批量生成线段,渲染效率会提升数倍:
from matplotlib.collections import LineCollection segments = [] line_colors = [] for cluster_id in range(len(centroids)): cluster_pts = X[labels == cluster_id] cx, cy = centroids[cluster_id] for (x, y) in cluster_pts: segments.append([(x, y), (cx, cy)]) line_colors.append(plt.cm.tab10(cluster_id)) # 批量添加线段到坐标轴 lc = LineCollection(segments, colors=line_colors, alpha=0.3, linewidth=1) plt.gca().add_collection(lc)
注意:使用
LineCollection时要保证代码执行在坐标轴初始化之后,否则plt.gca()无法获取到当前绘图轴对象。
内容的提问来源于stack exchange,提问作者zay_117
相关产品推荐
相关产品推荐

