MATLABでグラフを作成する際に軸目盛のマイナスがハイフンになる問題

# はじめに

（この記事どれくらいの人に需要があるのだろうか……記事全体を通して変なところがあれば教えてください）
MATLAB の標準ではなく，`set(gca,'TickLabelInterpreter', 'latex');` のように
LaTeX 記法で軸目盛を作成した際に，特に何もしなければマイナス（−）がハイフン（-）で表示されてしまいます．
そもそも「え！？ハイフンとマイナスって違うの！？」って人は[こちら](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%95%E3%83%B3)をどうぞ．
例えば下記のコードでグラフを作成すると……

```MATLAB:hyhen.m
clear all
close all
clc

fig = figure('Visible','on');

% 全体設定
set(fig,'defaultAxesXColor','k');
set(fig,'defaultAxesYColor','k');
set(fig,'defaultLegendTextColor','k');
fsize = 12;

x = -10:0.001:10;
f1 =  exp(-0.25*x);
f2 = -exp(-0.25*x);
f3 =  exp(-0.25*x).*sin(x);
plot(x, f1, x, f2, x, f3);

% 軸目盛の設定
set(gca,'TickLabelInterpreter', 'latex');
xlim([-10 10]);
xticks(-10:5:10);
ylim([-15 15]);
yticks(-15:5:15);

% 軸ラベルの設定
xlabel('$x$', 'Interpreter', 'latex', 'FontSize', fsize);
ylabel('$y$', 'Interpreter', 'latex', 'FontSize', fsize);

% 凡例の設定
legend({'$y = e^{-0.25x}$', ...
        '$y = e^{-0.25x}$', ...
        '$y = e^{-0.25x}\sin x$' ...
        }, 'Interpreter', 'latex', 'FontSize', fsize);

% グリッドの表示
grid on;

% 座標軸ツールバーの表示
tb = axtoolbar('Visible', 'off');

exportgraphics(fig, 'graph_test.png','Resolution',750);
```
![hyphen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/de0150b8-3bfc-7a31-55de-b53a04bdd9dc.png)

このようになります．
出力された図を見てみると，凡例はマイナスで表示されているにもかかわらず軸目盛の方はハイフンで表示されています．
`set(gca,'TickLabelInterpreter', 'latex');` をしてあげるとフォントが LaTeX 標準の Computer Modern っぽい見た目のフォントに切り替わるので論文に使用する図ではよく使っています．
しかし，マイナスがハイフンになってしまうのが私はどうしても気持ち悪かったのでいろいろ試してみました．

# 解決方法

簡単に言うと，これは `set(gca,'TickLabelInterpreter', 'latex');` で LaTeX 記法にしているのだから，マイナスを表示させたかったら `$-$` のように数式環境に入れないといけないのにそのままにしていることが原因です．
というわけで軸目盛の数字を全部数式環境にぶち込んであげれば解決します．

## 解決方法その 1

まず一つ目のやり方は，軸目盛の一つ一つの数字を手作業で数式環境にしてあげる方法です．
軸目盛の設定を下記のように書き換えます．

```MATLAB:minus1.m
% 軸目盛の設定
set(gca,'TickLabelInterpreter', 'latex', 'FontSize', fsize);
xlim([-10 10]);
xticks(-10:5:10);
xticklabels({'$-10$','$-5$','$0$','$5$','$10$'});
ylim([-15 15]);
yticks(-15:5:15);
yticklabels({'$-15$','$-10$','$-5$','$0$','$5$','$10$','$15$'});
```
これで図を出力してみると……
![minus1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/c84f3ae1-76ea-5e92-ab7a-56d4fff46172.png)
マイナスになった！（歓喜）
これのいいところは一つ一つの目盛りに対して自由に文字を書けるところです．
例えば，軸目盛にギリシャ文字や数式を使用したいときに便利です．
```MATLAB:minus2.m
% 軸目盛の設定
set(gca,'TickLabelInterpreter', 'latex', 'FontSize', fsize);
xlim([-10 10]);
xticks(-3*pi:pi:3*pi);
xticklabels({'$-3\pi$','$-2\pi$','$-\pi$','$0$','$\pi$','$2\pi$','$3\pi$'});
ylim([-15 15]);
yticks(-15:5:15);
yticklabels({'$-15$','$-10$','$-5$','$0$','$5$','$10$','$15$'});
```

実行すると
![minus2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/c04c500c-f3ec-eeb2-581f-cae23e6752b3.png)
こんな感じになります．

でも全部手動で数式環境に入れるの面倒ですよね．
自動化しましょう．

## 解決方法その 2

二つ目のやり方は，自動で軸目盛の数字を全部数式環境に入れてあげる方法です．
軸目盛の数字を `$$` で囲んだ文字列に置き換えてあげればいいわけですから，軸目盛の設定を下記のように書き換えましょう．

```MATLAB:minus3.m
% 軸目盛の設定
set(gca,'TickLabelInterpreter', 'latex', 'FontSize', fsize);
xlim([-10 10]);
xticks(-10:5:10);
ylim([-15 15]);
yticks(-15:5:15);
tickValuesx=get(gca, 'XTick');
tickValuesy=get(gca, 'YTick');
tickLabelsx=cellstr(num2str(tickValuesx', '$%g$'));
tickLabelsy=cellstr(num2str(tickValuesy', '$%g$'));
set(gca, 'xticklabels', tickLabelsx);
set(gca, 'yticklabels', tickLabelsy);
```

コードの簡単な説明をすると，
1. `set(gca,'TickLabelInterpreter', 'latex', 'FontSize', fsize);` から `yticks(-15:5:15);`：省略．
1. `tickValuesx=get(gca, 'XTick');`, `tickValuesy=get(gca, 'YTick');`：現在の軸目盛の値を取得し，`tickValuesx`, `tickValuesy` に格納．
1. `tickLabelsx=cellstr(num2str(tickValuesx', '$%g$'));`, `tickLabelsy=cellstr(num2str(tickValuesy', '$%g$'));`：各軸目盛の値を文字列に変換し，セル配列にして保存．その際，`$$` で囲むことで数式環境にしている．
1. `set(gca, 'xticklabels', tickLabelsx);`, `set(gca, 'yticklabels', tickLabelsy);`：各軸目盛のラベルを `tickLabelsx`, `tickLabelsy` に設定．

それでは実行してみましょう．
![minus3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/1c1c4dbd-b1a2-b181-f0dd-61368b950b58.png)
大丈夫そうですね．

## 解決方法その 3
その 2 とほぼ同じです．
ただ，もっとスマートなやり方を[michio inoue l MATLAB の中の人](https://twitter.com/michio_MWJ?s=20)様にご教示いただいたので紹介します．

```MATLAB:minus4.m
% 軸目盛の設定
set(gca,'TickLabelInterpreter', 'latex', 'FontSize', fsize);
xlim([-10 10]);
xticks(-10:5:10);
ylim([-15 15]);
yticks(-15:5:15);
tickValuesx=get(gca, 'XTick');
tickValuesy=get(gca, 'YTick');
tickLabelsx = "$" + tickValuesx + "$";		% ココが違う
tickLabelsy = "$" + tickValuesy + "$";		% ココが違う
set(gca, 'xticklabels', tickLabelsx);
set(gca, 'yticklabels', tickLabelsy);
```

結果は同じです．

# カラーマップの場合

カラーマップの場合は軸ラベルの他にもカラーバーの数値にマイナスが入ることがあります．
カラーバーも特に何もしなければハイフンで表示されてしまうので下記のコードでマイナスに変換してあげます．

```MATLAB:colormap.m
clear all
close all
clc

fig = figure('Visible','on');

% 全体設定
set(fig,'defaultAxesXColor','k');
set(fig,'defaultAxesYColor','k');
set(fig,'defaultLegendTextColor','k');
fsize = 12;

x = -3:0.1:3;
y = -3:0.1:3;
[X, Y] = meshgrid(x,y);
Z = peaks(X,Y);
contourf(X,Y,Z)
clim([-6 6])

% 軸目盛の設定
set(gca,'TickLabelInterpreter', 'latex', 'FontSize', fsize);
xlim([-3 3]);
xticks(-3:1:3);
ylim([-3 3]);
yticks(-3:1:3);
tickValuesx=get(gca, 'XTick');
tickValuesy=get(gca, 'YTick');
tickLabelsx=cellstr(num2str(tickValuesx', '$%g$'));
tickLabelsy=cellstr(num2str(tickValuesy', '$%g$'));
set(gca, 'xticklabels', tickLabelsx);
set(gca, 'yticklabels', tickLabelsy);

% カラーバーの設定
clb=colorbar('FontSize', fsize);
set(clb, 'TickLabelInterpreter', 'latex');
clb.Ticks=[-6 -3 0 3 6];
tickValues=get(clb, 'Ticks');
tickLabels=cellstr(num2str(tickValues', '$%g$'));
set(clb, 'TickLabels', tickLabels);
clb.Label.Interpreter='latex';
clb.Label.Rotation=0;
clb.Label.FontSize=fsize;
clb.Label.String='$z$';

% 軸ラベルの設定
xlabel('$x$', 'Interpreter', 'latex', 'FontSize', fsize);
ylabel('$y$', 'Interpreter', 'latex', 'FontSize', fsize);

% グリッドの表示
grid on;
axis equal;

% 座標軸ツールバーの表示
tb = axtoolbar('Visible', 'off');

exportgraphics(fig, 'colormap_test.png','Resolution',750);
```

細かい設定は各自変更していただければいいのですが，上記コードで重要なのは

```
tickValues=get(clb, 'Ticks');
tickLabels=cellstr(num2str(tickValues', '$%g$'));
set(clb, 'TickLabels', tickLabels);
```

の部分です．
このコードでは上記の[解決方法その 2](#解決方法その-2)で書いた方法に沿って書かれていますが，[その 1](#解決方法その-1)，[その 3](#解決方法その-3) のやり方も使えます．
実行結果はこのようになります．
![colormap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643071/26a52bdd-e357-cb49-02d9-22bbd1459f9f.png)

# 参考文献

1. [Wikipedia：ハイフン](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%95%E3%83%B3)
1. [MathWorks 公式：x 軸の目盛りラベルの設定またはクエリ](https://jp.mathworks.com/help/matlab/ref/xticklabels.html)
1. [Qiita：MATLAB で論文用の図を作るコツ](https://qiita.com/kouichi-c-nakamura/items/468fe09874461911dfab)
1. [Qiita：MATLAB で LaTeX 論文用の図を整形する](https://qiita.com/larking95/items/7ed862f743a3e661e6da)