线性映射 默认情况下,使用颜色映射的对象将颜色映射中的颜色从数据值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