Python matplotlib中的对数彩色映射

Python matplotlib中的对数彩色映射,python,numpy,matplotlib,colors,Python,Numpy,Matplotlib,Colors,是否可以定义在两种给定颜色之间进行对数插值的matplitlib颜色映射 Background:当通过imshow(…)命令在matplotlib中打印阵列时,颜色贴图用于为每个数据值指定颜色。通常,从matplotlib.cm使用预定义的颜色映射,但也可以使用matplotlib.colors.LinearSegmentedColormap创建更多增强的颜色映射。 通常,在这些颜色贴图中,颜色值随数据值线性变化 提示:我的问题是不是,如何以对数方式绘制数组。这通常是通过保持线性颜色映射和一些技

是否可以定义在两种给定颜色之间进行对数插值的matplitlib颜色映射

Background:当通过
imshow(…)
命令在matplotlib中打印阵列时,颜色贴图用于为每个数据值指定颜色。通常,从
matplotlib.cm
使用预定义的颜色映射,但也可以使用
matplotlib.colors.LinearSegmentedColormap
创建更多增强的颜色映射。 通常,在这些颜色贴图中,颜色值随数据值线性变化


提示:我的问题是不是,如何以对数方式绘制数组。这通常是通过保持线性颜色映射和一些技巧(通过绘制
log(array)
并用
10^x
替换颜色栏上的标签
x
,或者通过显式更改plot命令的规范化行为)来实现的。这里,我明确地需要colormap实例。

您可以提供一个假的
colormap
,在将其传递给真实的colormap之前应用所需的归一化。下面是这样一个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
,那么您可以传递它来代替colormap,从这里可以获取colormap、以前的归一化和新的归一化限制:

import matplotlib.pyplot as plt

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

所以
imshow(数据,norm=matplotlib.colors.LogNorm())
不是你想要的?这基本上就是你在提示中描述的。是不是你想要以对数方式绘制数组,但要以线性方式绘制颜色条?@burnpanck不,这是我不想要的,我需要一个以对数方式工作的自治颜色映射实例。原因是我使用了不同的software,它使用matplotlib colormaps生成绘图。好的,什么样的软件,以什么方式将colormap传递给它?原因是,可以很容易地编写一个自定义的
colormap
子类,应用线性到日志转换来包装另一个colormap。但是,不清楚是否可以传递这样的自定义类。@burnpanck好吧,这是我们研究小组的一个私人绘图库。我想你的建议可以解决我的问题,因为绘图软件只应用colormap来计算颜色,因此不应该关心它是
LinearSementedColorMap
还是从
colormap
派生的任何其他实例。