如何确定使用matplotlib.pyplot.imshow()时的颜色?

4

我正在使用imshow()来绘制一个二维的numpy数组,例如:

my_array = [[ 2.  0.  5.  2.  5.]
            [ 3.  2.  0.  1.  4.]
            [ 5.  0.  5.  4.  4.]
            [ 0.  5.  2.  3.  4.]
            [ 0.  0.  3.  5.  2.]]

plt.imshow(my_array, interpolation='none', vmin=0, vmax=5)

这张图片是这样绘制的:

enter image description here

然而,我想要做的是更改颜色,例如0为红色,1为绿色,2为橙色,你知道我的意思吗?有没有办法实现这个功能,如果可以,怎么做?

我尝试通过更改颜色映射中的条目来实现此目的,就像这样:

    cmap = plt.cm.jet
    cmaplist = [cmap(i) for i in range(cmap.N)]
    cmaplist[0] = (1,1,1,1.0)
    cmaplist[1] = (.1,.1,.1,1.0)
    cmaplist[2] = (.2,.2,.2,1.0)
    cmaplist[3] = (.3,.3,.3,1.0)
    cmaplist[4] = (.4,.4,.4,1.0)
    cmap = cmap.from_list('Custom cmap', cmaplist, cmap.N)

但我发现它并不像我预期的那样工作,因为0等于颜色映射中的第一个条目,但1(例如)不等于颜色映射中的第二个条目,因此只有0被绘制成了不同的颜色: enter image description here

1
你需要自己创建离散的颜色映射。请参考这个问题 - areuexperienced
@areuexperienced 我尝试使用那个来更改颜色映射,但它并没有按预期工作。例如,将第一个颜色条目更改为 (1, 1, 1, 1.0) 可以按预期工作;我的 numpy 数组中的 0 会被绘制为一个白色块。然而,我认为更改第二个颜色条目会对应于我的 numpy 数组中的 1,但事实并非如此。因此,更改它们实际上不会影响颜色;1-5 的颜色保持不变。 - Amos
1个回答

10

我认为最简单的方法是使用ListedColormap,并可选择使用BoundaryNorm来定义bins。假设你已经有了上面提到的数组:

import matplotlib.pyplot as plt
import matplotlib as mpl

colors = ['red', 'green', 'orange', 'blue', 'yellow', 'purple']
bounds = [0,1,2,3,4,5,6]

cmap = mpl.colors.ListedColormap(colors)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

plt.imshow(my_array, interpolation='none', cmap=cmap, norm=norm)

由于您的数据值与颜色的边界一一映射,因此标准化器是多余的。但我包含它是为了展示如何使用它。例如,当您想要将值0、1、2显示为红色,3、4、5显示为绿色等时,您可以将边界定义为[0,3,6...]。

输入图像描述


这段代码在我的macOS 12.0.1上,使用Python 3.8.13和matplotlib 3.3.4并没有绘制任何内容。 - Hang Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接