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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:25:33