在 imshow 中加入两个颜色图

Join two colormaps in imshow

我想使用 imshow() 绘制图形,但要使用一些自定义颜色图。对于正值,我想使用 e.q。 "gnuplot" colors 和负值 "cool"。知道怎么做吗?

你可以使用

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

产量


  1. 我希望 vmin, vmax 的定义可以更简单一些。 min(data.min(), -1)data 为正的情况下使用而不是 data.min()。我们需要 vmin 对正确构建自定义颜色图不利。 np.nextaftervmin 向下推一点,这样级别将封装所有值 data。没有np.nextafterimshowdata时有一个大白块 等于 vmax.

  2. 颜色条级别从 vmin0(不含),然后是 0(含) 至 vmax.

  3. 颜色条颜色是从 cool 采样的 N 颜色的串联, 接着是从 gnuplot 采样的 N 颜色。您可以更改 N 以控制您希望从每个基础颜色图中获得多少个颜色等级。