在imshow中加入两个colormaps

时间:2015-05-06 16:15:02

标签: python matplotlib

我想使用imshow()创建一个绘图,但是使用一个小的自定义颜色贴图。对于正值,我想使用e.q. " gnuplot的" colors和#34;酷"。知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

您可以使用

cmap, norm = mcolors.from_levels_and_colors(levels, colors)

construct a custom colormap

例如,

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

data = np.linspace(-10,5,20).reshape(5,4)

cmap = {name:plt.get_cmap(name) for name in ('gnuplot', 'cool')}
N = 50

vmin, vmax = (np.nextafter(min(data.min(), -1), -np.inf), 
              np.nextafter(max(data.max(), 1), np.inf))              # 1

levels = np.concatenate([np.linspace(vmin, 0, N, endpoint=False),
                         np.linspace(0, vmax, N+1, endpoint=True)])  # 2
colors = np.concatenate([cmap[name](np.linspace(0, 1, N)) 
                         for name in ('cool', 'gnuplot')])           # 3

cmap, norm = mcolors.from_levels_and_colors(levels, colors)

plt.imshow(data, cmap=cmap,
           norm=norm, 
           interpolation='nearest')
bar = plt.colorbar()
plt.show()

产量

enter image description here

  1. 我希望vmin, vmax的定义可以更简单。 min(data.min(), -1) 如果data.min()为正数,则使用data代替vmin。我们需要np.nextafter 对于要正确构造的自定义色彩映射是否定的。 vmin 稍微调整data,以便级别将封装所有值 np.nextafter。如果没有imshowdata vmax时会出现一个大的白色区块 等于vmin

  2. 颜色栏级别从00(不包括),然后vmax(包括) 到N

  3. 颜色条颜色是从cool采样的N颜色的串联, 然后是从gnuplot采样的N颜色。您可以更改'.source.coffee': 'For-Loop': 'prefix': 'fori' 'body': 'for (int ${1:i} = $2; ${1:i} < $3; ${1:i}++) {\n\t$4\n}' 以控制您希望拥有的每个底层色彩图的色彩等级。