[MATLAB] 棒グラフにcolormapを適用する

本記事では,

* **MATLAB R2021a**

を使用しています.

# はじめに
MATLABには[たくさんのplot](https://jp.mathworks.com/help/matlab/creating_plots/types-of-matlab-plots.html)が用意されています. その多くは, colormapなどに対応しており, カラフルな図を作成することができます. しかし, [bar関数](https://jp.mathworks.com/help/matlab/ref/bar.html?s_tid=doc_ta)や[histogram関数](https://jp.mathworks.com/help/matlab/ref/matlab.graphics.chart.primitive.histogram.html)ではカラフルな図が作りづらい気がする. そこで, 今回は, 棒グラフにcolormapを適用してカラフルなヒストグラムを作成することを考えた.

# データの作成
今回は以下のコマンドでデータを作成した.

```code:matlab
numData = 10000; % Set number of Data
range = 10; % Set Data Range
Data = range*randn(1,numData) % Create Data
```

次に, このデータからヒストグラムデータを[histcounts関数](https://jp.mathworks.com/help/matlab/ref/histcounts.html?s_tid=doc_ta)で作成する. 今回は0.1ずつに分けてヒストグラムデータを作成した.

```code:matlab
[N,edges] = histcounts(Data,'BinWidth',0.1);
```

これを[bar関数](https://jp.mathworks.com/help/matlab/ref/bar.html?s_tid=doc_ta)で棒グラフにすると以下のようになる.

```code:matlab
figure
b1 = bar(edges(1:end-1),N);
```

![twitter1_qiita_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/52215191-cb5e-1553-1155-af9c56ba9c58.png)

# x軸に沿ったcolormap表示

```code:matlab
figure
b = bar(edges(1:end-1),N,1,'FaceColor','flat','EdgeColor','none');

%{
If you want to set "xlim" or/and "ylim", please write here!!
%}

```

まずは, $x$軸の値に沿って棒グラフに[colormap](https://jp.mathworks.com/help/matlab/ref/colormap.html?searchHighlight=colormap&s_tid=srchtitle)から得た色を付加していく. ここではcolormapとしてjetを採用した.

```code:matlab
cmap = colormap(jet);
ax = gca;
xrange = ax.XLim; % Get bar Graph x-range
for i = 1:length(N)
    tmp = (edges(i)-xrange(1))/(xrange(2)-xrange(1)); % Normalize to follow the x-range
    color_num = round(length(cmap)*tmp); % Normalize Color Number
    
    % Get color from colormap
    if (color_num < 1)
        b.CData(i,:) = cmap(1,:);
    elseif (color_num > length(cmap))
        b.CData(i,:) = cmap(end,:);
    else
        b.CData(i,:) = cmap(color_num,:);
    end
end
```

ここに[colorbar](https://jp.mathworks.com/help/matlab/ref/colorbar.html?s_tid=doc_ta)も追加すると以下のようになる.

```code:matlab
colorbar('southoutside','ticks',[]);
```

![twitter1_qiita_x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/4251e5e7-cfba-28b4-3dd0-096b06f28602.png)
上図のようにcolorbarと棒グラフの色が対応していることがわかる.

# y軸に沿ったcolormap表示

```code:matlab
figure
b = bar(edges(1:end-1),N,1,'FaceColor','flat','EdgeColor','none');

%{
If you want to set "xlim" or/and "ylim", please write here!!
%}

```

ここでも[colormap](https://jp.mathworks.com/help/matlab/ref/colormap.html?searchHighlight=colormap&s_tid=srchtitle)としてjetを採用する. そして, $y$軸の範囲に対応させて, 各データに対応した色を付加していく.

```code:matlab
cmap = colormap(jet);
ax = gca;
yrange = ax.YLim; % Get bar Graph y-range
for i = 1:length(N)
    tmp = (N(i)-yrange(1))/(yrange(2)-yrange(1)); % Normalize to follow the y-range
    color_num = round(length(cmap)*tmp); % Normalized Color Number
    
    % Get color from colormap
    if (color_num < 1)
        b.CData(i,:) = cmap(1,:);
    elseif (color_num > length(cmap))
        b.CData(i,:) = cmap(end,:);
    else
        b.CData(i,:) = cmap(color_num,:);
    end
end
```

ここに, [colorbar](https://jp.mathworks.com/help/matlab/ref/colorbar.html?s_tid=doc_ta)も付加すると, 以下のようなグラフが得られる.

```code:matlab
colorbar('eastoutside','ticks',[]);
```

![twitter1_qiita_y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1635383/213c85d6-09c4-7bbe-e013-9c1dfcac6182.png)

# おわりに
本記事は以下を参考にさせていただいた.

> MATLAB Answers
>> [Bar plot with color map](https://jp.mathworks.com/matlabcentral/answers/407465-bar-plot-with-color-map)

> MATLAB Documentation
>> [bar](https://jp.mathworks.com/help/matlab/ref/bar.html?s_tid=doc_ta)
>> [histogram](https://jp.mathworks.com/help/matlab/ref/matlab.graphics.chart.primitive.histogram.html?s_tid=doc_ta)
>> [histcounts](https://jp.mathworks.com/help/matlab/ref/histcounts.html?s_tid=doc_ta)
>> [colormap](https://jp.mathworks.com/help/matlab/ref/colormap.html?searchHighlight=colormap&s_tid=srchtitle)
>> [colorbar](https://jp.mathworks.com/help/matlab/ref/colorbar.html?s_tid=doc_ta)
>> [Axesのプロパティ](https://jp.mathworks.com/help/matlab/ref/matlab.graphics.axis.axes-properties.html)

また, 本記事のアイデアをくださった質問者の方に, 心より感謝申し上げます.