Matplotlib绘图求助:多散点图出现多余线条无法消除
嘿,作为刚接触Matplotlib的新手,遇到子图里多余线条的问题太正常啦!我来帮你搞定这个~
首先,我猜你大概率是在绘制子图的时候,要么误用了plt.plot()(它默认会把点连成线),要么没有明确指定用二维特征来做散点图(毕竟iris数据是4维的,直接画肯定出问题)。咱们直接看修正后的完整代码,我会一步步解释:
import matplotlib.pyplot as plt from sklearn import datasets from sklearn import cluster iris = datasets.load_iris() # 先提取iris数据的前两个特征用来可视化(散点图只能展示二维数据) X = iris.data[:, :2] # 设置整个画布的尺寸,让6个子图布局更合理 plt.figure(figsize=(12, 8)) for i in range(1,7): # 初始化KMeans,加random_state保证每次聚类结果一致,方便调试 kmeans = cluster.KMeans(n_clusters=i, random_state=42).fit(X) centers = kmeans.cluster_centers_ labels = kmeans.labels_ plot_nr = 230 + i # 获取当前子图的坐标轴对象,这样绘图只会作用在这个子图上 ax = plt.subplot(plot_nr) # 绘制带聚类标签颜色的散点图,用scatter而不是plot就不会出现连线 ax.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6) # 用红色X标记画出聚类中心,方便观察 ax.scatter(centers[:, 0], centers[:, 1], c='red', marker='X', s=100, label='Centers') # 给每个子图加标题,显示聚类数 ax.set_title(f'KMeans with {i} clusters') ax.legend() # 自动调整子图间距,避免标题、坐标轴标签重叠 plt.tight_layout() plt.show()
关键注意点(解决多余线条的核心):
- 用
scatter而非plot:plt.plot()默认会把所有点按顺序连接起来,这就是你看到多余线条的原因!scatter是专门画散点的,不会产生连线。 - 明确操作单个子图:通过
ax = plt.subplot()拿到子图的坐标轴对象,然后用ax.scatter来绘图,避免不同子图之间的绘图元素互相干扰。 - 只使用二维特征可视化:iris数据集是4维的,你没法直接在散点图里展示4维数据,必须选择两个特征(比如前两个)来绘制,否则会出现各种奇怪的问题。
另外,加个random_state参数能让你的KMeans聚类结果每次都一样,调试起来更方便;plt.tight_layout()能自动调整子图的间距,让整个布局更美观。
内容的提问来源于stack exchange,提问作者mirArnold
相关产品推荐
相关产品推荐

