カラーマップ拡張ライブラリ palettable の紹介

# カラーマップ拡張ライブラリ palettable
`matplotlib`で描画する際，「もっといろんなカラーマップ（またはカラーサイクル）があれば良いのになぁ」なんて思ったことはありませんか？
ここでは，そんなお悩みを解決する便利な拡張ライブラリを紹介します。
それが， **palettable** です。なんとそこには**1599個**ものカラーマップが用意されています。
`matplotlib`の標準カラーマップは79個なので，なんと**約20倍**!!。

なお，`matplotlib`のカラーマップは様々な方法で編集・自作することができるため，実のところ拡張ライブラリに頼る必要は無いとも言えます。`palettable`はそうやって作った沢山のカラーマップがアーカイブされているに過ぎません。

ですので，この記事は**「もっと他のカラーマップを使いたいけど，いろいろ調べて自分で作るのはめんどくさい。簡単に使える拡張ライブラリがあるならそれを使っちゃおう！」**という方向けです。

`palettable`のカラーマップ一覧は，**[こちら](https://qiita.com/tsukada_cs/items/d282f27f4024d00d7022)**の記事にまとめています（あまりに多いので切り分けました）。 
本家HP（英語）は[こちら](https://jiffyclub.github.io/palettable/)。

# インストール
`pip`コマンドで簡単にインストール可能です。

```
pip install palettable
```

# palettableの使い方（カラーサイクル編）
matplotlibは，プロットを描画するときにデフォルトのカラーサイクルに従います。
例えばこんな感じで，デフォルトでは10個で一周し，11個目で元の色に戻ります。

```python
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()
```
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/d2e8f4e0-32ad-beaa-b1f4-46bbab3c2d6a.png)
この時使われたカラーサイクルは，`matplotlib`におけるデフォルトの`tab10`でした：
![tab10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/d2cb1438-9ac6-dff6-f073-197c55222146.png)
それではこれを，`palettable`のカラーサイクルに変えてみます。今回は`palettable.scientific.sequential.Tokyo_10`を使ってみます。`palettable`のカラーサイクルは`palettable.scientific.sequential.Tokyo_10.mpl_colors`で
取得できます（末尾に`.mpl_colors`が付いただけ）。
![Tokyo_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/200707e6-82db-9d48-beca-13521ab5c2c6.png)

カラーサイクルを変えるには， `ax.set_prop_cycle()`を使います：

```python
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個で一周しています。
![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/65bbab1a-c25c-560d-2512-2a9199c846d6.png)

ここで，`ax.set_prop_cycle()`に渡した`palettable.scientific.sequential.Tokyo_10.mpl_colors`は，単なるPythonの`list`オブジェクトに過ぎません。
中身はこんな感じ。規格化された10行3列のRGB配列ですね：

```python
>>> 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_`では，`３`から`20`まで指定できます。
例えば11個で一周するように`palettable.scientific.sequential.Tokyo_11`を使ってみると，次のようになります：
![Tokyo_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/f0bfdbdc-39a1-7a1c-c6ac-16d05ba16240.png)
![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/8c111369-dac8-406b-2be4-e7c4da64cdc9.png)
ちょうど11個で一周しました。

# palettableの使い方（カラーマップ編）
いよいよカラーマップです。実は，こっちの方が簡単に使えます。
まずは簡単なサンプルコードで２次元プロットをしてみます。

```python
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)
```
![fig4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/3d55bbdb-e0f8-bb29-5276-a4ef8af1f517.png)
では，このカラーマップを先程と同じ`palettable.scientific.sequential.Tokyo_10`に変えてみます。
`palettable`のカラーマップは`palettable.scientific.sequential.Tokyo_10.mpl_colormap`で
取得できます（末尾に`.mpl_colormap`が付いただけ）。

```python
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)
```
![fig5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/b9eaaeb9-a491-6353-e783-67a657435573.png)
随分と雰囲気が違って見えますね。

なお，cmapオプションに与えた`palettable.scientific.sequential.Tokyo_10.mpl_colormap`の中身は，`matplotlib.colors`の`LinearSegmentedColormap`オブジェクトになっています：

```python
>>> palettable.scientific.sequential.Tokyo_10.mpl_colormap
<matplotlib.colors.LinearSegmentedColormap at 0x7fb05793f0d0>
```
また，`palettable`のカラーマップを使う場合，カラーサイクルのサイクル数を示していた最後の数字（`_10`の部分）と同様に，色の分解能を表します。試しに`_3`と`_20`を比べてみます：
![fig6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323043/b268e3ae-c1ea-3144-5634-2115dd99d807.png)
見た目が結構変わりますね。表現したい変動幅に合わせて色の分解能を変化させると良いでしょう。

# さいごに
palettableカラーマップ一覧は，**[こちら](https://qiita.com/tsukada_cs/items/d282f27f4024d00d7022)**の記事にまとめました。 
最後まで読んでいただきありがとうございました。