Subscribed unsubscribe Subscribe Subscribe

matplotlibのカラーマップ

オリジナルのカラーマップを作成して、matplotlibのプロットに使いたいときの方法です。

参考
qiita.com

やりたいことはすべてこちらの方に書いてあるのですが、あくまで備忘録用に書かせていただきます。
参考のColormapのカスタマイズのところで定義されているgenerate_cmap関数さえ書いてしまえば、あとはプロットするだけです。

と、解説すべてを丸投げにしてもいいのですが、さすがにこれでは剽窃となるので、オリジナリティを追加するためにもこちらのgenerate_cmap関数の内部でやってることに対しての自分なりの解釈を書かせていただきたいと思います。

まず、引数にはカラーマップに使う色をリスト形式で与えています。

次に、使う色のリストの長さを求めて、それのリストを作ります。
参考先では3つの色のリストを与えているので、values = [0, 1, 2]として処理されているはずです。

そしてnormalizationをした値と色のリストをタプルとし、それを新たな色のリストとして与えています。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここでいうnormalizationは最大値と最小値で規格化することを指します。
標準正規分布に変換することはstandardizationというようです。
日本語だとどちらも標準化と言われたりするようですが、英語では割りと区別して呼ばれているのかもしれません。
こういった点は英語のほうが便利だと思いますね。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
閑話休題
さてどういうことかを具体的に説明していきたいと思います。
参考先のサンプルを見ながら読んでみてください。

まず、vmaxはvaluesの最大値です。最小値は0です。
ですので、for文内のv/vmaxは規格化された値を出しているのだと思われます。
つまり、
color_list = [(0, mediumblue), (0.5, limegreen), (1.0, orangered)]
となっているはずです。
あとはこのcolor_listを基にmatplotlib.colorsのLinearSegmentedColormapが自動的に0, 0.5, 1.0以外の数値の色を補完してくれるので自動でカラーマップが作成されています。

2016/11/29 追記

もっと単純な書き方を思いついたので記しておきます。

from matplotlib.colors import LinearSegmentedColormap

def create_cmap(color_list = None):
    n = len(color_list)-1
    return LinearSegmentedColormap.from_list(name = 'custom', colors = [(i/n, j) for i, j in enumerate(color_list)])