Python中的自定义Colormap

时间:2015-09-11 13:17:23

标签: python matplotlib colormap

我想在python中创建自己的自定义颜色贴图,我查看了一些在线示例并找到了命令

from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.colors import LinearSegmentedColormap

cdict1 = {'red':   ((0.0, 0.0, 0.0),
                    (0.5, 0.0, 0.1),
                    (1.0, 1.0, 1.0)),

         'green': ((0.0, 0.0, 0.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 1.0),
                   (0.5, 0.1, 0.0),
                   (1.0, 0.0, 0.0))
         }

blue_red1 = LinearSegmentedColormap('BlueRed1', cdict1)
plt.imshow(big,interpolation='nearest',  cmap=blue_red1, aspect='auto')
plt.colorbar()
plt.show()

使用上面的命令,我得到一个颜色图,它是(红色 - 黑色 - 蓝色),其中红色是最大值,蓝色是最小值。我想创建一个颜色贴图(黑色 - 白色 - 黑色)。有人可以告诉我应该做什么或任何其他方法?

4 个答案:

答案 0 :(得分:16)

对于它的价值,还有一种更简单的方法。

LinearSegmentedColormap的完整形式使您能够拥有" hard"在同一个色彩图中停止和渐变,因此它必然很复杂。但是,对于简单的案例,例如你所描述的内容,它有一个便利构造函数。

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

cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'white', 'black'])

fig, ax = plt.subplots()
im = ax.imshow(np.random.random((10, 10)), cmap=cmap, interpolation='nearest')
fig.colorbar(im)
plt.show()

enter image description here

答案 1 :(得分:7)

您希望所有三个组件在0和1处均为0,并且所有三个组件在0.5时均为1。 所以,你有:

cdict1 = {'red':  ((0.0, 0.0, 0.0),   # <- at 0.0, the red component is 0
                   (0.5, 1.0, 1.0),   # <- at 0.5, the red component is 1
                   (1.0, 0.0, 0.0)),  # <- at 1.0, the red component is 0

         'green': ((0.0, 0.0, 0.0),   # <- etc.
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0))
         }

enter image description here

答案 2 :(得分:3)

我也发现色彩图创作令人困惑。 LinearSegmentedColormap很好,因为它非常灵活,但cdict需要一些时间来适应。

以这种方式制作色彩图的第一个 - 也许是最重要的 - 是你了解RGB colors。基本上,每种颜色的强度值从0到1,而较高的值则提供更多的颜色。在RGB颜色空间中,白色由所有三种颜色1表示,黑色均为三种颜色0

学习以这种方式制作色彩图的第二件事是:始终使每个元组的第2和第3个值相同,直到您熟悉创建简单的线性色图。最终,您可以更改这些值以在色彩映射中产生不连续性,但它只会在您开始使用时混淆。

好的,所以每个元组中的第一个值是&#39;分数&#39;色图的这些值必须从0到1,第二个和第三个值是该颜色的强度(下限和上限)。因此,要制作一个黑白黑色的色彩图,您可以这样做:

cdict1 = {
    'red':   ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),

    'green': ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),

    'blue':   ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),
         }

black_white_black = LinearSegmentedColormap('BlackWhiteBlack', cdict1)

例如,

plt.imshow(np.arange(100).reshape(10,10), cmap=black_white_black, aspect='auto')
plt.colorbar()

Example Image

祝你好运!

答案 3 :(得分:1)

尝试

的cdict1
cdict1 = {'red':   ((0.0, 0.0, 0.0),
                    (0.5, 1.0, 1.0),
                    (1.0, 0.0, 0.0)),

         'green': ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0))
         }

此词典描述了如何插入颜色,分别查看每个红绿蓝组件。对于每个组件,您给它一个3元组(x,y0,y1)的列表,指定如何插入该组件,并且您想要的每个值都在列表中的两个点之间进行插值。

在这种情况下,我们想要从黑色[RGB =(0,0,0)]开始,在数据范围的中间点增加到白色[RGB = 1,1,1],然后减少回到最后是黑色。

对于要分配颜色的每个值,地图将首先将该值转换为输入范围的一小部分,以使其具有[0,1]范围内的某些值。要获得红色分量的级别,地图将扫描“红色”列表中每个3元组中的第一个元素,并获取不超过分数的最大元素。根据x值的差异,分配的红色级别将在该3元组的y1元素和下一个3元组的y0元素之间进行插值。

同样对于蓝色和绿色组件。