【问题标题】:Associating colors from a continuous colormap to specific values in matplotlib将连续颜色图中的颜色与 matplotlib 中的特定值相关联
【发布时间】:2015-08-08 12:18:36
【问题描述】:

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

我有一张图像,其值范围为[min, max],我希望以下值[min, q1, q2, q3, max],其中q'n' 指四分位数,与[0, 0.25. 0.5, 0.75. 1.0] 中对应的颜色相关联选择的颜色图。结果,颜色放大器的中点将对应于图像中的中值,依此类推...

我一直在四处寻找,但我无法找到一种方法来做到这一点。

【问题讨论】:

    标签: python matplotlib quartile


    【解决方案1】:

    您需要继承matplotlib.colors.Normalize 并将新norm 的实例传递给imshow/contourf/无论您使用什么绘图功能。

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

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

    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,并且颜色图中的红色和蓝色区域是不对称的(注意宽泛的“粉红色”范围与窄得多的深蓝色过渡)。

    【讨论】:

    • 这很有帮助。我正在尝试完成 PiecemealNormalize 课程的其余部分(您遗漏的部分),以便我有一个完整的课程。不幸的是,我仍然不确定为什么在原始 Normalize 类中使用了掩码的 numpy 数组??
    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2015-04-20
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多