Python 如何在不重新组织阵列的情况下绘制散布点的图例?

Python 如何在不重新组织阵列的情况下绘制散布点的图例?,python,matplotlib,legend,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', 'pla

带标签的点通常以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放入不同阵列的情况下解决此问题?

首先,您可以找到唯一的标签以及它们所指的点。然后,使用标签打印这些点,而不使用标签打印其他点:

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()

另请参见问题。

请提供一个。@Ffisegydd抱歉,什么是mcve?这是一个指向网页的链接,其中包含mcve的详细信息。@Ffisegydd知道了,mcve添加了我恐怕您的解决方案不正确,图例应该显示一组状态/标签/类别,而不是所有的点标签。例如,我有100万个积分,总共3个等级,图例应该包含所有3个等级,而不是100万个项目。好的,我没有注意到图例中有2个红色条目。我已经更新了答案,现在应该可以满足您的需要了。不过这有点棘手。