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))
#第二步:
# 选择归一化:
# 第一种,默认是线性,可以直接在pcolormesh中设置vmin,vmax
# 第二种,设置成为对数映射,norm = colors.LogNorm(vmin=1E-3, vmax=1E3),注意,若在pcolormesh中给定了norm,就不能再指定vmin和vmax了.
# 第三种:设置成为BoundaryNorm,需给出两个参数,
# 选择colormap
cmap = cm.jet
#第三步:
#pocormesh:创建具有非规则矩形网格的伪彩色图
im = ax.pcolormesh(Z,cmap=cmap)
#第四步:
#colorbar:显示色阶的颜色栏
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)
# fig.colorbar(im1,ax=axs[0,1])
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)
#norm_B = colors.BoundaryNorm(boundaries=bounds,ncolors=nbins)#注意,本来这里应该为cmap.N,但cmap不是离散取值
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’等,具体的见官网;
而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]
# nbins = len(bounds) -1
norm_B = colors.BoundaryNorm(boundaries=bounds,ncolors=cmap_L.N)
#norm_B = colors.BoundaryNorm(boundaries=bounds,ncolors=nbins)#注意,本来这里应该为cmap.N,但cmap不是离散取值
im2 =axs.pcolormesh(Z,cmap=cmap_L,norm=norm_B)
fig.colorbar(im2,ax=axs)
axs.set_title('bound映射')
结果如下:
fig, ax = plt.subplots(1,1, figsize=(4,4))
ax.pcolormesh(data)
#data指的是反射率第一层仰角的数据