

二次元データで, `np.uint8` 型の値で色分けを考えています。

  * matplotlib の imshow を使用している
  * `colors.ListedColormap`, `colors.BoundaryNorm` を利用予定

普段の利用にはこれで十分可能なはずが, なぜか時々 色化けが発生します  
問題を再現できる中でデータを絞り込んでみた結果は 以下の通り

  * 元々の shapeは 60x60 ⇨ 4x4 へ
  * 20 種類の色分け ⇨ 8 種類へ
  * `ListedColormap()` で色の重複があったのを重複なしへ

(以下は, 色マップと二次元データ)

[code]

    import matplotlib.pyplot as plt
    from matplotlib import colors
    import numpy as np
    
    cmap = colors.ListedColormap(['red', 'green', 'maroon', 'gray', 'Orange', 'Plum', 'lightyellow', 'Aqua'])
    bounds = [0,1,3,4,13,16,48,50]+[100]
    norm = colors.BoundaryNorm(bounds, cmap.N)
    # display(cmap)
    
    # 色マップ: 256パターン中 100種の表示 (データは 8 種類)
    fig, ax = plt.subplots()
    a = np.arange(100).reshape(10,10)
    ax.imshow(a, cmap=cmap, norm=norm)   #, interpolation='nearest', vmin=vmin, vmax=vmax)
    
[/code]

[![カラーマップ](https://i.stack.imgur.com/sLigg.png)](https://i.stack.imgur.com/sLigg.png)

[code]

    # 二次元データ
    arr = np.array([
     [ 3,  3, 16,  0],
     [ 3,  3, 48, 50],
     [ 1, 13, 16, 50],
     [ 1,  1,  4,  4]], dtype=np.uint8)
    
    # データ arr を cmapに基づき色付け
    fig, ax = plt.subplots()
    ax.imshow(arr, cmap=cmap, norm=norm)
    plt.show()
    #fig.savefig('fig1.png')
    
[/code]

[![元のパターン](https://i.stack.imgur.com/WiSyT.png)](https://i.stack.imgur.com/WiSyT.png)

上記のパターンを元に, 左上隅の値を変化させると,  
値によっては 別の位置まで色が変わります

以下のコードでは

  * 右上の図で(左上隅を 68にすると), 左下部分 1 のデータが赤で表示されてしまう
  * 右下の図で(左上隅を 70にすると), 右下の部分, 4 のデータが maroon らしき色に変わる

[code]

    def disp_num(arr, ax):
        for r, row in enumerate(arr):
            for c, txt in enumerate(row):
                ax.text(c, r, txt, fontsize=12, ha='center', color='white')
    
    fig, ax = plt.subplots(nrows=2, ncols=3, figsize=(9, 6))
    axes = ax.flatten()
    
    for p,n in enumerate((0, 10, 68, 50, 60, 70)):
        arr[0, 0] = n
        ax = axes[p]
        ax.imshow(arr, cmap=cmap, norm=norm)
        disp_num(arr, ax)
    
    plt.show()
    #fig.savefig('fig2.png')
    
[/code]

[![問題が出るパターン
一部](https://i.stack.imgur.com/k90vG.png)](https://i.stack.imgur.com/k90vG.png)

### 環境

`sys.version`  
3.10.4  
`matplotlib.__version__`  
3.5.2

colab でも同じ現象 ('3.7.13' と '3.2.2')

### 質問

なぜ関係ないデータの色まで変わるのでしょうか？  
(指定ミスがあるのか, 使い方が間違っているのか (など))

※ 色分け自体は別アプローチで解決していて影響はないけれど, 同様の質問が出たので ついでに質問してみました  
[numpy
二次元配列データから3次元配列を生成してカラー画像にしたい](https://ja.stackoverflow.com/questions/88844/)

### 背景

本来の(？)カラーマップならば, 10〜20, 20〜30, 30〜40 など, それぞれに幅があるかと思われ  
また, 段階的に明るくなる や 青みがかるなどグラデーション的な配色で利用することが多いかなと

今回の場合, 値を色に変換する目的なため, (範囲なし)一点のみが多く, 色も唐突  
それでも `BoundaryNorm` ならば対処可能かと判断しました (たぶん stackoverflow.com で見かけた
Q＆Aでもそのような使い方載ってたはず)

(大抵はうまく表示されることが多いものの, ふとした拍子に色が極端に変化したので)


CC BY-SA 4.0
2022-05-17T10:52:39.240
88879
2022-05-18T10:54:08.943
2022-05-18T10:54:08.943
3060
43025
question
python python3 numpy matplotlib
二次元配列データを色分けする際, (所々)違う色で表示される (matplotlib - imshow)