1、归一化:归一化后的值可以直接传给 colormap,以得到画图用的颜色
Normalize:各种二维绘图函数在进行归一化时都默认使用 Normalize 类。给定参数 vmin 和 vmax,它会按照线性关系,将原始数据 x 映射为 y。
LogNorm:LogNorm 能将 [vmin, vmax] 范围内的 x 的对数线性映射到 [0.0, 1.0] 上 BoundaryNorm: 参数 boundaries 为我们给出的这些 bin 的边缘数值,要求单调递增; ncolors 则是我们希望与之对应的 colormap 中颜色的数目(即 cmap.N)
2、选colormap的映射值 这里暂时选取jet值,后续讲解如何自己制作colormap
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = 1E3 * np.exp(-(np.abs(X - 5)**2 + np.abs(Y - 5)**2))
fig ,ax = plt.subplots(figsize=(8,6))
cmap = cm.jet
im = ax.pcolormesh(Z,cmap=cmap)
fig.colorbar(im)
plt.show()
效果图如下:
三种归一化结果如下:
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = 1E3 * np.exp(-(np.abs(X - 5)**2 + np.abs(Y - 5)**2))
fig ,axs = plt.subplots(2,2,figsize=(8,8))
cmap = cm.jet
im = axs[0,0].pcolormesh(Z,cmap=cmap)
axs[0,0].set_title('线性映射')
fig.colorbar(im)
norm_L = colors.LogNorm(vmin=1E-3,vmax=1E3)
im1 = axs[0,1].pcolormesh(Z,cmap=cmap,norm=norm_L)
fig.colorbar(im1)
axs[0,1].set_title('对数映射')
bounds = [1,20,40,50,60,70,70,90,100]
nbins = len(bounds) -1
norm_B = colors.BoundaryNorm(boundaries=bounds,ncolors=cmap.N)
im2 =axs[1,0].pcolormesh(Z,cmap=cmap,norm=norm_B)
fig.colorbar(im2)
axs[1,0].set_title('bound映射')
结果如下: 注意看: 这里的颜色条没有一一对齐,问题出现在colorbar的ax参数, 因为colorbar也相当于一个轴,只需要在对应的colorbar 添加这样ax参数就可以了:fig.colorbar(im2,ax=axs[1,0])
结果如下:
3、colormap 有两个子类:一个是Listedcolormap 一个是Linearsegmentcolormap
之前直接 cmap = cm.jet。采用的是颜色库里面有的,相应的还有’viridis’, ‘plasma’, ‘inferno’, ‘magma’, 'cividis’等,具体的见官网;
网址: 色彩介绍–官网matplotlib
而Listedcolormap无colors属性,不能直接列出这N个颜色的RGB值,需要利用十六进制或者rgb值来创建一个list的colormap
如下;
cmap = ['#F8F8FF','#FFC0CB','#DC143C',\
'#0000CD','#DB7093','#FF69B4',\
'#FF1493','#C71585','#DA70D6']
cmap_L = colors.ListedColormap(cmap)
bounds = [1,20,40,50,60,70,70,90,100]
norm_B = colors.BoundaryNorm(boundaries=bounds,ncolors=cmap_L.N)
im2 =axs.pcolormesh(Z,cmap=cmap_L,norm=norm_B)
fig.colorbar(im2,ax=axs)
axs.set_title('bound映射')
结果如下:
|