我试图使用色彩图绘制一组多边形。我设置了一个ScalarMappable对象并从该ScalarMappable生成多边形颜色,但是当我尝试添加一个颜色条时,我收到错误:
TypeError: You must first set_array for mappable
" set_array"的文档并没有真正说什么,所以我一点也不清楚它在做什么,我是否需要给它价值,如果我这样做,它们将会做什么。
任何人都可以解释一下set_array的作用,以及我应该如何处理这个问题?
plt.clf()
fig, ax = plt.subplots(1,1)
# Set color mappable
range_min = df.col1.min()
range_max = df.col1.max()
cmap = matplotlib.cm.ScalarMappable(
norm = mcolors.Normalize(range_min, range_max),
cmap = plt.get_cmap('binary'))
for i in polygonDict.keys():
ax.add_patch(ds.PolygonPatch(polygonDict[i], fc = cmap.to_rgba(df.col1.loc[i])))
fig.colorbar(cmap, ax = ax)
答案 0 :(得分:2)
更简单的方法是将空数组[]
发送到set_array()
。
我真的不知道为什么,但我已经在this answer看到了它,并且它有效。
我唯一知道的是,在您设置数组之前,您会从None
获得get_array()
,这可能是您收到此错误的原因。
你可以这样做:
plt.clf()
fig, ax = plt.subplots(1,1)
# Set color mappable
range_min = df.col1.min()
range_max = df.col1.max()
cmap = matplotlib.cm.ScalarMappable(
norm = mcolors.Normalize(range_min, range_max),
cmap = plt.get_cmap('binary'))
for i in polygonDict.keys():
ax.add_patch(ds.PolygonPatch(polygonDict[i], fc = cmap.to_rgba(df.col1.loc[i])))
cmap.set_array([]) # or alternatively cmap._A = []
fig.colorbar(cmap, ax = ax)
经过几次测试后,您似乎可以将世界上任何数组([df.col1],[0,1],['hello'])发送到set_array()
,并且您的颜色条将是你想要的那个。它不能是None
。
我注意到如果你将数组设置为数字数组,然后调用autoscale()
,颜色条的最小值和最大值将是该数组的最小值和最大值。
我希望这会有所帮助。
答案 1 :(得分:1)
这可能为时已晚,但我今天遇到了同样的问题。
据我所知,imshow()和scatter()创建了一个可映射的对象,可以在两步过程中将浮点值转换为颜色。首先将浮点数映射到范围0..1,然后在颜色映射中查找该标准化数字的相应RGB。
像PolygonPatch这样的艺术家不会创建这个mappable,所以你需要自己使用ColorbarBase()
这是我最终做的事情。
def createColourbar(lwr, upr):
"""Create a colourbar with limits of lwr and upr"""
cax, kw = matplotlib.colorbar.make_axes(mp.gca())
norm = matplotlib.colors.Normalize(vmin = lwr, vmax = upr, clip = False)
c = matplotlib.colorbar.ColorbarBase(cax, cmap=mp.spectral(), norm=norm)
return c
答案 2 :(得分:0)
这似乎已在matplotlib v3.1.0中修复(在v3.0.2中不起作用)。