python - 如何将标签与matplotlib颜色条和散点图中的数据相关联
问题描述
我目前有 2d数据X
和. 我正在尝试使用该函数为每个行值分配一个颜色代码点,并使用以下代码使用标签:y
X
scatter
matplotlib
y
X
import matplotlib.pyplot as plt
import numpy as np
classes = 2
zones = (['FEF', 'IT'])
X = np.array([[-1.61160406, 0.06705226],
[-2.34304523, 0.19353161],
[-4.39162911, -0.15401544],
[-1.9107751 , 0.67541723],
[-1.76792646, 0.71884401]])
y= np.array(['c', 'mediumpurple', 'mediumpurple', 'c', 'c'], dtype='<U12')
plt.scatter(X[:, 0], X[:, 1], color=y)
plt.colorbar(ticks=range(classes)).set_ticklabels(zones)
plt.show()
我收到以下错误:
TypeError:您必须首先为可映射的 set_array
解决方案
好的,问题不plt.scatter
在于plt.colorbar
. 这在最初的问题中并不清楚,因为您之前没有包含第二个命令。花了一些评论才发现问题。
问题是您没有创建任何颜色映射,而是试图在没有任何可映射数值到您的颜色映射的情况下显示它。以下解决方案执行以下操作:
- 首先使用 . 在您的颜色数组中找到唯一颜色
np.unique
。 - 然后,使用您定义的颜色创建自定义颜色图
ListedColormap
。这是受到此处提供的解决方案的启发。我赞成它,你也应该。 - 将字符串(颜色)映射到整数。我从这里找到了如何做到这一点。我赞成它,你也应该。
- 最后但并非最不重要的一点是,使用映射值作为自定义创建的颜色映射的颜色。
这是一个完整的解决方案:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
classes = 2
zones = (['FEF', 'IT'])
X = np.array([[-1.61160406, 0.06705226],
[-2.34304523, 0.19353161],
[-4.39162911, -0.15401544],
[-1.9107751 , 0.67541723],
[-1.76792646, 0.71884401]])
y = np.array(['c', 'mediumpurple', 'mediumpurple', 'c', 'c'], dtype='<U12')
cmap = ListedColormap(np.unique(y))
# print (np.unique(y))
# ['c' 'mediumpurple']
# Mapping the colors to numbers
dics = {k: v for v, k in enumerate(sorted(set(y)))}
y_mapped = [dics[x] for x in y]
# print (y_mapped)
# [0, 1, 1, 0, 0]
plt.scatter(X[:, 0], X[:, 1], c=y_mapped, cmap=cmap)
plt.colorbar(ticks=range(classes)).set_ticklabels(zones)
plt.show()
推荐阅读
- xamarin.forms - 在 UiTest 中关闭 SKStoreReviewController
- html - 如何将悬停效果中的文本淡入淡出应用于表格中的图像?
- json - 如何使用 openproject API 获取附件的数据
- angular - 角 4/6 材料滑块,时间刻度滑块 24 小时
- loops - 无法打破python循环
- python - 使用 Python 3 优化删除行
- javascript - 如何解决无法读取属性“长度”?[反应]
- sql - 如何查找表A中的所有列是否存在于表B中
- java - 将 FlatFileItemReaderBuilder 与用于读取文件的特定 API 集成
- java - arrayList 和 Object 数组的不同类型的错误