matplotlib中的对数色图

时间:2014-10-08 09:50:12

标签: python numpy matplotlib colors

是否可以定义matplitlib色彩图,在两种给定的颜色之间进行对数插值?

背景:通过imshow(...)命令在matplotlib中绘制数组时, colormaps 用于为每个数据值指定颜色。通常,matplotlib.cm使用预定义的色彩映射,但也可以使用matplotlib.colors.LinearSegmentedColormap创建更多增强的色彩映射。 通常,在这些颜色映射中,颜色值随数据值线性变化。

提示:我的问题是 ,如何以对数方式绘制数组。这通常是通过保留线性色图和一些技巧(通过绘制log(array)并用x替换颜色条上的标签10^x,或通过显式更改标准化行为来完成的。情节命令)。在这里,我明确需要colormap实例。

1 个答案:

答案 0 :(得分:2)

在将其传递给真实色彩映射之前,您可以提供应用所需规范化的假Colormap。这是一个这样的色彩图实现:

import matplotlib as mpl

class ReNormColormapAdaptor(mpl.colors.Colormap):
    """ Colormap adaptor that uses another Normalize instance
    for the colormap than applied to the mappable. """
    def __init__(self,base,cmap_norm,orig_norm=None):
        if orig_norm is None:
            if isinstance(base,mpl.cm.ScalarMappable):
                orig_norm = base.norm
                base = base.cmap
            else:
                orig_norm = mpl.colors.Normalize(0,1)
        self._base = base
        if (
            isinstance(cmap_norm,type(mpl.colors.Normalize))
            and issubclass(cmap_norm,mpl.colors.Normalize)
        ):
            # a class was provided instead of an instance. create an instance
            # with the same limits.
            cmap_norm = cmap_norm(orig_norm.vmin,orig_norm.vmax)
        self._cmap_norm = cmap_norm
        self._orig_norm = orig_norm

    def __call__(self, X, **kwargs):
        """ Re-normalise the values before applying the colormap. """
        return self._base(self._cmap_norm(self._orig_norm.inverse(X)),**kwargs)

    def __getattr__(self,attr):
        """ Any other attribute, we simply dispatch to the underlying cmap. """
        return getattr(self._base,attr)

由于它获得的值已经被标准化为[0,1),因此需要知道先前的规范化以撤消它(给定为orig_norm)。如果要将色彩映射应用于非标准化值,请将其留空:

cmap = ReNormColormapAdaptor(mpl.cm.jet,mpl.colors.LogNorm(vmin,vmax))

如果您已经有ScalarMappable,那么您可以传递它而不是色彩映射,从中将采用色彩映射,先前的归一化和新的归一化限制:

import matplotlib.pyplot as plt

scalar_mappable = plt.imshow(C);
scalar_mappable.set_cmap(ReNormColormapAdaptor(
    scalar_mappable,
    mpl.colors.LogNorm
))