自定义 Matplotlib 颜色图

Customize Matplotlib Colormap

我想构建一个主要由三种颜色组成的颜色图,类似于颜色图'brg':

不过,我想从两方面进行修改:

  1. 我想分别用蓝色、黑色和红色替换蓝色、红色和绿色。
  2. 我想扩大中间色的面积。作为一种规范,我目前正在使用 matplotlibs 'Normalize',我想我可以选择非线性归一化,但我宁愿 'add red (black)' 到颜色图的中间并坚持线性归一化。

创建此类颜色图的最简单方法是通过 LinearSegmentedColormap.from_list('', ['b', 'k', 'k', 'r'])。这样就把颜色平均分了,所以纯黑色占据了1/3rd的范围。

该函数还允许通过形式为 (position, color) 的元组定位颜色,其中 position 范围从 0 到左侧(底部) ) 到右侧(顶部)的 1。下面是一个例子,其中黑色占据了 10% 的范围。

import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.cm import ScalarMappable
import numpy as np

cmap1 = LinearSegmentedColormap.from_list('', ['b', 'k', 'k', 'r'])
plt.colorbar(ScalarMappable(cmap=cmap1), orientation='horizontal',
             ticks=np.linspace(0,1,11), label='pure black occupies 1/3rd')
width = 0.1
cmap2 = LinearSegmentedColormap.from_list('', [(0, 'b'), ((1 - width) / 2, 'k'), ( (1 + width) / 2, 'k'), (1, 'r')])
plt.colorbar(ScalarMappable(cmap=cmap2), orientation='horizontal',
             ticks=np.linspace(0,1,11), label=f'pure black occupies {width}')
plt.show()