【问题标题】:how to plot legend for scatter points without reorganising array?如何在不重新组织数组的情况下绘制散点图例?
【发布时间】:2015-01-07 16:24:26
【问题描述】:

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

【问题讨论】:

  • 请提供MCVE
  • @Ffisegydd 抱歉,mcve 是什么?
  • 那是一个网页链接,里面有什么 MCVE 的详细信息。
  • @Ffisegydd 知道了,添加了 MCVE

标签: python matplotlib legend


【解决方案1】:

首先,您找出唯一标签,以及它们所指的点。然后,您使用标签绘制这些点,而其他没有标签的点:

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问题。

【讨论】:

  • 恐怕您的解决方案不正确,图例应该显示状态/标签/类的集合,而不是所有点标签。例如,我有 100 万个点,总共 3 个类,图例应该包含所有 3 个类,而不是 100 万个项目
  • 好点,我没有注意到图例中有 2 个红色条目。我已经更新了答案,现在应该可以满足您的需求。不过这有点棘手。
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2015-10-27
相关资源
最近更新 更多