我目前在X
中每行有2d数据y
和颜色代码的1d向量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
答案 0 :(得分:1)
好的,问题不在plt.scatter
中,而在plt.colorbar
中。从最初的问题并不清楚,因为您之前没有包含第二个命令。找到一些问题需要一些评论。
问题是您没有创建任何颜色图,而是试图显示它而没有任何可映射的数值到颜色图。下面的解决方案执行以下操作:
np.unique
在颜色阵列中找到唯一的颜色。ListedColormap
根据定义的颜色创建自定义颜色图。这是受here提供的解决方案的启发。我赞成,你也应该赞成。 这是一个完整的解决方案:
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()