Matplotlib ScalarMappable:如果norm set,为什么需要设置_array()?

2024-10-02 06:25:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用彩色地图绘制一组多边形。我设置了一个ScalarMappable对象并从该ScalarMappable生成多边形颜色,但是当我尝试添加一个colorbar时,我得到了一个错误:

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)

Tags: dfforrangepltaxmin多边形array
3条回答

一种更简单的方法是将空数组[]发送到set_array()。 我真的不知道为什么,但我在this answer中看到过,而且很有效。

我只知道在设置数组之前,从get_array()中得到None,这可能就是为什么会得到这个错误。

你可以:

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(),而您的colorbar就是您想要的那个。它不可能是None

我注意到,如果将数组设置为数字数组,然后调用autoscale(),那么colorbar的min和max值将是该数组的min和max。

我希望这能有帮助。

这似乎已经在matplotlib v3.1.0中修复(在v3.0.2中不起作用)。

这可能太晚了,但我今天碰到了同样的问题。

据我所知,imshow()和scatter()创建了一个可映射对象,以便在两步过程中从浮点值转换为颜色。首先将浮点数映射到范围0..1,然后在颜色映射中查找该标准化数字的相应RGB。

像PolygonPatch这样的艺术家不会创建这个可映射的,所以您需要自己使用colorbabase()来创建它

这就是我最后做的。

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

相关问题 更多 >

    热门问题