[matplotlib] カラーマップ色々

# Perceptually Uniform Colormaps
Matplotlibのカラーマップは多数用意されていていますが，特にperceptually uniform，すなわち知覚的に均一なものはデータを歪めることなく可視化できるのでとても優れています．また色覚障害のある方にも均一に見えるように設計されています．SciPy 2015において発表された[A Better Default Colormap for Matplotlib](https://www.youtube.com/watch?v=xAoljeRJ3lU)にperceptually uniformなカラーマップの開発話やmatlabデフォルトのカラーマップとの比較があります．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119868/fdb530a1-1252-28d7-a1ff-bf02c62a00fa.png" width=60%>

Matplotlibのデフォルトカラーマップ以外にも，[cmocean](https://matplotlib.org/cmocean/)というパッケージをインストールすると更に多くのperceptually uniformなカラーマップを使えるようになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119868/6f15e56d-d1e5-ef03-a5f3-a905718fe082.png)

またCrameri et al.によるNature Communicationの論文["The misuse of colour in science communication"](https://www.nature.com/articles/s41467-020-19160-7)でも誤ったカラーマップの使用について議論されています．さらに，新しいperceptually uniformかつ色覚障害者にも優しいカラーマップとして[batlow等](https://www.fabiocrameri.ch/batlow/)が提案されています．
<img src="https://uk.mathworks.com/matlabcentral/mlc-downloads/downloads/988c00c0-6131-42e7-8246-e1efbf8825a2/1da1cc21-d678-4dfc-9ab7-667916cc48ed/images/1612450965.png", width=80%>

ここでテイラー・グリーン渦の渦度をjetと３種類のperceptually uniformなカラーマップで可視化してみましょう．
$$
\begin{aligned}
\omega &= 2 \sin x \sin y.
\end{aligned}
$$
![PerceptuallyUniform.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119868/c41ee65e-0f30-52af-df64-ac2bc3f9b00f.png)
こうやって比較してみるとjetが以下にデータを歪曲させているかが一目瞭然です．他のperceptually uniformなカラーマップは滑らかにデータを可視化できています．


# 簡単にカスタムカラーマップを自作したい
### matplotlibのカラーマップを組み合わせる方法
上記で紹介したmatplotlibやcmoceanで大体は事足りるのですが，稀にそれ以外のカラーマップが欲しいときがあります．
[Matplotlib公式](https://matplotlib.org/3.1.0/tutorials/colors/colormap-manipulation.html)に方法が載っていますが，基本的に2行でできます．
例としてMatplotlibのデフォルトカラーマップにある"Blues"と"OrRd"を使ってdivergingカラーマップを作ります．
<img src="https://matplotlib.org/stable/_images/sphx_glr_colormaps_002.png" width=70%>

```Python:
import matplotlib as mpl
from matplotlib.colors import LinearSegmentedColormap

BuWhOr_colours = [(0, mpl.cm.datad['Blues'][-1]), (0.25, mpl.cm.datad['Blues'][4]), (0.4, mpl.cm.datad['Blues'][1]), (0.5, 'white'), (0.6, mpl.cm.datad['OrRd'][1]), (0.75, mpl.cm.datad['OrRd'][4]), (1, mpl.cm.datad['OrRd'][-1])]
BuWhOr = LinearSegmentedColormap.from_list('BuWhOr', BuWhOr_colours)
```
ここで
```Python:
(0, mpl.cm.datad['Blues'][-1])
```
は新しいカラーマップの下端(0)でMatplotlib "Blues"の上端(-1)の色を指定という意味です．

### cmoceanのカラーマップを組み合わせる方法
例としてcmoceanの"tempo"と"matter"を組み合わせてdivergingカラーマップを作ります．
```Python:
from cmocean.cm import balance, curl, thermal, matter, tempo
from cmocean.tools import get_dict
tempo_cm = get_dict(tempo, N=9)
matter_cm = get_dict(matter, N=9)
TempoMatter_Colours = [(0, (tempo_cm['red'][-1][1], tempo_cm['green'][-1][1], tempo_cm['blue'][-1][1])), (0.25, (tempo_cm['red'][4][1], tempo_cm['green'][4][1], tempo_cm['blue'][4][1])),\
    (0.4, (tempo_cm['red'][1][1], tempo_cm['green'][1][1], tempo_cm['blue'][1][1])), (0.5, 'white'), (0.6, (matter_cm['red'][1][1], matter_cm['green'][1][1], matter_cm['blue'][1][1])),\
     (0.75, (matter_cm['red'][4][1], matter_cm['green'][4][1], matter_cm['blue'][4][1])), (1, (matter_cm['red'][-1][1], matter_cm['green'][-1][1], matter_cm['blue'][-1][1]))]
TempoMatter = LinearSegmentedColormap.from_list('TempoMatter', TempoMatter_Colours)
```
```get_dict()```でカラーマップのRGBコード（辞書型）にアクセスします．
```Python:
tempo_cm['red'][-1][1]
```
は```tempo_cm```のRGBのうちRの下端という意味です．```tempo_cm['red'][-1]```だけだと同じ値を二つ返してくるので最後に```[1]```を足しています．
Matplotlib, cmocean, batlowの同系色のカラーマップと比較してみましょう．
![CustomColourmaps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119868/96e3a6e4-bd39-a508-d1cd-bb90f0848e32.png)

綺麗なカラーマップができました！