组合两个matplotlib颜色Map表

jfgube3f  于 2023-11-22  发布在  其他
关注(0)|答案(2)|浏览(92)

我想将两个颜色Map表合并为一个,这样我就可以使用一个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)

字符串
我画了posgist_heat_rnegbinary
我想有一个单一的颜色条与组合cmap的,所以这是不正确的做法对我来说。
那么,我如何将两个现有的cmaps合并为一个呢?
编辑:我承认,这是一个重复,但这里给出的答案更清晰。同时,示例图像使它更清晰。

laawzig2

laawzig21#

色彩Map表基本上只是你可以调用的插值函数。它们将区间[0,1]中的值Map到颜色。所以你可以从两个Map中采样颜色,然后合并组合它们:

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()

字符串
结果:x1c 0d1x

注意事项:我知道你可能有特殊的需求,但在我看来,这不是一个好方法:你将如何区分-0.1和0.9?-0.9和0.1?

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


tkclm6bt

tkclm6bt2#

我同意公认的答案,但为了不只是在~0.2到~0.8之间采样,你可以例如反转二进制色图。下面是如何做到这一点。

colors1 = plt.cm.binary_r(np.linspace(0., 1, 128))
colors2 = plt.cm.gist_heat_r(np.linspace(0, 1, 128))

colors = np.vstack((colors1, colors2))
mymap = mcolors.LinearSegmentedColormap.from_list('my_colormap', colors)

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

字符串
主要变化是将plt.cm.binary替换为plt.cm.binary_r

相关问题