我有一些数据想要用contourf/tricontourf绘制,并使用非线性的颜色映射。
我找到了一个脚本(见下文),它提供了一个很好的解决方案,只要级别在0到正数之间。
然而,我的数据是负数(级别在-50到0之间)。不幸的是,调整级别到我的情况根本不起作用(见图,子图3)。那么有什么需要考虑的吗?有人对我有什么建议,或者甚至面临同样的问题吗?
我真的很感谢你的帮助。
from pylab import *
from numpy import *
from matplotlib.colors import LinearSegmentedColormap
class nlcmap(LinearSegmentedColormap):
"""A nonlinear colormap"""
name = 'nlcmap'
def __init__(self, cmap, levels):
self.cmap = cmap
self.monochrome = self.cmap.monochrome
self.levels = asarray(levels, dtype='float64')
self._x = self.levels/ self.levels.max()
self.levmax = self.levels.max()
self.levmin = self.levels.min()
self._y = linspace(self.levmin, self.levmax, len(self.levels))
def __call__(self, xi, alpha=1.0, **kw):
yi = interp(xi, self._x, self._y)
return self.cmap(yi/self.levmax, alpha)
if __name__ == '__main__':
y, x = mgrid[0.0:3.0:100j, 0.0:5.0:100j]
H = 50.0 * exp( -(x**2 + y**2) / 4.0 )
levels = [0, 1, 2, 3, 6, 9, 20, 50]
H1 = -50.0 * exp( -(x**2 + y**2) / 4.0 )
levels1 = [-50, -20, -9, -6, -3, -2, -1, 0]
cmap_lin = cm.jet
cmap_nonlin = nlcmap(cmap_lin, levels)
cmap_lin1 = cm.jet
cmap_nonlin1 = nlcmap(cmap_lin1, levels1)
subplot(4,1,1)
contourf(x, y, H, levels, cmap=cmap_nonlin)
colorbar()
subplot(4,1,2)
contourf(x, y, H, levels, cmap=cmap_lin)
colorbar()
subplot(4,1,3)
contourf(x, y, H1, levels1, cmap=cmap_nonlin1)
colorbar()
subplot(4,1,4)
contourf(x, y, H1, levels1, cmap=cmap_lin1)
colorbar()
plt.show()