结合两个matplotlib色图

joh*_*tis 6 python matplotlib

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

目前我使用蒙版数组并使用一个图像cmap和另一个图像绘制另一个图像,从而产生:

在此输入图像描述

以下数据

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

我绘制posgist_heat_rnegbinary.

我想有一个单一的颜色条与合并cmap的,所以这对我来说不是正确的方法.

那么,我如何将两个现有cmaps的合并为一个呢?

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

hit*_*tzg 18

色彩映射基本上只是您可以调用的插值函数.它们将区间[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()
Run Code Online (Sandbox Code Playgroud)

结果: 在此输入图像描述

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

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

在此输入图像描述