在绘制二维数组的时候,有时需要根据不同的值赋不同的颜色,比如数组中只有0,1,2,3四个整数,那如何绘制呢?
首先了解下面两个函数(详见:官网[1]):
ListedColormap(colors[, name, N])
:从颜色列表中生成的调色板对象。
- colors:颜色列表
- name:可选,标识调色板的字符串
- N:可选,颜色数目
BoundaryNorm(boundaries, ncolors[, clip, extend])
:基于离散区间生成调色板索引。
- boundaries:单调递增的边界序列
- ncolors:颜色图中要使用的颜色数量
- clip:可选,如果clip为True,超出范围的值在边界[0]以下映射为0,在边界[0]以上映射为ncolors -1。如果clip为False,超出范围的值如果低于边界[0]则映射为-1,如果高于边界[-1]则映射为ncolors。
各种颜色的名称:官网[2]
各种调色板:官网[3]
接下来准备绘制二维数组,首先是生成10*10的[0,3]的随机数组,然后设定颜色列表以及颜色边界值,最后绘制数组:
from random import randint
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm
import numpy as np
data_list = []
for i in range(100):
data_list.append(randint(0, 3))
data_arr = np.array(data_list).reshape(10, 10)
cmap = ListedColormap(['r', 'g', 'b', 'orange'])
norm = BoundaryNorm([0,1,2,3], cmap.N)
fig, ax = plt.subplots()
im = ax.imshow(data_arr, cmap=cmap, interpolation='none', norm=norm) #
plt.colorbar(mappable=im)
# 添加数值
for i in range(10):
for j in range(10):
text = ax.text(j, i, data_arr[i, j], ha='center', va='center', color='w')
结果如下图所示,可以看到2和3共用了一个颜色:
我们调节BoundaryNorm的值,因为是整数,所以边界可以用小数表示,同时添加一个下界-1:
cmap = ListedColormap(['r', 'g', 'b', 'orange'])
norm = BoundaryNorm([-1,0.1, 1.1, 2.1, 3.1], cmap.N)
结果如下图所示,可以看到2和3被分开了:
参考资料
[1]ListedColormap/BoundaryNorm: https://matplotlib.org/api/colors_api.html
[2]color: https://xkcd.com/color/rgb/
[3]colormap: https://matplotlib.org/tutorials/colors/colormaps.html