Wednesday, February 7, 2018

[Python] How to shift the midpoint of the colorbar? -Normalizing colormap

给网格数据画图的时候,常常面临选择合适调色盘的难题。我们常用的matplotlib里自带的调色盘大致有三种:单向渐变,双向渐变,多色渐变。根据数据的值域以及目的,我们来选择不同的调色盘来表现。
单向渐变多用于单增的信号,且空间分布非常简单。复杂的空间分布应该采用多色渐变,区分度更大,比如地形图。
双向渐变常用于有正负值的数据,比如相关系数、敏感性等等。今天就是要来讲一讲双向渐变colorbar。
我们平时经常遇到这样的数据,就是正负值不对称,比如值域范围是-1~100。为了能够使用双向渐变colorbar,我们需要调整数据中点,不然调色盘不对称,造成读数的困难!一个暴力的方法就是通过人为设定最大、最小值来设定数据中点:
plt.imshow(data, vmin=-100, vmax=100)
下面介绍一个更加合理、不浪费空间的简便方法

from matplotlib.colors import Normalize

class MidpointNormalize(Normalize):
    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):
        self.midpoint = midpoint
        Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):
        # I'm ignoring masked values and all kinds of edge cases to make a
        # simple example...
        x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]
        return np.ma.masked_array(np.interp(value, x, y))

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

fig, ax = plt.subplots()
norm = MidpointNormalize(midpoint=0)
im = ax.imshow(data, norm=norm, cmap=plt.cm.bwr, interpolation='none')
fig.colorbar(im)
plt.show()
是不是很简单呀?原作者Joe还有好几种其他方法,以后可以试验一下。

No comments:

Post a Comment