カラーマップ拡張ライブラリ palettable
matplotlib
で描画する際,「もっといろんなカラーマップ(またはカラーサイクル)があれば良いのになぁ」なんて思ったことはありませんか?
ここでは,そんなお悩みを解決する便利な拡張ライブラリを紹介します。
それが, palettable です。なんとそこには1599個ものカラーマップが用意されています。
matplotlib
の標準カラーマップは79個なので,なんと約20倍!!。
なお,matplotlib
のカラーマップは様々な方法で編集・自作することができるため,実のところ拡張ライブラリに頼る必要は無いとも言えます。palettable
はそうやって作った沢山のカラーマップがアーカイブされているに過ぎません。
ですので,この記事は**「もっと他のカラーマップを使いたいけど,いろいろ調べて自分で作るのはめんどくさい。簡単に使える拡張ライブラリがあるならそれを使っちゃおう!」**という方向けです。
palettable
のカラーマップ一覧は,**こちら**の記事にまとめています(あまりに多いので切り分けました)。
本家HP(英語)はこちら。
インストール
pip
コマンドで簡単にインストール可能です。
pip install palettable
palettableの使い方(カラーサイクル編)
matplotlibは,プロットを描画するときにデフォルトのカラーサイクルに従います。
例えばこんな感じで,デフォルトでは10個で一周し,11個目で元の色に戻ります。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 100)
fig, ax = plt.subplots()
for i in range(11):
y = np.sin(x)+i
ax.plot(x, y)
plt.show()
この時使われたカラーサイクルは,matplotlib
におけるデフォルトのtab10
でした:
それではこれを,palettable
のカラーサイクルに変えてみます。今回はpalettable.scientific.sequential.Tokyo_10
を使ってみます。palettable
のカラーサイクルはpalettable.scientific.sequential.Tokyo_10.mpl_colors
で
取得できます(末尾に.mpl_colors
が付いただけ)。
カラーサイクルを変えるには, ax.set_prop_cycle()
を使います:
import numpy as np
import matplotlib.pyplot as plt
import palettable # 追加
x = np.linspace(0, 2*np.pi, 100)
fig, ax = plt.subplots()
# 次の行を追加
ax.set_prop_cycle('color', palettable.scientific.sequential.Tokyo_10.mpl_colors)
for i in range(11):
y = np.sin(x)+i
ax.plot(x, y)
plt.show()
結果はこうなります。指定したカラーサイクルになっていて,10個で一周しています。
ここで,ax.set_prop_cycle()
に渡したpalettable.scientific.sequential.Tokyo_10.mpl_colors
は,単なるPythonのlist
オブジェクトに過ぎません。
中身はこんな感じ。規格化された10行3列のRGB配列ですね:
>>> palettable.scientific.sequential.Tokyo_10.mpl_colors
[(0.10196078431372549, 0.054901960784313725, 0.20392156862745098),
(0.27058823529411763, 0.12549019607843137, 0.2980392156862745),
(0.43137254901960786, 0.24313725490196078, 0.403921568627451),
(0.5215686274509804, 0.3686274509803922, 0.47058823529411764),
(0.5529411764705883, 0.4745098039215686, 0.5098039215686274),
(0.5725490196078431, 0.5803921568627451, 0.5372549019607843),
(0.592156862745098, 0.6823529411764706, 0.5686274509803921),
(0.6549019607843137, 0.807843137254902, 0.615686274509804),
(0.8352941176470589, 0.9490196078431372, 0.7372549019607844),
(0.996078431372549, 0.996078431372549, 0.8470588235294118)]
また,何個で一周するかは,palettable.scientific.sequential.Tokyo_10
の最後の数字で決まっていて,指定できる数字はカラーコードによって異なります。例えばpalettable.scientific.sequential.Tokyo_
では,3
から20
まで指定できます。
例えば11個で一周するようにpalettable.scientific.sequential.Tokyo_11
を使ってみると,次のようになります:
ちょうど11個で一周しました。
palettableの使い方(カラーマップ編)
いよいよカラーマップです。実は,こっちの方が簡単に使えます。
まずは簡単なサンプルコードで2次元プロットをしてみます。
import numpy as np
import matplotlib.pyplot as plt
xx, yy = np.meshgrid(np.linspace(0, 2*np.pi, 100), np.linspace(0, 2*np.pi, 100))
zz = np.sin(xx+yy)
fig, ax = plt.subplots()
mp = ax.imshow(zz, cmap="Blues") # この行でcolormapを指定する
fig.colorbar(mp)
では,このカラーマップを先程と同じpalettable.scientific.sequential.Tokyo_10
に変えてみます。
palettable
のカラーマップはpalettable.scientific.sequential.Tokyo_10.mpl_colormap
で
取得できます(末尾に.mpl_colormap
が付いただけ)。
import numpy as np
import matplotlib.pyplot as plt
import palettable # 追加
xx, yy = np.meshgrid(np.linspace(0, 2*np.pi, 100), np.linspace(0, 2*np.pi, 100))
zz = np.sin(xx+yy)
fig, ax = plt.subplots()
# 次の行のcmapオプションを変更
mp = ax.imshow(zz, cmap=palettable.scientific.sequential.Tokyo_10.mpl_colormap)
fig.colorbar(mp)
なお,cmapオプションに与えたpalettable.scientific.sequential.Tokyo_10.mpl_colormap
の中身は,matplotlib.colors
のLinearSegmentedColormap
オブジェクトになっています:
>>> palettable.scientific.sequential.Tokyo_10.mpl_colormap
<matplotlib.colors.LinearSegmentedColormap at 0x7fb05793f0d0>
また,palettable
のカラーマップを使う場合,カラーサイクルのサイクル数を示していた最後の数字(_10
の部分)と同様に,色の分解能を表します。試しに_3
と_20
を比べてみます:
見た目が結構変わりますね。表現したい変動幅に合わせて色の分解能を変化させると良いでしょう。
さいごに
palettableカラーマップ一覧は,**こちら**の記事にまとめました。
最後まで読んでいただきありがとうございました。