MATLAB 配色関連 Tips

# はじめに
MATLAB Student Ambassador の [K.M.](https://x.com/km_MATLAB_Amb) です．

見栄えの良い配色でグラフを作ると気分が良いですよね？MATLABのデフォルト配色には安心感を覚えますが，色の数が足りなかったり，他の図との相性が悪かったりすると，自分で配色を指定する必要が生じることでしょう．

本記事では，MATLABで配色を指定する [colororder](https://jp.mathworks.com/help/matlab/ref/colororder.html) を利用し，手軽に配色を整えるための Tips を紹介します．以下のグラフを例に，私のよく利用する配色設定方法を紹介します．
```MATLAB
plot(0:0.01:1,(0:0.01:1)'.^(1:6),"linewidth",3);
axis square;
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/a0a653a7-1516-4b81-2468-3dc624ea7ab8.png", width=60%>


# 事前定義されたパレットの利用
事前定義されたパレットから好きなものを選択することができます．詳細は[ドキュメント](https://jp.mathworks.com/help/matlab/ref/colororder.html#mw_1a03864a-b9cc-4ad1-bb79-c6980b1d3e07)を参照してください．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/d28109a7-761f-4da9-e134-889b7b1b5100.png", width=100%>

ここでは，`"sail"` を指定してみます．
```MATLAB
colororder("sail")
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/cd9cc29e-8adf-f4ed-5bf1-00e7261f2bbf.png", width=60%>


# 配色を手動で定義
配色の配列を定義し`colororder`に入力します．カラーコードでの指定例は以下の通りです．
```MATLAB
colororder(["#FF0000"; ... 
            "#FFFF00"; ... 
            "#00FF00"; ... 
            "#00FFFF"; ... 
            "#0000FF"; ... 
            "#FF00FF"])
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/74338db1-f3bb-d3cf-80f4-cc6754642125.png", width=60%>


RGBの各要素を $[0,1]$ の範囲で指定した$N\times 3$の数値配列で配色を指定することも可能です．この場合，数値の操作で色を調整できます．ここでは配列全体を0.9倍することで少し暗くしています．
```MATLAB
colorsRGB = [1,0,0; ...  % 赤
             1,1,0; ...  % 黄
             0,1,0; ...  % 緑
             0,1,1; ...  % シアン
             0,0,1; ...  % 青
             1,0,1];     % マゼンタ
colorsRGB = 0.9 * colorsRGB; % 色を暗くする．
colororder(colorsRGB);
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/b6515c0e-62ab-078c-fefb-d805b19430ed.png", width=60%>


# Linspaceでグラデーション作成
関数のパラメータを少しずつ変化させ，その挙動を見るような状況では，配色をグラデーションにすると見やすい場合があります．

簡単な方法として，`linspace` を利用してRGBの数値配列を作成することが考えられます．

```MATLAB
N         = 6;
red       = linspace(1,   0, N)';
green     = linspace(0,   1, N)';
blue      = linspace(0.2, 1, N)';
colorsRGB = [red green blue];
colororder(colorsRGB);
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/dfdd68de-bcf1-2480-4852-2024bc49ea73.png", width=60%>


# HSVでの色の指定

HSVで色を指定してから `hsv2rgb` で RGB に変換するテクニックが便利な場合もあります．個人的には，RGBの配列を直接操作するよりも直感的だと思います．

```MATLAB
N           = 6;
hue         = mod(linspace(0.6, 1.1,  N) ,1)'; % 色相 0.6 ~ 1.15 の配列を作ってから
                                               % mod 演算で [0,1] に収める
saturation  =     linspace(0.8, 0.8,  N)';     % 彩度
value       =     linspace(0.8, 1,    N)';     % 明度

colorsHSV = [hue, saturation, value];
colorsRGB = hsv2rgb(colorsHSV);
colororder(colorsRGB)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/5c5b7f47-584d-04cb-56fe-19171903906e.png", width=60%>



# 複数のカラーコードを補完してグラデーション作成
`validatecolor` でカラーコードを RGB の数値配列に変換した後，線形補完でグラデーションを作成します．カラーコードさえ指定すればいい感じに間を埋めてくれるので重宝しています．
```MATLAB
colorsHEX = ["#E63946","#A8DADC","#457B9D"]; % この3色から
N         = 6;                               % 計6色の配色を作る
Ncolor    = numel(colorsHEX);
    
colorsRGB = interp1(1:Ncolor, ... % 線形補完でグラデーションに
                    validatecolor(colorsHEX,"multiple"), ...
                    linspace(1,Ncolor,N)); 
colororder(colorsRGB)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612115/83adbfe8-9ed9-5bf6-556e-4972b2aab4b3.png", width=60%>

# おわりに
本記事ではMATLABでの配色の設定方法を紹介しました．より便利な方法をご存じの方は教えていただけると大変助かります．