如何利用聚类数组在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
相关产品推荐
相关产品推荐

