python —关于colormap,polormesh,colorbar

  • Post author:
  • Post category:python


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’等,具体的见官网;

网址:


色彩介绍–官网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]
# 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指的是反射率第一层仰角的数据

在这里插入图片描述



版权声明:本文为YQyq1021原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。