所以我试图显示在彩条上绘制的整个值范围(在这种情况下为{1}} 0-1)。
我设置了归一化,因此大于0.5的值的颜色总是给定为0.5(即平顶)。我想要的是一个从0到1的颜色条,并显示该范围的颜色。因此,您应该能够在值= 0.5之后看到平坦的颜色空间。
但是,我找不到办法做到这一点。默认行为是在攀爬时切断颜色条范围。 np.linspace
关键字似乎与数据数组无关,而extend
所做的只是在规定的范围内更改颜色限制。
set_clim
有什么想法吗?
由于
答案 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()