使用 matplotlib 自定义Colormap
自定义 colormap 通常要使用 matplotlib.colors 模块中提供的函数和方法。 matplotlib.colors 是用来转换数字列表或颜色参数为 RGB 或 RGBA 的模块。RGB 和 RGBA 是具有3个或4个浮点数且数值在 [0, 1] 之间的序列。
创建 colormap 时通常需要以下两步:
- 使用 Normalize 实例或子类将数据数组归一化为 [0 1]之间的数组
- 使用 Colormap 子类的实例进行数据和颜色的映射
模块中提供了以下两个函数创建 colormap:
-
LinearSegmentedColormap
所有内置 colormap 实例均由此函数创建,但也可以自定义colormap -
ListedColormap
从颜色列表创建 colormap
使用
LinearSegmentedColormap
的 from_list 方法创建 colormap
# R, G, B 三色
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1)]
# 用于进行 colormap 插值,表示 colormap 颜色区间
n_bins = [3, 6, 10, 100]
# colormap 名
cmap_name = 'my_cmap'
fig, axs = plt.subplots(2, 2, figsize=(6, 9))
fig.subplots_adjust(left=0.02, bottom=0.06, right=0.95, top=0.94, wspace=0.05)
for n_bin, ax in zip(n_bins, axs.ravel()):
# 创建 colormap
cm = LinearSegmentedColormap.from_list(
cmap_name, colors, N=n_bin)
# n_bin 越小,插值得到的颜色区间越少
im = ax.imshow(Z, interpolation='nearest', origin='lower', cmap=cm)
ax.set_title("N bins: %s" % n_bin)
fig.colorbar(im, ax=ax)
plt.show()
自定义颜色映射
使用RGB颜色字典定义 colormap,比如:
cdict = {'red': ((0.0, 0.0, 0.0),
(0.5, 1.0, 1.0),
(1.0, 1.0, 1.0)),
'green': ((0.0, 0.0, 0.0),
(0.25, 0.0, 0.0),
(0.75, 1.0, 1.0),
(1.0, 1.0, 1.0)),
'blue': ((0.0, 0.0, 0.0),
(0.5, 0.0, 0.0),
(1.0, 1.0, 1.0))}
cdict 字典中的每一个颜色都是由三个浮点值构成的元组,每一个元组的第2和3个元素均是 y 值,第一个元素是 x,表示在 [0, 1] 之间进行插值的步长,而且 必须 在[0, 1]之间划分。换句话说就是,x 值将 [0, 1]区间划分为多个小区间,y 表示每一个小区间的末端颜色值。
比如 cdict['green'] 中表示: 0-0.25 之间,绿色值为0,0.25-0.75 之间,绿色值在 [0, 1] 之间线性插值,0.75-1之间,绿色值为 1; cdict['red'] 和 cdict['blue'] 类似。
如果为非连续 colormap,自定义时会稍微复杂一些,而且不能很好的掌握颜色的设置。x[i] 和 x[i+1]之间的 x 值在 y1[i] 和 y0[i+1] 之间进行插值。
row i: x y0 y1
row i+1: x y0 y1
x[i] 和 x[i+1] 范围内的 x 值均插值为 y1[i] 和 y0[i+1] 间的值,因此,y0[0] 和 y1[-1] 是不会用到的,也就是说这两个值对结果没有影响。
下面使用 LinearSegmentedColormap 创建 colormap,并使用 register_cmap 注册定义的 colormap
blue_red = LinearSegmentedColormap('BlueRed', cdict)
plt.register_cmap(cmap=blue_red)
使用 ListedColormap 自定义 colormap
创建十六进制颜色索引列表,然后利用 ListedColormap 函数创建 colormap,并进行注册:
from matplotlib import cm, colors
cdict= ["#FFFFFF","#98F5FF","#87CEEB","#00FF00",\