结合两个matplotlib色图

时间:2015-06-25 13:16:52

标签: python matplotlib

我想将两个色图合并为一个,这样我可以使用一个cmap作为负值,另一个作为正值。

目前我使用蒙面数组并使用一个cmap绘制一个图像而另一个使用另一个图像绘制图像,结果:

enter image description here

包含以下数据

dat = np.random.rand(10,10) * 2 - 1
pos = np.ma.masked_array(dat, dat<0)
neg = np.ma.masked_array(dat, dat>=0)

我使用posgist_heat_r neg制作binary

我希望只有一个带有cmap组合的颜色条,所以这对我来说不是正确的方法。

那么,如何将两个现有的cmaps&#39并合并为一个?

编辑:我承认,这是重复的,但这里给出的答案要清楚得多。示例图像也使其更加清晰。

1 个答案:

答案 0 :(得分:13)

Colormaps基本上只是您可以调用的插值函数。它们将区间[0,1]中的值映射到颜色。因此,您只需从两个地图中采样颜色,然后将它们组合起来:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

data = np.random.rand(10,10) * 2 - 1

# sample the colormaps that you want to use. Use 128 from each so we get 256
# colors in total
colors1 = plt.cm.binary(np.linspace(0., 1, 128))
colors2 = plt.cm.gist_heat_r(np.linspace(0, 1, 128))

# combine them and build a new colormap
colors = np.vstack((colors1, colors2))
mymap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors)

plt.pcolor(data, cmap=mymap)
plt.colorbar()
plt.show()

结果: enter image description here

注意:我知道您可能对此有特殊需求,但我认为这不是一个好方法:您如何区分-0.1与0.9? -0.9从0.1?

防止这种情况的一种方法是仅从~0.2到~0.8(例如:colors1 = plt.cm.binary(np.linspace(0.2, 0.8, 128)))对地图进行采样,这样它们就不会一直变为黑色:

enter image description here