2017-12-05 8 views
1

0から(を含む)22までの2次元配列を持っています。 通常のマットプロットでは、 。 私は、カラーマップだけで、正規化してみましたが、色15と16は一貫していません。離散的な色を持つ2次元配列は、1つの中間値では機能しません

正規化なしでは、15の色は16です(もちろん、ホバーの値はミスアライメントされた浮動小数です)。 正規化では、16が15の色を持つ以外はすべて問題ありません。

同じことを尋ねる他にも複数の質問がありましたが、この問題が発生しました。

import matplotlib.pyplot as plt 
import matplotlib.colors as colors 

example_data = [list(range(23))]*4 
cmaplist = [ 
    "#b3b3b3", "#333333", "#8a745c", "#8f7456", 
    "#847362", "#1a53ff", "#336600", "#aa8a31", 
    "#b3b3b3", "#aa8a31", "#aa8a31", "#004d00", 
    "#aa8a31", "#5c330a", "#999999", "#66d9ff", 
    "#e481a2", "#e996b1", "#e481a2", "#e06c92", 
    "#e87da1", "#fff11c", "#ff6600" 
] 
norm = colors.BoundaryNorm(range(len(cmaplist)+1), len(cmaplist)) 
cmap = colors.LinearSegmentedColormap.from_list('mycmap', cmaplist, len(cmaplist)) 

plt.matshow(example_data, fignum=False, cmap=cmap, norm=norm) 
plt.show() 

私はmatplotlibなどではあまりよくありません。だから、これは本当に明白な間違いかもしれません。私はちょうど単純な値のデータの検索のようにこれを扱っていますが、それは実際にはどのように機能するのかわかりませんが、限られた知識でより良いアプローチを考えることはできません。

答えて

1

まずMCVEを作成しよう:

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

example_data = np.array([list(range(20))]*4) 
cmaplist = ["red", "limegreen", "blue", "gold"]*5 

fig, ax = plt.subplots() 

norm = colors.BoundaryNorm(np.arange(0,len(cmaplist)+1)-0.5, len(cmaplist)) 
cmap = colors.LinearSegmentedColormap.from_list('mycmap',cmaplist, len(cmaplist)) 

im = ax.matshow(example_data, cmap=cmap, norm=norm) 

plt.show() 

enter image description here

分かるように、位置15は黄色であるべきであるが、位置14及び15の色は、同じです。これはmatplotlib 2.1、matplotlib 2.0.2にあります。問題はそこにないようです。私は約bug reportを開いた。

ソリューション:

(ここでは整数である)あなたがマッピングされている数字は、境界のエッジ上に正確です。私はここでうまくいかないかを正確にわからないんだけど、保存側にあることを、あなたが境界として二つの整数の中間を使用することができ、すなわち

norm = colors.BoundaryNorm(np.arange(0,len(cmaplist)+1)-0.5, len(cmaplist))

コンプリート例:

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

example_data = np.array([list(range(20))]*4) 
cmaplist = ["red", "limegreen", "blue", "gold"]*5 

fig, ax = plt.subplots() 

norm = colors.BoundaryNorm(np.arange(0,len(cmaplist)+1)-0.5, len(cmaplist)) 
cmap = colors.LinearSegmentedColormap.from_list('mycmap',cmaplist, len(cmaplist)) 

im = ax.matshow(example_data, cmap=cmap, norm=norm) 

plt.show() 

enter image description here

+0

@BluBb_mADe簡単な質問:これはpython 2.7とmatplotlib 2.1で行いました。どのバージョンを使用していますか? MCVEに関する – ImportanceOfBeingErnest

+0

。色の数や色を指定した方法がこの動作の原因であったかどうかはわかりませんでしたので、すべてを含めました。 ps。 python 2.7.14 matplotlib 2.1.0、numpy 1.13.3 win10のpipからすべて。 –

+0

私は[これに関する問題](https://github.com/matplotlib/matplotlib/issues/9937)を作成しました。この動作はmatplotlib 2.0.2には存在しませんでした。一般的には、ビンエッジの場合でも – ImportanceOfBeingErnest