使用matplotlib colorbar显示整个值范围

时间:2016-01-01 15:34:46

标签: python matplotlib

所以我试图显示在彩条上绘制的整个值范围(在这种情况下为{1}} 0-1)。

我设置了归一化,因此大于0.5的值的颜色总是给定为0.5(即平顶)。我想要的是一个从0到1的颜色条,并显示该范围的颜色。因此,您应该能够在值= 0.5之后看到平坦的颜色空间。

但是,我找不到办法做到这一点。默认行为是在攀爬时切断颜色条范围。 np.linspace关键字似乎与数据数组无关,而extend所做的只是在规定的范围内更改颜色限制。

set_clim

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

如果我理解你想要的东西,任何高于0.5的值都应该有相同的颜色...下面的代码会这样做,对不起你的例子和等离子色图没有完全相同,但希望想法应该有帮助,

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


class nlcmap(LinearSegmentedColormap):
    """A nonlinear colormap"""

    name = 'nlcmap'

    def __init__(self, cmap, levels):
        self.cmap = cmap
        self.N = cmap.N
        self.monochrome = self.cmap.monochrome
        self.levels = np.asarray(levels, dtype='float64')
        self._x = self.levels / self.levels.max()
        self._y = np.linspace(0.0, 1.0, len(self.levels))

    def __call__(self, xi, alpha=1.0, **kw):
        yi = np.interp(xi, self._x, self._y)
        return self.cmap(yi, alpha)


def plotcb(vals, levels, cax):

    #cmap = cm.get_cmap('plasma')
    cmap = cm.get_cmap('RdBu')
    cmap_nl = nlcmap(cmap, levels)
    cmap_scalar = cm.ScalarMappable(cmap=cmap_nl)
    cmap_scalar.set_array(np.ma.array(vals, mask=np.isnan(vals)))
    cb = colorbar.Colorbar(cax, cmap_scalar)

    return cmap_scalar.to_rgba(vals)


f, cax = plt.subplots()
all_values = np.linspace(0,1,100)
#Set levels so top 50 are all the same
levels = all_values.copy()
levels[50:] = levels[-1] 
print plotcb(all_values, levels, cax)

plt.show()