matplotlib绘制6维PSNR数据触发Unrecognized marker style错误如何解决
错误诱因
你遇到的报错完全是plt.scatter()参数传错导致的:plt.scatter()的位置参数规则为前两个参数分别是x轴、y轴的坐标数据,第三个位置参数对应点的大小s,第四个对应点的颜色c,第五个参数对应点的样式marker。你直接将6个维度的数组依次传入作为位置参数,第五个位置传入的psnr_bitrate[:,4]数组被matplotlib识别为marker参数,而marker仅支持单个字符串(比如'o'/'^')、坐标点序列等合法格式,传入数值数组自然触发格式错误。
scatter绘制6维数据的可行性问题
普通二维画布的散点图原生仅支持两个维度的坐标映射,直接传6个维度作为位置参数不符合scatter的API定义,完全无法正常运行。如果要在散点图上展示多维度信息,可以将额外维度映射到散点的颜色、大小、透明度、样式等视觉属性上,或者先做降维处理。
正确的可视化方案
推荐两种常用方案,你可以根据需求选择:
方案1:降维后展示聚类结果(最常用)
先通过PCA或者t-SNE算法将6维数据降到2维,再用散点图展示,用颜色区分聚类标签,示例代码如下:
import numpy as np import glob import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans from sklearn.decomposition import PCA # 原数据读取和聚类代码 psnr_bitrate=np.vstack([np.loadtxt(path, dtype='float') for path in glob.iglob(r'E:/UGC/*.txt')]) scaler = StandardScaler() scaled_features = scaler.fit_transform(psnr_bitrate) kmeans = KMeans(init="random",n_clusters=3,n_init=10,max_iter=300,random_state=42) kmeans.fit(scaled_features) y_kmeans = kmeans.predict(scaled_features) # 降维到2维 pca = PCA(n_components=2) reduced_features = pca.fit_transform(scaled_features) # 绘制聚类结果 plt.scatter(reduced_features[:, 0], reduced_features[:, 1], c=y_kmeans, s=50, cmap='viridis') plt.xlabel('PCA主成分1') plt.ylabel('PCA主成分2') plt.title('6维PSNR数据K-Means聚类结果') plt.show()
方案2:多视觉属性映射保留原始维度
如果需要保留原始维度的物理意义,可以将不同维度映射到散点的不同视觉属性,示例:
# 以x=第0列、y=第1列,大小映射第2列,颜色映射聚类标签为例 plt.scatter( x=psnr_bitrate[:, 0], y=psnr_bitrate[:, 1], s=psnr_bitrate[:, 2] * 10, # 缩放数值到合适的点大小范围 c=y_kmeans, cmap='viridis', alpha=0.7 # 透明度映射可选,可对应第3列数据 ) plt.xlabel('维度0') plt.ylabel('维度1') plt.show()
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

