将连续颜色图中的颜色与 matplotlib 中的特定值相关联

Associating colors from a continuous colormap to specific values in matplotlib

我正在尝试寻找一种方法将某些数据值与连续颜色图中的特定颜色相关联。

我有一个值范围为 [min, max] 的特定图像,我想要以下值 [min, q1, q2, q3, max],其中 q'n' 指的是四分位数,与颜色相关联对应于所选颜色图中的 [0, 0.25. 0.5, 0.75. 1.0]。因此,coloramp 的中点将对应于图像中的中值,依此类推...

我一直在四处寻找,但一直没找到办法。

您需要继承 matplotlib.colors.Normalize 并将新 norm 的实例传递给 imshow/contourf/您正在使用的任何绘图函数。

这里的第一个选项说明了基本思想:Shifted colorbar matplotlib(不要过多地回避我自己的问题,但我想不出另一个例子。)

但是,该问题专门涉及将单个数据值设置为对应于颜色图中的 0.5。将想法扩展到 "piecewise" 规范化并不难,但是:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize

class PiecewiseNormalize(Normalize):
    def __init__(self, xvalues, cvalues):
        self.xvalues = xvalues
        self.cvalues = cvalues

        Normalize.__init__(self)

    def __call__(self, value, clip=None):
        # I'm ignoring masked values and all kinds of edge cases to make a
        # simple example...
        if self.xvalues is not None:
            x, y = self.xvalues, self.cvalues
            return np.ma.masked_array(np.interp(value, x, y))
        else:
            return Normalize.__call__(self, value, clip)

data = np.random.random((10,10))
data = 10 * (data - 0.8)

fig, ax = plt.subplots()
norm = PiecewiseNormalize([-8, -1, 0, 1.5, 2], [0, 0.1, 0.5, 0.7, 1])
im = ax.imshow(data, norm=norm, cmap=plt.cm.seismic, interpolation='none')
fig.colorbar(im)
plt.show()

请注意,颜色图中的 0.5(白色)对应于数据值 0,并且颜色图中的红色和蓝色区域是不对称的(请注意宽 "pink" 范围与更窄的向深色过渡蓝色)。