如何在不重组数组的情况下绘制散点图例?

时间:2015-01-07 16:24:26

标签: python matplotlib legend

带标签的点通常以X,y形式显示

X是一个多维数组,y是属于X

的每个点的标签/类

我想做什么:

import matplotlib.pyplot as plt
import numpy as np

X = [[0,1],[1,2],[2,3],[3,4]]
X = np.array(X)

y = np.array([0,0,1,2])


myCmap = np.array(['r', 'g', 'b'])
myLabelMap = np.array(['car', 'bicycle', 'plane'])

plt.scatter(X[:, 0], X[:, 1], color=myCmap[y], label=myLabelMap[y])
plt.legend(loc='upper right')

plt.show()

然而,这会搞乱传奇,正如您在传奇部分中所看到的那样,它会绘制所有点的所有标签。

有没有办法解决这个问题而不将X放入不同的数组?

1 个答案:

答案 0 :(得分:0)

首先,您会找到唯一标签及其引用的点。然后,您可以使用标签绘制这些点,而不使用标签绘制其他点:

import matplotlib.pyplot as plt
import numpy as np

X = [[0,1],[1,2],[2,3],[3,4]]
X = np.array(X)

y = np.array([0,0,1,2])


myCmap = np.array(['r', 'g', 'b'])
myLabelMap = np.array(['car', 'bicycle', 'plane'])

y_unique,id_unique = unique(y,return_index=True)
X_unique = X[id_unique]
X = asarray(X,dtype=float)

for j,yj in enumerate(y_unique):
    plt.scatter(X_unique[j, 0], X_unique[j, 1], color=myCmap[yj], label=myLabelMap[yj])

X[id_unique] = nan
plt.scatter(X[:, 0], X[:, 1], color=myCmap[y])

plt.legend(loc='upper right')

plt.show()

另见this问题。