自定义Matplotlib colourmap - 就像pgfplots一样

时间:2014-03-20 14:19:46

标签: python matplotlib color-mapping

是否可以从pgfplots获取蓝色 - 黄色 - 红色的colourmap,如matplotlib中的https://tex.stackexchange.com/questions/39145/scaling-colormaps-with-pgfplots所示?

我已经看过如何在matplotlib中定义自定义colourmaps,但这似乎很难。

2 个答案:

答案 0 :(得分:3)

定义自定义cmap是可行的方法。这并不困难,但您必须确保理解color dict中的所有值。

对于每种颜色,您可以指定三列值。第一列是颜色发生的位置,0表示第一列,1表示最后一列。由于您需要三种颜色,因此有三个均匀间隔的位置,分别为0,0.5和1.0。

你想:

0.0:蓝色

0.5:黄色

1.0:红色

第二列定义颜色“直到”位置,第三列定义颜色'从该位置开始/之后'。如果你想让颜色逐渐淡化你应该保持相同。指定不同的颜色可以使色彩图在某个位置后突然“跳跃”。

要在位置0.0处获得蓝色,请将红色和绿色设置为0,将蓝色设置为1.要在位置0.5处获得黄色,请将红色和绿色设置为1,将蓝色设置为零。等等...

import matplotlib as mpl
from matplotlib import pyplot as plt
import numpy as np

cdict = {'red': ((0.0, 0.0, 0.0),
                 (0.5, 1.0, 1.0),
                 (1.0, 1.0, 1.0)),
        'green':((0.0, 0.0, 0.0),
                 (0.5, 1.0, 1.0),
                 (1.0, 0.0, 0.0)),
         'blue':((0.0, 1.0, 1.0),
                 (0.5, 0.0, 0.0),
                 (1.0, 0.0, 0.0))}

custom_cmap = mpl.colors.LinearSegmentedColormap('mymap', cdict, 256)

plt.imshow(np.arange(36).reshape(6,6), cmap=custom_cmap, interpolation='none')

enter image description here

答案 1 :(得分:3)

@RutgerKassies对matplotlib中线性色图的工作原理有一个很好的解释。当您需要具有不均匀过渡的色彩映射或“#34; hard"截止,您需要指定阈值的完整dict

然而,有一个方便的工厂功能"对于简单的色彩映射,颜色之间均匀转换:LinearSegmentedColormap.from_list(实际上,您甚至可以使用它进行不均匀的过渡,只要它们不是"硬"过渡。)

例如(为了窃取Rutger的例子),我们可以这样做:

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

cmap = LinearSegmentedColormap.from_list('mymap', ['blue', 'yellow', 'red'])

plt.imshow(np.arange(36).reshape(6,6), cmap=cmap, interpolation='none')
plt.show()

enter image description here