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

如何利用聚类数组在Matplotlib的pcolor特征网格中绘制簇边界线

在特征网格图上绘制聚类边界的实现方法

完全可以实现,核心思路是先找出聚类数组中相邻元素聚类标签不同的位置,然后在特征网格的对应坐标上绘制边界线。以下是修改后的完整代码:

import numpy as np
import matplotlib.pyplot as plt

clusters = np.array([[0,2,1], [0,3,1], [3,3,1]]) # 聚类数据
features= np.array([[0,0.4,0.7], [0.1,0.3,0.7], [0.5,0.4,0.8]]) # 特征数据

# 绘制聚类图(保留原代码)
plt.figure()
plt.pcolor(clusters, cmap='jet')
plt.colorbar(ticks=[i for i in range(0, np.amax(clusters)+1)])
plt.show()

# 绘制带聚类边界的特征网格图
plt.figure()
plt.pcolor(features, cmap='bone', vmin=0, vmax=1)
plt.colorbar()

# 提取聚类数组的行列数
rows, cols = clusters.shape

# 绘制水平方向的边界(列之间的垂直线)
for i in range(rows):
    # 找出当前行中相邻聚类标签不同的位置
    diff_cols = np.where(clusters[i, :-1] != clusters[i, 1:])[0]
    for j in diff_cols:
        # 在网格的(j+1, i)到(j+1, i+1)位置绘制垂直线
        plt.plot([j+1, j+1], [i, i+1], color='red', linewidth=2)

# 绘制垂直方向的边界(行之间的水平线)
for j in range(cols):
    # 找出当前列中相邻聚类标签不同的位置
    diff_rows = np.where(clusters[:-1, j] != clusters[1:, j])[0]
    for i in diff_rows:
        # 在网格的(j, i+1)到(j+1, i+1)位置绘制水平线
        plt.plot([j, j+1], [i+1, i+1], color='red', linewidth=2)

# 调整坐标轴范围,确保边界线完全显示
plt.xlim(0, cols)
plt.ylim(0, rows)
plt.gca().invert_yaxis() # pcolor默认y轴反向,保持和原图一致
plt.show()

关键逻辑说明:

  • 水平边界检测:遍历每一行,对比相邻列的聚类标签,若不同则在两列之间的垂直线位置(x=j+1)绘制红色竖线。
  • 垂直边界检测:遍历每一列,对比相邻行的聚类标签,若不同则在两行之间的水平线位置(y=i+1)绘制红色横线。
  • 调用invert_yaxis()是为了匹配pcolor默认的左上角原点坐标体系,保证可视化方向和原图一致。

运行代码后,特征网格图上会自动用红色线条标出不同聚类簇之间的边界,符合需求。

内容的提问来源于stack exchange,提问作者Bas R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:35:05