2016-09-14 139 views
1

我试图用定制的颜色图绘制0-69范围内的数据。下面是一个例子:Matplotlib:未对齐的颜色条刻度?

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.colors import LinearSegmentedColormap 

colors = [(0.9, 0.9, 0.9), # Value = 0 
      (0.3, 0.3, 0.3), # Value = 9 
      (1.0, 0.4, 0.4), # Value = 10 
      (0.4, 0.0, 0.0), # Value = 19 
      (0.0, 0.7, 1.0), # Value = 20 
      (0.0, 0.1, 0.3), # Value = 29 
      (1.0, 1.0, 0.4), # Value = 30 
      (0.4, 0.4, 0.0), # Value = 39 
      (1.0, 0.4, 1.0), # Value = 40 
      (0.4, 0.0, 0.4), # Value = 49 
      (0.4, 1.0, 0.4), # Value = 50 
      (0.0, 0.4, 0.0), # Value = 59 
      (1.0, 0.3, 0.0), # Value = 60 
      (1.0, 0.8, 0.6)] # Value = 69 

# Create the values specified above 
max_val = 69 
values = [n for n in range(max_val + 1) if n % 10 == 0 or n % 10 == 9] 

# Create colormap, first normalise values 
values = [v/float(max_val) for v in values] 
values_and_colors = [(v, c) for v, c in zip(values, colors)] 
cmap = LinearSegmentedColormap.from_list('my_cmap', values_and_colors, 
             N=max_val + 1) 

# Create sample data in range 0-69 
data = np.round(np.random.random((20, 20)) * max_val) 

ax = plt.imshow(data, cmap=cmap, interpolation='nearest') 
cb = plt.colorbar(ticks=range(0, max_val, 10)) 
plt.show() 

enter image description here

我至于为什么颜色条蜱不与颜色梯度之间的不同分色排队迷惑不解(为其中有各10种颜色)。

我试着从[0,69]设置数据和观点区间为[0,70]:

cb.locator.axis.set_view_interval(0, 70) 
cb.locator.axis.set_data_interval(0, 70) 
cb.update_ticks() 

但是这似乎并没有做任何事情。

请有人建议吗?

回答

1

解决我的问题,最简单的方法是设置vmax在可映射的定义:

ax = plt.imshow(data, cmap=cmap, interpolation='nearest', vmax=max_val + 1) 

它被设置为max_val,因为彩条类具备呼叫mappable.autoscale_None()在其__init__,这是设置vmaxdata.max(),即69

认为我只是在错误的道路使用LinearSegmentedColormap的受害者。我想要分配给特定颜色的离散值,但与LinearSegmentedColormap相关联的颜色条的显示呈现连续数据,因此默认将未指定的限制设置为​​和data.max(),即在这种情况下为0和69.