subplot? add_subplot? subplots?

##　はじめに
今回はpythonのライブラリであるmatplotlibを使用した際にsubplot,subplots,plotなどで詰まったためそれらの違いを話していこうと思います。

## 1.plt.figure()
一番多く目にするのがこの書き方だと思います。

```python
import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(4,4))
plt.plot([0,2,5,6], label="graph")
plt.xlabel("x座標")
plt.ylabel("y座標")
plt.legende()
plt.show()
```

![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693439/0b7086eb-5765-e4da-ae86-0accd713d4b0.png)

また、グラフを重ねたい場合以下のように書けば重ねることができます。

```python
x = np.linspace(-2,5)
y1 = x ** 2
y2 = 2 * x
plt.figure(figsize=(6,6))
plt.plot(x, y1, label="x^2")
plt.plot(x, y2, label="2x")
plt.legend()
plt.show()
```

![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693439/c16a7bd1-db6f-ef58-596f-9fdddae90748.png)

``` plt.figure()  ```を実行すると描画するエリアの確保ができます。この時``` figsize=(横の長さ, 縦の長さ) ```を指定することでどのくらいの大きさのエリアを確保するか指定できます。この確保したエリアに関数などを描画していきます。グラフを追加すると同じエリアに重なるようにして描画されます。では重ねずに描画したい場合はどうすればよいでしょうか

## 2.plt.subplot()
グラフを重ねずに縦あるいは横に並べて描画したい場合は``` plt.subplot() ```を使用します。

```python
x = np.linspace(-np.pi, np.pi)

plt.figure(figsize=(12,4))

plt.subplot(1,3,1) #1×3の要素の内に１番目の要素に配置する
plt.plot(x,np.sin(x), label="sinx")
plt.xlabel("xaxis")
plt.ylabel("yaxis")
plt.title("sin")
plt.legend()

plt.subplot(1,3,2)#1×3の要素の内に2番目の要素に配置する
plt.plot(x,np.cos(x), label="cosx")
plt.xlabel("xaxis")
plt.ylabel("yaxis")
plt.title("sin")
plt.legend()

plt.subplot(1,3,3)#1×3の要素の内に3番目の要素に配置する
plt.plot(x,np.tan(x), label="tanx")
plt.xlabel("xaxis")
plt.ylabel("yaxis")
plt.title("sin")
plt.legend()
plt.tight_layout()
```
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693439/3ae64815-ceb9-0ad0-a27d-fa256355ffbe.png)

```  plt.figure(figsize=(12,4)) ```で12×4のエリアを確保します。``` plt.subplot(1,3,1) ```で12×4のエリアを横に3等分したもののうち左から１番目のエリアに描画します。つまり``` plt.subplot() ```は確保したエリアをいくつかの要素に分割し、その要素の何番目に記述するかを指定することができます。しかしこの書き方では毎回タイトルやxラベルなどの要素を指定しなければならないため少し面倒です。最後の``` plt.tight_layout() ```はグラフ同士が重ならないようにするために追加しています。また、以下のような書き方でもできます。

```python
x = np.linspace(-2,2)
y_exp = np.exp(x)
y_log = np.log(x)

fig = plt.figure(figsize=(12,4))
ax1 = fig.add_subplot(1,2,1)
ax1.plot(x,y_exp)
ax1.set_xlabel("xaxis")

ax2 = fig.add_subplot(1,2,2)
ax2.plot(x,y_log)
ax2.set_xlabel("xaxis")
```

![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693439/2a64cca8-c378-85ae-3b0e-26bc906892f2.png)
この場合の書き方でも少し煩雑になります。

## 3.plt.subplots()
この方法では以上のような書き方で問題となった煩雑さを解決してくれます。

```python
x = np.linspace(-2,2)
y1 = np.sin(np.exp(x))
y2 = np.exp(np.sin(x))
y3 = np.sin(np.cos(x))

fig, ax = plt.subplots(1, 3, figsize=(14,3))
ax[0].plot(x,y1)
ax[1].plot(x,y2)
ax[2].plot(x,y3)

for i in range(3):
  ax[i].set_xlabel("x axis")
  ax[i].set_ylabel("y axis")
plt.tight_layout()
```
![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693439/a128ee61-8dea-04f7-078b-0b6b4b6d1d60.png)
``` plt.subplots() ``` で描画するエリアの確保とそのエリアを何分割するかを一度に指定することができます。以上のような書き方をすることですっきりとしたコードでグラフを確保することができます。

## 終わりに
今までmatplolibはデータ分析において非常に活躍するのでしっかりと使えるようにしておきましょう！よきデータ分析ライフを！

## 参考文献
- [matplotlib公式ドキュメント](https://matplotlib.org/stable/contents.html)
- [matplotlib 作図](http://www.turbare.net/transl/scipy-lecture-notes/intro/matplotlib/matplotlib.html)