MATLABでの2次元グラフの描き方をマスターしよう。

3回目のMATLAB記事です。

今回はMATLABの「2次元グラフの描き方」について説明します。

私がMATLAB初心者の頃、グラフの描き方が全然分かりませんでした。どうすりゃいいんだ...って感じでした。

きっとMATLAB経験者の多くがそのような経験をされたと思いますし、現在そのような初心者も多いかと私は考えています。

そこで本記事では最低限、MATLABで2次元グラフを描けるような内容を目指しました。


# 2次元グラフを描いてみる

まずは二次元平面に正弦波 $\text{sin}x$ のグラフを描いてみましょう。ただし $x$ の範囲は $[0, 2\pi]$ とします。

それには plot() というコマンドを使います。

早速ですが、以下のプログラム（sample1.m）を作成して実行してみてください。

新しいmファイルを出すには「ホーム」をクリックすると「新規スクリプト」というのが左上にあるので、それをクリックしてください。

実行するには左上にある「エディター」というところを押すと「実行」と書かれたスタートボタンが出てきます。

あるいは、たった3行なのでコマンドウィンドウにコピペして実行してもいいです。

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
```

すると以下のグラフが出てきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/133fcb98-6808-3549-f485-6ad83da9a48f.png" width=60%>

たった3行で正弦波が描けました。

次にプログラムの説明をしましょう。

1行目ですが、これは $[0, 2\pi]$ の範囲を $\pi/100$ で刻んでくださいという意味です。つまり変数 x の中身は$\ 0,\ \pi/100,\ 2\pi/100,\ \dots,\ 2\pi\ $となるわけです。

試しに x の中身を見てみましょう。ワークスペースに x があるのでそこをダブルクリックしてください。するとドックに下の図のような「変数-x」という画面？が出てくると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/9e560a92-b148-4fe9-7731-35898bb9a3a8.png" width=80%>


そこに左から 0, 0.0314, ... とありますね。横向きに動かせるスライダーを右に動かすと x の中身を最後まで見ることができます。

または、コマンドウィンドウに x を打ち込んでエンターキーを押しても表示できます。ただし表示する要素数が多い（1×201の横ベクトルだから）のでご注意ください。

2行目は x の各値に対する $\text{sin}$ の値を作っています。これも同様に中身をご自身で確認してみてください。

最後の3行目で plot() に x と y を渡せば無事にグラフが完成です。

なお plot() については以下を参考にしてください。

https://jp.mathworks.com/help/matlab/ref/plot.html


# グラフを整える

正弦波そのものは描けました。しかしこれだけでは**グラフとして不完全**です。

タイトルや軸の名前、凡例などを付けたいですよね。次はそんなお話をします。

## タイトル

タイトルを付けたい時は title() を使います。

先ほどの sample1.m に付け足してみましょう。

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
title('y = sinx') %追加
```

()の中で自分の考えたタイトルを「'(クォーテーション)」で囲めばオッケーです。もちろん日本語も使えます。

プログラムを実行すると以下のグラフが出てきます。上側にタイトルが表示されてます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/727e4e9b-d884-56db-7237-2ce05739a5c5.png" width=60%>

title() については以下を参考にしてください。

https://jp.mathworks.com/help/matlab/ref/title.html

## 軸の名前

横軸と縦軸に名前を付けるにはそれぞれ xlabel()、 ylabel() を使います。

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
title('y = sinx')
xlabel('x') %追加
ylabel('y') %追加
```

先ほどと同様に、()の中で自分の考えたタイトルを「'(クォーテーション)」で囲めばオッケーです。日本語も使えます。

追加後、実行すると軸の名前が表示されてます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/9d194e9c-bab1-2055-2034-1da1b1283dc6.png" width=60%>

xlabel()、 ylabel() については以下を参考にしてください。

https://jp.mathworks.com/help/matlab/ref/xlabel.html

https://jp.mathworks.com/help/matlab/ref/ylabel.html



## 凡例

次は凡例です。

今回は一つの正弦波を描きましたが、実際には複数のグラフを重ねて描く機会があります。その際、どれが何を表しているのかを区別するための凡例は必須です。

それには legend() を使います。

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
title('y = sinx')
xlabel('x') 
ylabel('y')
legend('sin') %追加
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/6c586956-1344-68c1-0f33-c98bfb47876a.png" width=60%>

複数の凡例を付けたい場合は

```matlab
legend('sin','cos','tan')
```
みたいに書けばオッケーです。

今回は練習のためにプログラムを使って凡例を付けました。

しかし、要は区別できればいいのですから、パワーポイント等で編集して凡例を後付けするのもいいでしょう。

ちなみに legend('凡例の名前') とせずに**legend とだけ書くと凡例はデフォルトで data1 になります**。

また legend を使わずに

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y, 'DisplayName', 'sin') %変更箇所
title('y = sinx')
xlabel('x') 
ylabel('y')
legend %変更箇所
```

としても同じグラフが描けます。


legend() については以下を参考にしてください。

https://jp.mathworks.com/help/matlab/creating_plots/add-legend-to-graph.html


## 線の太さの変更

正弦波の線が細いように見えませんか？

実は plot() の中身を少しいじるだけで線の太さを変えることができます。

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y, 'LineWidth', 2) %追加
title('y = sinx')
xlabel('x')
ylabel('y')
legend('sin') %追加
```

MATLABには**プロパティ**というのがあり、その1つが LineWidth です。さっきの DisplayName もそうです

LineWidth はそのまま”線の太さ”という意味になり、それを2にしてくださいということです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/8245bab9-2810-ce3b-954e-b859da5510ba.png" width=60%>


何かの発表会の時にグラフが小さいと、観衆から見えにくいという状況が発生します。そんなことを避けるための工夫です。


## タイトルや目盛りの太さの変更

このままの流れでタイトルや軸の目盛、軸の名前を一気に大きくしてみましょう。

それには set() を使います。

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y, 'LineWidth', 2)
title('y = sinx')
xlabel('x')
ylabel('y')
legend('sin')
set(gca, 'FontSize', 13) %追加
```

FontSize というプロパティがあって、そのままフォントの太さですね。それを13にしてくださいという意味です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/98dd2f82-5c2f-cbce-f58c-37bbb15b8210.png" width=60%>

gcaの事は置いといて、タイトル、軸の名前、目盛りや凡例を全てに大きくできました。とにかくこれらのフォントサイズを全て13にしてくださいという意味です。

実は title()、xlabel()、ylabel()、legend() のところでも FontSize の値を指定でき、それぞれ個別に大きさを指定できます。

しかし、一度に全部大きくしたい時は set() を使うと便利でしょう。

set() については以下を参考にしてください。

https://jp.mathworks.com/help/matlab/ref/set.html



## 描画範囲

最後は描画範囲の設定です。範囲を大きくしたり、反対に小さくしたりできます。

```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y, 'LineWidth', 2)
title('y = sinx')
xlabel('x')
ylabel('y')
legend('sin')
xlim([0, 2*pi]) %追加
ylim([-1.5, 1.5]) %追加
set(gca, 'FontSize', 13)
```

x軸の描画範囲を0から2πに、y軸の描画範囲を-1.5から1.5にしてみました。

描画範囲は [最小値, 最大値] という配列形式で指定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/c1d2c594-bfe4-6eda-ddaf-0f37464a8b1e.png" width=60%>

各自、見やすい範囲に調節してみてください。

これで正弦波のグラフは完成といえるでしょう。


## 座標軸のグリッドライン

これはお好みで使ってください。座標の目盛ごとに直交座標を引きます。

それには grid を使います。


```matlab:sample1.m
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y, 'LineWidth', 2)
title('y = sinx')
xlabel('x')
ylabel('y')
legend('sin')
xlim([0, 2*pi])
ylim([-1.5, 1.5])
grid %好みで追加
set(gca, 'FontSize', 13)
```

人や場合によりますがこの方が見やすいかもしれませんね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/678999f6-55ef-85c3-777b-4ead25d27217.png" width=60%>


# おまけ：画像の保存方法

ここではMATLABでの保存方法を教えます。実際のところ、保存したいならスクリーンショットやSnipping Toolでどうとでもなりますが...。

プログラムを実行してグラフを出したら、左上の「ファイル」という部分をクリックしてください。そこに「名前を付けて保存」というのがあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/d6d1e018-0e78-4537-72e8-86b252477ea1.png" width=60%>

それをクリックすると保存場所と保存する形式が選べます。png形式があるのでそれを選択してください。


# まとめ

今回は2次元グラフの描き方を説明しました。主な使用コマンドを最後にまとめておきましょう。

* plot()：グラフの描画
* title()：タイトル
* xlabel() ylabel()：軸の名前
* legend()：凡例
* xlim() ylim()：描画範囲の指定
* set()：（今回は）フォントサイズの一括変更に利用
* grid：グリッドライン

これらのコマンドを使えば人に見せられるグラフを作ることができます。

基礎的な内容ですが、勉強と同じで基礎ができれば応用も自ずとできるようになります。

今回の内容が簡単に思えるようになれば、自分で調べて自由にグラフを描くだけの技術が既に身に付いてます。

なお、今回はしませんでしたが**実線で描かれたグラフを点線に変えたりその色を変えたり**もできます。適切に変更すればさらに見やすいグラフが作れるでしょう。

以下を参考にしてください。

https://jp.mathworks.com/help/matlab/creating_plots/specify-line-and-marker-appearance-in-plots.html;jsessionid=cd051e58a3b934e599e274fed749


# 終わりに

人間は**五感に訴える**方が好きというか、色々な理解が捗ります。

皆さんにも、数字や数式で説明されるより図で説明してもらった方が理解しやすいという経験があるでしょう。

図やグラフは視覚に訴えるので、その分だけ理解しやすいのですね。

これまで人間が培ってきた数字や数式の歴史は、人間を含め**生物の歴史**よりもはるかに短いです。

生物は途方もない時間をかけて五感を発達させてきました。

ですので生物である人間も、数字や数式より五感を扱う方が得意なのです（そのはずです）。

何が言いたいかというと**グラフは便利な武器である**ということです。良い事にも使えますし、誰かを騙すような悪い事にだって使えます。

大袈裟かもしれませんが、それだけの魔力を持っているのです。

以上、私の一意見でした。

よろしければ次回の記事も読んでくださると大変嬉しいです。

※本記事に対する改善点や修正点、またはこんな事が知りたいといったご意見がありましたらぜひご連絡ください。