Hua*_*lin 2 python colors matplotlib
要使用 matplotlib 颜色条,必须使用 的matplotlib.cm.ScalarMappable子类中的对象指定matplotlib.colors.Normalize,从中colorbar可以知道如何将数据标准化为 [0,1] 浮点值。
matplotlib 只提供了几种归一化过程,线性归一化,对数,幂律等。但在实践中,我们可能想使用我们自己编写的其他归一化函数。
我们可以使用任何函数将数据数组规范化为 [0,1],但如果不使用子类Scalarmappable构建Nomalization,颜色条将不会有正确的刻度和标签。
我想知道我对 matplotlib colorbar 的理解是正确的还是有其他方法可以很容易地做到这一点?或者也许我们必须手动编写一个子类来包装自定义规范化函数?
matplotlib.colors.Normalize为此,您可以轻松地进行子类化。这是我为之前的 SO 问题编写的分段标准化类的示例:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
class PiecewiseNorm(Normalize):
def __init__(self, levels, clip=False):
# input levels
self._levels = np.sort(levels)
# corresponding normalized values between 0 and 1
self._normed = np.linspace(0, 1, len(levels))
Normalize.__init__(self, None, None, clip)
def __call__(self, value, clip=None):
# linearly interpolate to get the normalized value
return np.ma.masked_array(np.interp(value, self._levels, self._normed))
def inverse(self, value):
return 1.0 - self.__call__(value)
Run Code Online (Sandbox Code Playgroud)
例如:
y, x = np.mgrid[0.0:3.0:100j, 0.0:5.0:100j]
H = 50.0 * np.exp( -(x**2 + y**2) / 4.0 )
levels = [0, 1, 2, 3, 6, 9, 20, 50]
H1 = -50.0 * np.exp( -(x**2 + y**2) / 4.0 )
levels1 = [-50, -20, -9, -6, -3, -2, -1, 0]
fig, ax = plt.subplots(2, 2, gridspec_kw={'width_ratios':(20, 1), 'wspace':0.05})
im0 = ax[0, 0].contourf(x, y, H, levels, cmap='jet', norm=PiecewiseNorm(levels))
cb0 = fig.colorbar(im0, cax=ax[0, 1])
im1 = ax[1, 0].contourf(x, y, H1, levels1, cmap='jet', norm=PiecewiseNorm(levels1))
cb1 = fig.colorbar(im1, cax=ax[1, 1])
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1894 次 |
| 最近记录: |