我一直在寻找一个彩色条,其中使用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
子类一起使用,因为LogNorm
,Normalizer
,SymLogNorm
,BoundaryNorm
和{{ 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()
可以正常工作。我需要一个离散颜色的开始区域,然后是渐变,最后是离散色带