如何在matplotlib中获得带有从值到颜色的非均匀映射的颜色条?

时间:2018-08-23 17:08:35

标签: matplotlib

我一直在寻找一个彩色条,其中使用np.interp(x, [0, 100, 1000, 10000, 120000], [0, 0, 0.5, 1, 1])映射了0到12000的范围。

想法是将0到100的波段映射到相同的颜色,然后将范围10到1000的范围从最低颜色均匀映射到中间颜色,然后将1000到10000的范围从中间颜色映射到最高颜色。

我想要此映射,因为我使用的是发散的颜色图RdYlGn_r,临界值为1000,而10000和100以上的值是离群值。

所以我尝试将ColorbarBase与我自己的Normalizer子类一起使用,因为LogNormNormalizerSymLogNormBoundaryNorm和{{ 1}}似乎不适合此任务。

但是情节是空白的(没有错误)

PowerNorm

并不是我真的不想要由离散颜色组成的颜色条,否则import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np import traceback import warnings import sys plt.close('all') fig,ax = plt.subplots(1,1) class MyNorm(mpl.colors.Normalize): def __call__(self, value, clip=True): if clip is None: clip = self.clip clip=False result, is_scalar = self.process_value(value) self.autoscale_None(result) # Convert at least to float, without losing precision. (vmin,), _ = self.process_value(self.vmin) (vmax,), _ = self.process_value(self.vmax) if vmin == vmax: result.fill(0) # Or should it be all masked? Or 0.5? elif vmin > vmax: raise ValueError("minvalue must be less than or equal to maxvalue") else: if clip: mask = np.ma.getmask(result) result = np.ma.array(np.clip(result.filled(vmax), vmin, vmax), mask=mask) # ma division is very slow; we can take a shortcut resdat = result.data resdat = np.interp(resdat, [0,100, 1000, 10000, 120000], [0.00, 0.00, 0.5, 1,1]) result = np.ma.array(resdat, mask=result.mask, copy=False) if is_scalar: result = result[0] print result return result norm = MyNorm(vmax=12000, vmin=0, clip=False) #norm = mpl.colors.Normalize(vmin=0, vmax=12000, clip=True) cmap = plt.get_cmap('RdYlGn_r') # From red to green sm = mpl.cm.ScalarMappable(norm=norm, cmap=cmap) cb1 = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, orientation='vertical', ticks=[100, 1000, 10000]) cb1.set_clim(0,12000) plt.show() 可以正常工作。我需要一个离散颜色的开始区域,然后是渐变,最后是离散色带

1 个答案:

答案 0 :(得分:0)

我不知道这是否是BoundaryNorm中的错误,但是似乎没有平坦的起始区域是行不通的。

因此将0到100的范围映射到0到0的颜色将不起作用,但是将0到100的范围映射到0到0.0001的颜色将可以正常工作。

因此,用

替换OP中的ColorbarBase
np.interp

你得到

colorbar

请注意,在中间或最后有一个平坦的区域就可以了。