Matplotlib ScalarMappable:如果规范设置,为什么需要set_array()?

时间:2015-03-02 02:24:47

标签: python matplotlib

我试图使用色彩图绘制一组多边形。我设置了一个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)

3 个答案:

答案 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中不起作用)。