Matplotlib绘图图例异常:点颜色与图例不匹配
问题解决:按分类数组匹配绘图颜色与图例
你的代码核心问题是每次循环都绘制了全部x、y点,最后还额外叠加了一次所有点的绘制,导致所有点被最后一次的颜色覆盖;而图例因为循环多次添加条目显示了不同颜色,但实际绘图点并没有按z的值分类显示。
错误原因拆解
- 循环
for i in (z2)中,plt.plot(x, y, 'o', label=i)每次都把所有x、y点重复绘制一遍,没有筛选对应z=i的点 - 最后一行
plt.plot(x, y, 'o')再次覆盖所有点的颜色,导致最终所有点颜色完全一致
修正后的代码
import matplotlib.pyplot as plt import numpy as np x = [0.54638897, 0.74436089, 0.36840323, 0.67932601, 0.56410781, 0.20797502, 0.54681392, 0.47598874, 0.33771962, 0.6626352, 0.06115377, 0.37277143, 0.43410935, 0.97386762, 0.69819935, 0.62578862, 0.15594451, 0.43509243, 0.3712351, 0.94039755] y = [0.45281763, 0.85509999, 0.65361185, 0.87928696, 0.00333544, 0.92478824, 0.95129375, 0.15493552, 0.06571068, 0.31728336, 0.58555545, 0.52413135, 0.43512262, 0.91267715, 0.56997665, 0.93413675, 0.57615435, 0.18518019, 0.98207871, 0.99850326] z = [1,1,1,1,5,5,5,11,11,11,1,1,6,6,8,8,11,9,9] # 转为numpy数组,方便使用布尔索引筛选子集 x_np = np.array(x) y_np = np.array(y) z_np = np.array(z) # 获取唯一分类值 z2 = np.unique(z_np) # 遍历每个分类,筛选对应点并绘制 for val in z2: # 生成当前分类的筛选掩码 mask = z_np == val # 只绘制该分类下的x、y点,颜色自动匹配图例 plt.plot(x_np[mask], y_np[mask], 'o', label=val) plt.legend() plt.grid() plt.show()
关键修正点
- 将x、y、z转为numpy数组,利用布尔索引精准筛选对应分类的点
- 循环中通过
mask = z_np == val获取当前分类的点索引,只绘制该分类的子集 - 移除最后多余的全量绘制代码,避免覆盖分类点的颜色
内容的提问来源于stack exchange,提问作者cat_herder
相关产品推荐
相关产品推荐

