强基初中数学&学Python——第282课 数字和数学第三方模块Matplotlib之九:颜色-颜色映射规范化(1)

线性映射  默认情况下,使用颜色映射的对象将颜色映射中的颜色从数据值vmin线性映射到vmax。例如:

· 

pcm = ax.pcolormesh(x, y, Z, vmin=-1., vmax=1., cmap='RdBu_r')

  上面的代码把Z中的数据线性映射为从-1到+1,因此Z=0将在颜色映射RdBu_r中心的颜色(在这种情况下为白色)。  Matplotlib分两步进行映射,首先进行从输入数据到[0,1]的归一化,然后映射到颜色映射中的索引。规范化是在matplotlib.colors()模块中定义的类。默认的线性规范化是matplotlib.colors.Normalize()  数据映射到颜色的艺术家传递参数vmin和vmax来构造matplotlib.colors.Normalize()实例,然后调用它:

· 

· 

· 

· 

>>> import matplotlib as mpl>>> norm = mpl.colors.Normalize(vmin=-1, vmax=1)>>> norm(0)0.5

  然而,有时在某些情况下,以非线性方式将数据映射到颜色映射是有用的。先休息一下!

对数映射    最常见的非线性转换之一是使用数据的对数(以10为底)进行绘制。这种转换对于显示不同规模的变化非常有用。使用colors.LogNorm通过log10运算规范化数据在下面的例子中,有两个凸起,一个比另一个小得多。使用colors.LogNorm,可以清楚地看到每个凸起的形状和位置:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.colors as colorsimport matplotlib.cbook as cbookfrom matplotlib import cm
N = 100X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]
# A low hump with a spike coming out of the top right.  Needs to have# z/colour axis on a log scale, so we see both hump and spike. A linear# scale only shows the spike.Z1 = np.exp(-X**2 - Y**2)Z2 = np.exp(-(X * 10)**2 - (Y * 10)**2)Z = Z1 + 50 * Z2
fig, ax = plt.subplots(2, 1)
pcm = ax[0].pcolor(X, Y, Z,                   norm=colors.LogNorm(vmin=Z.min(), vmax=Z.max()),                   cmap='PuBu_r', shading='auto')fig.colorbar(pcm, ax=ax[0], extend='max')
pcm = ax[1].pcolor(X, Y, Z, cmap='PuBu_r', shading='auto')fig.colorbar(pcm, ax=ax[1], extend='max')plt.show()

 

居中显示
  在许多情况下,数据围绕中心对称,例如,围绕中心0的正异常和负异常。在这种情况下,如果数据中心的值大于图表中心的映射值,我们希望将中心映射到0.5,并且将与中心偏差最大的数据点映射到1.0,最小的则为0.0。规范colors.CentredNorm会自动创建这样的映射。它非常适合与发散颜色映射相结合,发散颜色映射使用不同的颜色边缘,这些边缘在不饱和颜色的中心相遇。  如果作为居中的对称中心不是0,则可以使用vcenter参数设置对称中心。如果要对中心两侧的数据进行对数缩放,请参见下面的colors.SymLogNorm;要在中心上方和下方应用不同的映射,请使用下面的colors.TwoSlopeNorm

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.colors as colorsfrom matplotlib import cm
delta = 0.1x = np.arange(-3.0, 4.001, delta)y = np.arange(-4.0, 3.001, delta)X, Y = np.meshgrid(x, y)Z1 = np.exp(-X**2 - Y**2)Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)Z = (0.9*Z1 - 0.5*Z2) * 2
# select a divergent colormapcmap = cm.coolwarm
fig, (ax1, ax2) = plt.subplots(ncols=2)pc = ax1.pcolormesh(Z, cmap=cmap)fig.colorbar(pc, ax=ax1)ax1.set_title('Normalize()')
pc = ax2.pcolormesh(Z, norm=colors.CenteredNorm(), cmap=cmap)fig.colorbar(pc, ax=ax2)ax2.set_title('CenteredNorm()')
plt.show()

 

对称对数映射  相似地,有时也会出现正负数据,但我们仍然希望对两者都应用对数缩放。在这种情况下,负数也按对数缩放,并映射到较小的数字;例如,如果vmin=-vmax,则负数从0映射到0.5,正数从0.5映射到1。  由于接近零的值的对数趋向于无穷大,因此需要线性映射零附近的小范围。参数linthresh允许用户指定此范围的大小(-linthresh,linthresh)。颜色映射中此范围的大小由linscale设置。当linscale==1.0(默认值)时,用于线性范围的正半部分和负半部分的空间将等于对数范围中的10。

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.colors as colors
N = 100X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]Z1 = np.exp(-X**2 - Y**2)Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)Z = (Z1 - Z2) * 2
fig, ax = plt.subplots(2, 1)
pcm = ax[0].pcolormesh(X, Y, Z,                       norm=colors.SymLogNorm(linthresh=0.03, linscale=0.03,                                              vmin=-1.0, vmax=1.0, base=10),                       cmap='RdBu_r', shading='auto')fig.colorbar(pcm, ax=ax[0], extend='both')
pcm = ax[1].pcolormesh(X, Y, Z, cmap='RdBu_r', vmin=-np.max(Z), shading='auto')fig.colorbar(pcm, ax=ax[1], extend='both')plt.show()

 

本文链接:
matplotlib.colors():

https://matplotlib.org/stable/api/colors_api.html#module-matplotlib.colors

matplotlib.colors.Normalize():

https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.Normalize.html#matplotlib.colors.Normalize

colors.LogNorm:

https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.LogNorm.html#matplotlib.colors.LogNorm

colors.CenteredNorm:

https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.CenteredNorm.html#matplotlib.colors.CenteredNorm

colors.SymLogNorm:

https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.SymLogNorm.html#matplotlib.colors.SymLogNorm

colors.TwoSlopeNorm:

https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.TwoSlopeNorm.html#matplotlib.colors.TwoSlopeNorm