web-dev-qa-db-ja.com

Pythonのカスタムカラーマップ

Pythonで独自のカスタムカラーマップを作成したいのですが、オンラインの例をいくつか調べて、コマンドを見つけました。

from matplotlib import cm 
import matplotlib.pyplot as plt 
from matplotlib.colors import LinearSegmentedColormap

cdict1 = {'red':   ((0.0, 0.0, 0.0),
                    (0.5, 0.0, 0.1),
                    (1.0, 1.0, 1.0)),

         'green': ((0.0, 0.0, 0.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 1.0),
                   (0.5, 0.1, 0.0),
                   (1.0, 0.0, 0.0))
         }

blue_red1 = LinearSegmentedColormap('BlueRed1', cdict1)
plt.imshow(big,interpolation='nearest',  cmap=blue_red1, aspect='auto')
plt.colorbar()
plt.show()

上記のコマンドを使用すると、(赤-黒-青)のカラーマップが得られます。ここで、赤は最大、青は最小です。 (黒-白-黒)のカラーマップを作成したいと思います。誰かが何をすべきか、または他の方法を教えてもらえますか?

13
Bow

その価値については、もっと簡単な方法もあります。

LinearSegmentedColormapの完全な形式では、同じカラーマップに「ハード」ストップとグラデーションを含めることができるため、必然的に複雑になります。ただし、説明するような単純なケースには便利なコンストラクターがあります。

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

cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'white', 'black'])

fig, ax = plt.subplots()
im = ax.imshow(np.random.random((10, 10)), cmap=cmap, interpolation='nearest')
fig.colorbar(im)
plt.show()

enter image description here

19
Joe Kington

3つのコンポーネントすべてを0と1の両方で0にし、3つすべてを0.5で1にする必要があります。だから、あなたは持っています:

cdict1 = {'red':  ((0.0, 0.0, 0.0),   # <- at 0.0, the red component is 0
                   (0.5, 1.0, 1.0),   # <- at 0.5, the red component is 1
                   (1.0, 0.0, 0.0)),  # <- at 1.0, the red component is 0

         'green': ((0.0, 0.0, 0.0),   # <- etc.
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0))
         }

enter image description here

8
tmdavison

また、カラーマップの作成がわかりにくいことがわかりました。 LinearSegmentedColormapは非常に柔軟性があるので便利ですが、cdictには多少の慣れが必要です。

この方法でカラーマップを作成するための最初の(そしておそらく最も重要な)ことは、 RGBカラー を理解することです。基本的に、各色の強度値は0から1であり、値が高いほどその色が多くなります。 RGB色空間では、白は1の3色すべてで表され、黒は0の3色すべてで表されます。

この方法でカラーマップを作成する方法を学ぶために重要な2番目のことは、これです。単純な線形カラーマップの作成に慣れるまで、各タプルの2番目と3番目の値を常に同じにします。最終的には、これらの値を変更してカラーマップに不連続性を持たせることができますが、開始時に混乱するだけです。

OK、各タプルの最初の値はカラーマップの「分数」であり、これらは0から1まででなければなりません。2番目と3番目の値はその色の強度(下限と上限)です。したがって、「黒-白-黒」のカラーマップを作成するには、次のようにします。

cdict1 = {
    'red':   ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),

    'green': ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),

    'blue':   ((0.0, 0.0, 0.0),
              (0.5, 1.0, 1.0),
              (1.0, 0.0, 0.0)),
         }

black_white_black = LinearSegmentedColormap('BlackWhiteBlack', cdict1)

例えば、

plt.imshow(np.arange(100).reshape(10,10), cmap=black_white_black, aspect='auto')
plt.colorbar()

Example Image

幸運を!

3
farenorth

のcdict1を試してください

cdict1 = {'red':   ((0.0, 0.0, 0.0),
                    (0.5, 1.0, 1.0),
                    (1.0, 0.0, 0.0)),

         'green': ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0)),

         'blue':  ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0))
         }

この辞書は、赤、緑、青の各コンポーネントを個別に見て、色がどのように補間されるかを説明しています。コンポーネントごとに、そのコンポーネントの補間方法を指定する3タプル(x、y0、y1)のリストを指定すると、必要な各値がリスト内の2つのポイント間で補間されます。

この場合、黒[RGB =(0,0,0)]から始めて、データ範囲の中間点で白[RGB = 1,1,1]に増やし、次に黒に戻します。終わり。

色を割り当てる値ごとに、マップは最初にその値を入力範囲の一部に変換して、[0、1]の範囲にあるものを含めます。赤のコンポーネントのレベルを取得するために、マップは「赤」リストの各3タプルの最初の要素をスキャンし、分数を超えない最大の要素を取得します。割り当てられた赤レベルは、x値の差に基づいて、その3タプルのy1要素と次の3タプルのy0要素の間で補間されます。

青と緑のコンポーネントについても同様です。

1
ehaymore