2016-09-14 5 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、70]に[0、69]からのデータと表示間隔を設定しようとしました

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

が、これは何もする表示されません。

助けてもらえますか?カラーバーのクラスがその__init__でコールmappable.autoscale_None()を持っているので、それがmax_valに設定されていた

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

、設定された:

答えて

1

私の問題を解決する最も簡単な方法は、マッピング可能の定義にvmaxを設定することでしたdata.max()からvmax、すなわち69

私はは私が間違った方法でLinearSegmentedColormapを使用するだけの犠牲者だと思っ。特定の色に割り当てられた離散値が必要ですが、LinearSegmentedColormapに関連付けられたカラーバーの表示は連続データを前提としているため、デフォルト値は​​とdata.max()に設定されています。

関連する問題