【问题标题】:How to determine the colours when using matplotlib.pyplot.imshow()?使用 matplotlib.pyplot.imshow() 时如何确定颜色?
【发布时间】:2015-09-24 16:06:35
【问题描述】:

我使用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)

绘制此图像:

然而,我想做的是改变颜色,例如 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 被绘制不同:

【问题讨论】:

  • 您需要制作自己的离散色图。见this question
  • @areuexperienced 我已经尝试使用它来更改颜色图,但它没有按预期工作。例如,将第一个颜色条目更改为 (1, 1, 1, 1.0) 可以按预期工作;我的 numpy 数组中的 0 被绘制为白色块。但是,我认为更改第二个颜色条目将对应于我的 numpy 数组中的 1,但事实并非如此。所以改变它们实际上并不会影响它的颜色; 1-5 保持相同的颜色。

标签: python matplotlib colors draw


【解决方案1】:

我认为最简单的方法是使用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)

因为您的数据值与颜色边界一对一地映射,所以normalizer 是多余的。但我已经包含它来展示它是如何使用的。例如,当您希望值 0,1,2 为红色,3,4,5 为绿色等时,您可以将边界定义为 [0,3,6...]。

【讨论】: