seaborn scatterplot绘制DBSCAN聚类结果报错pos_x无法识别
报错原因
你遇到的ValueError: Could not interpret value 'pos_x' for parameter 'x'核心原因是数据类型不匹配:
- 你通过
.to_numpy()把筛选出的pos_x、pos_y两列从pandas DataFrame转成了numpy数组,numpy数组不存在列名属性 - 当你给
sns.scatterplot的x、y参数传入字符串列名时,seaborn要求data参数必须是带列名索引的结构化数据(如pandas DataFrame),无法在numpy数组中匹配到对应列名,就会触发该报错。
修复方法
二选一即可:
方案1:保留DataFrame结构(最贴合你原本的代码逻辑)
去掉.to_numpy()调用,直接用带列名的DataFrame做聚类和绘图输入,修改后可运行代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN dataset = pd.read_csv(r'/Users/file_name.csv') # 移除.to_numpy(),保留DataFrame的列名信息 Data = dataset[["pos_x","pos_y"]] dbscan = DBSCAN() clusters = dbscan.fit(Data) p = sns.scatterplot(data=Data, x="pos_x", y="pos_y", hue=clusters.labels_, legend="full", palette="deep") sns.move_legend(p, "upper right", bbox_to_anchor=(1.17, 1.2), title='Clusters') plt.show()
方案2:保留numpy数组格式,直接传入列数据
如果你后续处理必须用numpy数组格式,绘图时就不要给x、y传字符串列名,直接传入numpy数组对应的列切片即可:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN dataset = pd.read_csv(r'/Users/file_name.csv') Data = dataset[["pos_x","pos_y"]].to_numpy() dbscan = DBSCAN() clusters = dbscan.fit(Data) # numpy数组第0列为pos_x,第1列为pos_y,直接传入数组即可 p = sns.scatterplot(x=Data[:, 0], y=Data[:, 1], hue=clusters.labels_, legend="full", palette="deep") sns.move_legend(p, "upper right", bbox_to_anchor=(1.17, 1.2), title='Clusters') plt.show()
补充说明:DBSCAN的
fit方法既支持pandas DataFrame输入,也支持numpy数组输入,两种改法都不会影响聚类结果。
内容的提问来源于stack exchange,提问作者ttina
相关产品推荐
相关产品推荐

