読者です 読者をやめる 読者になる 読者になる

存在を忘れられる備忘録

あれこれTwitterじゃ流れるから残しときたい書き物用

matplotlibのcolormapを自分好みにする

Python

散布図とか描くとき色分けしてプロットすると思うんですけど、ちょっとデフォルトのものから変更したかったので調べてみました。途中から飽きて雑にしか理解してないので話半分に読んでください。

ざっくり説明すると、以下のようにRGB各色について点を0から1の範囲で指定すると線形補間してくれて色が決まるそう。1列目が入力の対応位置、2列目と3列目が実際に取る値になります。y=f(x)とすると1列目がxで2,3列目がyに当たると考えれば。yが2つある理由は後述しますが、取りあえずは同じ値を設定しておけば困らないと思います。

cdict1 = {'red':((0.0,0.5,0.5),
                 (0.25,0.0,0.0),
                 (0.5,1.0,1.0),
                 (0.75,0.0,0.0),
                 (1.0,0.5,0.5)),
          'green':((0.0,0.0,0.0),
                   (1.0,0.0,0.0)),
          'blue':((0.0,0.0,0.0),
                  (1.0,0.0,0.0))}

この場合、緑と青は全域で0、赤の値が最小値から最大値にかけて以下のグラフのように変化します。

f:id:dj_marble:20151118213656p:plain

実際に散布図をプロットしたものが以下になります。

f:id:dj_marble:20151118213742p:plain

さて、2列目と3列目が分かれている理由ですが線形補間を行う際、補間したい点を挟むcdictで定義された2点をa,bとしてa[0]<b[0]とすると、a[2]とb[1]を用いて補間されます。説明下手なので自分でも何言ってるかさっぱりですが、以下のように点を指定すると、

cdict2 = {'red':((0.0,1.0,1.0),
                 (0.5,0.0,1.0),
                 (1.0,0.0,0.0)),
          'green':((0.0,0.0,0.0),
                   (1.0,0.0,0.0)),
          'blue':((0.0,0.0,0.0),
                  (1.0,0.0,0.0))}

赤色の値は下図のように補完されます。

f:id:dj_marble:20151118215841p:plain

散布図を描くとこんな感じ。

f:id:dj_marble:20151118220011p:plain

おわかりいただけただろうか。理解力を総動員していただきたい。

もともと欲しかったのはこんなcolormap。

cdict3 = {'red':((0.0,1.0,1.0),
                 (0.5,0.25,0.25),
                 (1.0,1.0,1.0)),
          'green':((0.0,1.0,1.0),
                   (0.5,0.5,0.5),
                   (0.75,1.0,1.0),
                   (1.0,0.25,0.25)),
          'blue':((0.0,1.0,1.0),
                  (0.5,0.75,0.75),
                  (0.75,0.0,0.0),
                  (1.0,0.0,0.0))}

f:id:dj_marble:20151118220446p:plain

気持ち雨量レーダーっぽいかと思います。そうでもないかとも思います。どんなグラフにすればこうなるか理解力が無くてわからなかったので以下のサイトを使いました。

Custom colormaps for Matlab and Matplotlib - Colormap.org

これそのまま使えばええやんとも思った。以下使用したコード。