matplotlibで自在にグラフを描画するための3ステップ（兼チートシート）

この記事は**[LOB Advent Calendar Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lob-inc)**の**17日目**の記事として書いています。

#はじめに

**データをグラフで表現する**というのは、**データ分析には欠かせない要素**の一つです。

よほどの天才ではない限り、普通は数値だけを見ても理解はできません。
`データの状態をイメージ`したり、 `分析結果を直感的に理解`したり、また`人に説明するため`にもグラフ描画のスキルは必須です。

手軽に使いたいなーと思いながらも多機能すぎてとくに初めての人には結構ハードルが高いと思います。
他の記事を見ててもアレルギー反応を起こす場合が多かったので、とっかかりとしての分かりやすい記事を目指しました。
この記事がデータ分析のはじめの一歩になれば最高です！

## 本記事の目的
本記事では`matplotlib`の使い方を**３ステップ**でまとめて、ある程度、自在にグラフの描画ができるようになるまでを目的としてます。
（自分用のチートシート的な部分もありますがご容赦ください）

- [Step1. 描画するグラフを決める](#step1-描画するグラフを決定する)
  - 扱っているデータはどんなグラフに落としこむと分析しやすくなるかを決めます（ここを間違うとワケのわからないグラフが完成してしまう）
- [Step2. データを用意しプロットする](#step2-データを用意しプロットする)
  - 実際にグラフを作成します
- [Step3. グラフを装飾する](#step3-グラフを装飾する)
  - 最後に人に見せるため、エビデンスのため、に見やすいグラフを作っていきます。（具体的にはタイトルや凡例、グリッドの表示など）

まずは環境を作成する必要がありますが、それは以下で記事にしてまとめておきました。
まだ環境ないよって言う人は参考にしてみてください。
[[Mac/Linux] Anacondaで Python3系をインストールし Jupyter Notebook を使うまで](https://backleaflet.blogspot.com/2018/12/maclinux-anaconda-python3-jupyter.html)


# Step1. 描画するグラフを決定する

まずは**どのようなグラフを書くかをイメージ**することがとても重要です。

以下に**よく使うであろうグラフ**を一覧しておきます。（実際はもっと色々かけます）
この記事に辿り着いた人であれば、扱うデータからどのようなグラフを書くのが有用かくらいはイメージできると思いますので、まずは利用するグラフを決めましょう。

以下のグラフのサンプルソースは **[こちらのGist](https://gist.github.com/tadamatu/66a27e14991937423bde66639cfa788a)** にアップしておきました。

|　グラフ一覧　|　　|　|
|:---:|:---:|:---:|
| ![g2x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/4ea55465-6520-17a4-83a2-c945f11b929c.png)<br>**棒グラフ(誤差ライン付)** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html#matplotlib.pyplot.bar)<br>`plt.bar(x, height)` | ![g3x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/7f09aaba-b34f-bed4-17ac-11a8f6425bbe.png)<br>**横棒グラフ(誤差ライン付)** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.barh.html#matplotlib.pyplot.barh)<br>`plt.barh(width, y)` | ![g4x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/dd041440-7210-118d-c985-44168bc7d2f9.png)<br>**積み上げ棒グラフ** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html#matplotlib.pyplot.bar)<br>`plt.bar(x, height)` |
| ![g5x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/b4466efa-2e39-847e-cd62-3bce4d626825.png)<br>**散布図** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter)<br>`plt.scatter(x, y)` | ![g6x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/6df354aa-0b4a-af82-7ec6-c031f0beced3.png)<br>**散布図(サイズ変更付)** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter)<br>`plt.scatter(x, y, s)` | ![g7x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/24503617-9a73-61d2-e05d-662d917e315e.png)<br>**日付データプロット** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.plot_date)<br>`plt.plot_date(dates, s)` |
| ![g8x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/392cfa5b-e8e2-656a-3494-92d4a9430483.png)<br>**折れ線グラフ** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.plot)<br>`plt.plot(x)` | ![g9x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/f6672332-bc42-08d1-fedd-f0b562b5466c.png)<br>**円グラフ** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.pie)<br>`plt.pie(fracs, labels, autopct)` | ![g10x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/61c6d24c-7354-dac2-149d-ca80ded55bbd.png)<br>**積上げ折れ線グラフ** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.stackplot)<br>`plt.stackplot(x, y1, y2, ...)` |
![g11x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/0e0ebcdc-0818-9abc-4da5-e5f9d592a5f1.png)<br>**ヒストグラム** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.hist)<br>`plt.hist(x)` | ![g12x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/4dc1f65e-6148-1313-84ba-3bca4d488d9d.png)<br>**2次元ヒストグラム** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.hist2d)<br>`plt.hist2d(x, y)` | ![g13x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/66a8ee21-3937-bfb3-fbf0-8619764bf043.png)<br>**矩形描画** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.broken_barh)<br>`plt.broken_barh(x, y)` |
| ![g14x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/fec479f5-91a6-0093-9a06-2af03fe4c842.png)<br>**箱ひげ** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.boxplot)<br>`plt.boxplot(a)` | ![g15x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/a6a0724a-54e0-0084-c45f-4b2589bba8d4.png)<br>**バイオリン図** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.violinplot)<br>`plt.violinplot(data, pos)` | ![g16x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/f2a21134-7e00-f5ed-eba8-42d456d19ee1.png)<br>**等高線** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.contourf)<br>`plt.contourf(X, Y, Z)` |
| ![g17x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/cc02b6b2-aa22-4790-9ace-f0601557561b.png)<br>**離散データ** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.stem.html#matplotlib.pyplot.stem)<br>`plt.stem(x, y, '-.')` | ![g18x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/68e1faa1-3765-a801-d4fa-401b7c7b3dba.png)<br>**自己相関** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.acorr)<br>`plt.acorr(x)` | ![g19x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/4221e7e4-0dd5-4ffd-3de1-7f21bcdd36e9.png)<br>**相互相関** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.xcorr)<br>`plt.xcorr(x, y)` |
![g20x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/7df00f80-fd8f-87db-9840-090d0ebd4d70.png)<br>**疑似カラー描画** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.pcolor)<br>`plt.pcolor(x, y, z)` | ![g21x.png](https://qiita-image-store.s3.amazonaws.com/0/94988/31e83aee-3c5c-882f-3eb1-4a638d0160c4.png)<br>**ベクトル** - [詳細](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.quiver)<br>`plt.quiver(X, Y, U, V)` |

グラフのサンプルソースは **[こちらのGist](https://gist.github.com/tadamatu/66a27e14991937423bde66639cfa788a)** にアップしておきました。

## 他のグラフ
他にも本当に様々なグラフを書くことができます。知りたい場合は以下を覗いてみると良いでしょう。

- [Gallery](https://matplotlib.org/gallery/index.html) - どんな種類があるのかはこちらを
- [Pyplot function overview](https://matplotlib.org/api/pyplot_summary.html) - Functionの詳細はこちらを


# Step2. データを用意しプロットする

さて書き出すグラフを決めたら、次に**扱おうとしているデータ**を切り貼りして整形し**グラフ表示用データ**を用意するわけなのですが、**データの切り貼りは別の記事に任せる**ことにして、ここでは用意しなければならないデータを種類別に記載をしておこうと思います。

**用意しなければならないデータ**が理解できれば、ここに辿り着いている皆さんであればデータの整形はなんとかなるだろうという考えのもとです。

用意するデータはざっくり分けて以下の３種類のどれか
- [1次元のデータ](#1次元のデータ)
- [2次元のデータ](#2次元のデータ) - x軸/y軸
- [その他のデータ](#その他のデータ) - 多次元だったり積み上げだったりと様々

## 1次元のデータ

1次元のデータで表現するものには以下のようなものがあります。

- 折れ線グラフ `plt.plot(x)`
- 円グラフ `plt.pie(fracs)`
- ヒストグラム `plt.hist(x)`
- 自己相関 `plt.acorr(x)`

`折れ線グラフ` を例にとってソースを載せておきます。
基本的には同じような使い方なので、[サンプルソース](https://gist.github.com/tadamatu/66a27e14991937423bde66639cfa788a)を参考にしてください。

```python:plot.py
from matplotlib import pyplot as plt
import numpy as np

# np.random.seed(0)  # ランダム値の固定
x = np.random.rand(50)  #50個のランダムな数値

plt.plot(x)
plt.show()
```

![g8.png](https://qiita-image-store.s3.amazonaws.com/0/94988/9d7ce332-30dd-2dda-a9fe-d6b059926989.png)


## 2次元のデータ

2次元のデータで表現するものには以下のようなものがあります。

- 棒グラフ(誤差ライン付) `plt.bar(x, height)`
- 横棒グラフ(誤差ライン付) `plt.barh(width, y)`
- 積み上げ棒グラフ `plt.bar(x, height)`
- 散布図 `plt.scatter(x, y)`
- 散布図(サイズ変更付) `plt.scatter(x, y, s)`
- 日付データプロット `plt.plot_date(dates, s)`
- 2次元ヒストグラム `plt.hist2d(x, y)`
- 離散データ `plt.stem(x, y, '-.')`
- 相互相関 `plt.xcorr(x, y)`

`散布図` を例にとってソースを載せておきます。
基本的には同じような使い方なので、[サンプルソース](https://gist.github.com/tadamatu/66a27e14991937423bde66639cfa788a)を参考にしてください。

```python:scatter.py
import numpy as np
import matplotlib.pyplot as plt

# np.random.seed(0)  # ランダム値の固定をしたい場合は有効にする
N = 50
x = np.random.rand(N)  #50個のランダムな数値
y = np.random.rand(N)

plt.scatter(x, y, alpha=0.5)  #alphaは透過率
plt.show()
```

![g5.png](https://qiita-image-store.s3.amazonaws.com/0/94988/451440c1-1ce6-7b3c-b52f-f8e131c7630f.png)
※上記の例ではランダムに表示しているので、バラバラですが意味のあるデータならプロットが偏ったりするんでしょうね。

## その他のデータ

その他のデータで表現するものには以下のようなものがあります。
データを積み上げたり、奥行き(z軸)があったり、ベクトルがあったりといった感じでしょうか。
グラフの意味を理解して利用しましょう。

- 積上げ折れ線グラフ `plt.stackplot(x, y1, y2, ...)`
- 矩形描画 `plt.broken_barh(x, y)`
- 箱ひげ `plt.boxplot(a)`
- バイオリン図 `plt.violinplot(data, pos)`
- 等高線 `plt.contourf(X, Y, Z)`
- 疑似カラー描画 `plt.pcolor(x, y, z)`
- ベクトル `plt.quiver(X, Y, U, V)`

ここでは普段使いしそうな`積上げ折れ線グラフ` を例にとってソースを載せておきます。
それぞれ特徴的な使い方にはなりますので、[サンプルソース](https://gist.github.com/tadamatu/66a27e14991937423bde66639cfa788a)を参考にしてください。

```python:stackplot.py
import numpy as np
from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [1, 1, 2, 3, 5]
y2 = [0, 4, 2, 6, 8]
y3 = [1, 3, 5, 7, 9]

plt.stackplot(x, y1, y2, y3)
plt.show()
```

![g10.png](https://qiita-image-store.s3.amazonaws.com/0/94988/8665a9ab-6498-209a-3b52-5a6715d298e2.png)


## グラフのオプション

最終的には上記のような**データプロット**と、いくつかの**関数オプション**を利用して、**最終的なグラフを表現**することになります。

**関数オプション**はグラフによって様々なので、各グラフの関数詳細を参照してください。
`Step1`の一覧の[詳細]リンクから飛ぶか、[公式のFunctionページ](https://matplotlib.org/api/pyplot_summary.html)を眺めることになります。

で、最後に表示`plt.show()`することでグラフが表示されるという具合です。


# Step3. グラフを装飾する

`Step2` までで基本的なグラフはかけるようになりました。

ちょっとデータをグラフで確認する程度であれば`Step2`までで十分ですが、`あとで見るため`や`エビデンスとして`、また`人に見せるため`　に作ったグラフなのであれば、これでは不十分ですね。

最後にグラフの**装飾方法**を最後に覚えることにしましょう。

こちらの装飾もサンプルソースを **[こちらのGist](https://gist.github.com/tadamatu/ba5fe9e534544412bf5c46af301b5704)** にアップしておきました。


## グラフのタイトル(title)
まずは簡単なところから。
`title` 関数でグラフにタイトルを埋め込みます。
１つのグラフに複数のグラフを表現することもでき、その時には `suptitle`　関数を利用することになります。（複数グラフの作り方は後述）

```python:title.py
import numpy as np
from matplotlib import pyplot as plt

x =  np.arange(5)  # 0~5の等差数列
y = (4, 1, 3, 2, 5)
width = 0.5
plt.bar(x, y, width, align='center')  #棒グラフの描画

plt.title('This is title')    #タイトルを設定

plt.show()
```

![t1.png](https://qiita-image-store.s3.amazonaws.com/0/94988/a0b383ee-7908-68bd-959d-df3d2703db7f.png)


## 凡例の追加 (legend)

`legend` 関数を利用することで、凡例を表示設定することができます。

```python:legend.py
import numpy as np
from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [1, 1, 2, 3, 5]
y2 = [0, 4, 2, 6, 8]
y3 = [1, 3, 5, 7, 9]
plt.stackplot(x, y1, y2, y3)  #積上げ折れ線グラフの描画

plt.legend(['dataA', 'dataB', 'dataC'])  # 凡例を設定

plt.show()
```

![t2.png](https://qiita-image-store.s3.amazonaws.com/0/94988/ce1b3720-6e76-5262-0ab4-dd34fcad5d6d.png)


`等高線(contour)`や`2次元ヒストグラム (hist2d)` に対する、 色の凡例は `colorbar` 関数で表示することができます。
コードは割愛しますが[こちらのサンプルページ](https://gist.github.com/tadamatu/ba5fe9e534544412bf5c46af301b5704)に置いておきます。
![t3.png](https://qiita-image-store.s3.amazonaws.com/0/94988/e5347530-f2cd-3fa9-bdc9-668e4d46658a.png)

## ラベルの表示 (xlabel/ylabel)

`xlabel/ylabel` 関数を利用することで、ラベルを表示設定することができます。

```python:label.py
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)  # ランダム値の固定
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
area = (30 * np.random.rand(N))**2

plt.scatter(x, y, s=area, alpha=0.5)  # 散布図の表示

plt.xlabel("Label X")   #ラベルXを設定
plt.ylabel("Label Y")   #ラベルYを設定

plt.show()
```

![t5.png](https://qiita-image-store.s3.amazonaws.com/0/94988/7755c493-de85-9fd5-ebdf-d41dbdd462d5.png)


## 軸の描画範囲 (xlim/ylim)

`xlim/ylim` 関数を利用することで、軸の描画範囲を設定することができます。（これを設定しなかった場合はグラフ全体が見えるように自動的に描画範囲が決まります）
あたりまえですが、グラフを範囲外の値やマイナス値も設定ができます。

```python:lim.py
from matplotlib import pyplot as plt
import numpy as np

# np.random.seed(0)  # ランダム値の固定
x = np.random.rand(50)
plt.plot(x)  # 折れ線グラフを表示

plt.xlim(10, 40)   # X軸の描画範囲
plt.ylim(-4.0, 2.0)  # Y軸の描画範囲

plt.show()
```

![t6.png](https://qiita-image-store.s3.amazonaws.com/0/94988/fae4c1e9-bb88-6205-9fcb-c57eda164b1a.png)

## 平行・垂直の線を引く(axhline/axvline)

`axhline/axvline` 関数を利用することで、ラインを引くことができます。
限界線や境界線を表現する時に使えますね。

```python:axline.py
import numpy as np
import matplotlib.pyplot as plt

plt.axhline(y=0.5, xmin=0.1, xmax=0.9)  # 水平線を引く
plt.axvline(x=0.5, ymin=0.1, ymax=0.9, color='r', linewidth=4)  # 垂直線を引く（赤線、少し太く）

plt.show()
```

![t7.png](https://qiita-image-store.s3.amazonaws.com/0/94988/2a221240-bbc2-8564-6d2f-7ef060ebcc96.png)

`hlines/vlines` 関数を使えば、一度に複数の平行線も引くことができます。
[こちらのサンプルページ](https://gist.github.com/tadamatu/ba5fe9e534544412bf5c46af301b5704)に置いておきます。
![t8.png](https://qiita-image-store.s3.amazonaws.com/0/94988/4327d656-a9ef-726e-8de7-1d1e0e9c74a8.png)


## 矩形の描画(axhspan/axvspan)

`axhspan/axvspan` 関数を利用することで、矩形を描画することができます。
これも限界線や境界線を表現する時に使う感じですかね。

```python:axspan.py
import numpy as np
import matplotlib.pyplot as plt

plt.axhspan(1.0, 3.0, facecolor='g', alpha=0.5)  # 矩形の描画(1.0〜3.0で塗りつぶし)
plt.axvspan(2.0, 5.0, facecolor='b', alpha=0.5)  # 矩形の描画(1.0〜3.0で塗りつぶし)

plt.xlim(0, 10)   # X軸の描画範囲(分かりやすいように)
plt.ylim(0, 10)  # Y軸の描画範囲(分かりやすいように)

plt.show()
```

![t9.png](https://qiita-image-store.s3.amazonaws.com/0/94988/59a46afe-214a-3a23-83fc-5d45ab941d0e.png)

## テキストの追加(text)

`text` 関数でグラフにテキストを埋め込みます。
１つのグラフに複数のグラフを表現することもでき、その時には `figtext`　関数を利用することになります。（複数グラフの作り方は後述）

```python:text.py
from matplotlib import pyplot as plt

plt.text(0.2, 0.5, "Test", size=20, rotation=20., ha="center", va="center")
plt.text(0.6, 0.5, "Sample", size=20, rotation=20., ha="center", va="center")

plt.show()
```

![t10.png](https://qiita-image-store.s3.amazonaws.com/0/94988/61c9508c-9b44-c82b-09bd-7217db2f06c6.png)

## 注釈の追加(annotate)

`annotate` 関数を利用することで、注釈を描画することができます。
これも結構使えそうですね。

```python:annotate.py
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = ax.plot(t, s, lw=2)

# xycoordsがデフォルトの'data'なので、
# 座標(4, 1)のデータに対して座標(3, 1.5)にテキストを表示して
# 矢印で線を引っ張る
arrow=dict(facecolor='black', shrink=0.05)
ax.annotate('max', xy=(4, 1), xytext=(3, 1.5), arrowprops=arrow)

ax.set_ylim(-2,2)
plt.show()
```

![t11.png](https://qiita-image-store.s3.amazonaws.com/0/94988/b03f56d5-ec49-16b0-1e1c-f958c5b51bf5.png)


## グリッド（格子）の表示(grid)

`grid` 関数を利用することで、注釈を描画することができます。

```python:grid.py
import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(100)
plt.hist(x, 50, density=True, alpha=0.75)  # ヒストブラムの用事

plt.grid(linestyle='-', linewidth=1)  #グリッドの表示

plt.show()
```

![t12.png](https://qiita-image-store.s3.amazonaws.com/0/94988/13c04dbf-c3ee-fdc2-7f92-4af4a3ba16f1.png)

## 複数のグラフを表示(figure/axes)

グラフは複数のレイヤーを使って表現ができるようになっています。
`Figure`や`axes`がそれに当たり、階層構造で管理されてます。
以下の記事が分かりやすく書かれており、ここでかいつまんで書くよりも読んでもらうほうが有用だと思います。
<img alt="artist.png" src="https://qiita-image-store.s3.amazonaws.com/0/94988/3f05dd20-244f-033c-e969-80f637d12c75.png" height="150px"> <img alt="plot.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/94988/cf2c3c63-9ce3-a5fb-c354-e1ac75fc183b.jpeg" height="150px">


- [matplotlib基礎 | figureやaxesでのグラフのレイアウト](https://qiita.com/tsuruokax/items/90167693f142ebb55a7d)
- [早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)

一応、簡単なソースコードだけ載せておきます。だいたいイメージできるかと。

```python:artist.py
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 20)
y1 = x
y2 = x ** 2
y3 = x ** 3
y4 = x ** 4

fig = plt.figure()

# 左上
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(x, y1)
# 右上
ax2 = fig.add_subplot(2, 2, 2)
ax2.plot(x, y2)
# 左下
ax3 = fig.add_subplot(2, 2, 3)
ax3.plot(x, y3)
# 右下
ax4 = fig.add_subplot(2, 2, 4)
ax4.plot(x, y4)

plt.show()
```

![t13.png](https://qiita-image-store.s3.amazonaws.com/0/94988/588fc981-c5b5-8cc0-456f-d4c4c6571973.png)


# もっと自在に
他にも以下のような**複合的なグラフ**や**3Dグラフ**も書くことができます。
![g22.png](https://qiita-image-store.s3.amazonaws.com/0/94988/16e5713c-8b70-4e8f-6818-c8ccb171bf0d.png) ![g23.png](https://qiita-image-store.s3.amazonaws.com/0/94988/edaa3e12-d0c1-5dae-812f-7338205472fd.png)


まだまだ**グラフマスターへの道は険しい**ですね (^^;
でもこの記事の延長上にこのようは複雑なグラフがあると思って問題ないと思います。

この記事が皆様のお役に経てばmm

株式会社 LOB では「流通のケタを変える、広告プラットフォームを創る」仲間を募集しています！
https://lob-inc.com/recruit/


# おまけ

チートシートという意味では [DataCamp](https://www.datacamp.com/) が提供している有名なものがあります。こちらも参考にされると良いと思います。

- [Python For Data Science Cheat Sheet](https://www.datacamp.com/community/data-science-cheatsheets)
  - [Matplotlib](https://datacamp-community-prod.s3.amazonaws.com/28b8210c-60cc-4f13-b0b4-5b4f2ad4790b)


# 参考にしたページ
- [matplotlib](https://matplotlib.org/index.html)
  - [Usage Guide](https://matplotlib.org/tutorials/introductory/usage.html)
  - [Pyplot function overview](https://matplotlib.org/api/pyplot_summary.html)
- [matplotlibのpyplot APIをいろいろ試す](https://www.soudegesu.com/python/pyplot-api/)
- [matplotlib基礎 | figureやaxesでのグラフのレイアウト](https://qiita.com/tsuruokax/items/90167693f142ebb55a7d)
- [早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)