pcolor的自定义颜色贴图

时间:2016-05-13 06:58:13

标签: python matplotlib

我正在关注documentation创建自定义颜色贴图。我想要的地图如下所示:

enter image description here

这是我提出的词典:

   cdict = {'red':   ((0.00,  0.0, 0.0),
               (0.25,  1.0, 0.0),
               (0.50,  0.0, 0.0),
               (0.75,  1.0, 0.0),
               (1.00,  1.0, 0.0)),

     'green': ((0.00,  0.0, 0.0),
               (0.25, 1.0, 1.0),
               (0.50, 1.0, 1.0),
               (0.75, 1.0, 1.0),
               (1.00,  0.0, 0.0)),

     'blue':  ((0.00,  1.0, 1.0),
               (0.25,  0.0, 0.0),
               (1.00,  0.0, 0.0))
    }

但它没有给我我想要的结果。例如,值0.5使用红色呈现。

以下是代码的其余部分:

cmap = LinearSegmentedColormap('bgr', cdict)
plt.register_cmap(cmap=cmap)

plt.pcolor(dist, cmap='bgr')
plt.yticks(np.arange(0.5, len(dist.index), 1), dist.index)
plt.xticks(np.arange(0.1, len(dist.columns), 1), dist.columns, rotation=40)

for y in range(dist.shape[0]):
    for x in range(dist.shape[1]):
        plt.text(x + 0.5, y + 0.5, dist.iloc[y,x],
                 horizontalalignment='center',
                 verticalalignment='center', rotate=90
                 )
plt.show()

以下是渲染热图的示例:

enter image description here

我错过了什么?

2 个答案:

答案 0 :(得分:1)

0.5在你的情节中显示为红色的原因可能只是因为你的vminvmax不是0.0和1.0。大多数matplotlib 2D绘图程序默认情况下将vmax设置为数组中的最大值,在您的情况下看起来像是0.53。如果您希望0.5为绿色,请在vmin=0.0, vmax=1.0的调用中设置pcolor

你的色彩映射字典几乎是正确的,但正如你现在有的那样,在0.25和0.75点有硬转换为黄色/绿色,你应该改变那些“红色”中的那些

           (0.25,  1.0, 0.0),
           (0.50,  0.0, 0.0),
           (0.75,  1.0, 0.0),

           (0.25,  1.0, 1.0),
           (0.50,  0.0, 0.0),
           (0.75,  1.0, 1.0),

获取您想要的色阶。这是结果:

corrected colorscale

答案 1 :(得分:0)

您的颜色词典似乎错了。例如,色彩映射开始的第一个条目是:

'red':   (0.00,  0.0, 0.0)
'green': (0.00,  0.0, 0.0)
'blue':  (0.00,  1.0, 1.0)

,它给出RGB = 001 =蓝色。此外,我还不确定LinearSegmentedColormap在某些时间间隔(如0.5中的索引blue)未定义时的行为方式。

这似乎给出了正确的结果:

import numpy as np
import matplotlib.pyplot as pl
from matplotlib.colors import LinearSegmentedColormap

pl.close('all')

cdict = {
  'red':   ((0.00, 1.0, 1.0),
            (0.25, 1.0, 1.0),
            (0.50, 0.0, 0.0),
            (0.75, 1.0, 1.0),
            (1.00, 0.0, 0.0)),

  'green': ((0.00, 0.0, 0.0),
            (0.25, 1.0, 1.0),
            (0.50, 1.0, 1.0),
            (0.75, 1.0, 1.0),
            (1.00, 0.0, 0.0)),

  'blue':  ((0.00, 0.0, 0.0),
            (0.25, 0.0, 0.0),
            (0.50, 0.0, 0.0),
            (0.75, 0.0, 0.0),
            (1.00, 1.0, 1.0))
}

cm_rgb = LinearSegmentedColormap('bgr', cdict)

pl.figure()
pl.imshow(np.random.random((20,20)), interpolation='nearest', cmap=cm_rgb)
pl.colorbar()

有关LinearSegmentedColormap的文档,请参阅the matplotlib docs

enter image description here