是否可以定义matplitlib色彩图,在两种给定的颜色之间进行对数插值?
背景:通过imshow(...)
命令在matplotlib中绘制数组时, colormaps 用于为每个数据值指定颜色。通常,matplotlib.cm
使用预定义的色彩映射,但也可以使用matplotlib.colors.LinearSegmentedColormap
创建更多增强的色彩映射。
通常,在这些颜色映射中,颜色值随数据值线性变化。
提示:我的问题是 不 ,如何以对数方式绘制数组。这通常是通过保留线性色图和一些技巧(通过绘制log(array)
并用x
替换颜色条上的标签10^x
,或通过显式更改标准化行为来完成的。情节命令)。在这里,我明确需要colormap实例。
答案 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
))