matplotlib基礎 | figureやaxesでのグラフのレイアウト

最近グラフ、グラフの書き方を勉強中。kaggleまでの道は長し。。。
figure, axesでのレイアウトの仕方を良く忘れるので、まとめます。


## はじめてのmatplotlib

まずはお試し。わからない点は下にまとめていきます。

```py3:jupyterで実行
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
%matplotlib inline

x = np.linspace(0, 10, 10000) #わからない1

fig = plt.figure() #わからない2
ax = plt.axes() #わからない3

plt.plot(x, np.sin(x)) #同じfigureの中に追加
plt.plot(x, np.cos(x)) #同じfigureの中に追加
```

結果：
<img width="288" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/176316/5b56a35d-005a-0f8e-232f-9bcd887fc07d.png">


(わからない1) linspace便利そう
線形に等間隔な数列を生成するライブラリ。

`numpy.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None)`

不明点は以下でした。

- num: 生成する配列(ndarray)の要素数を指定。
- endpoint: 生成する数列において、stopを要素に含むかどうかを指定。Trueなら含み、Falseなら含まない。
- retstep: 生成された配列(ndarray)の後に公差を表示するかどうかを指定。Trueなら表示し、Falseなら非表示。
- dtype: 出力された配列(ndarray)のデータ型を指定。指定がない場合、データ型はfloat。



(わからない2)  figureはいくつ作るべきの？
figureの作り分けはファイルへの保存をベースにするのだそうです。つまりファイル保存が figure 単位。私は、まだ一つだけしか必要としたことがありません。

あとfigsize=(8,6)で図のサイズを決めています。数字はインチ。デフォルトが(8,6)。

例：
`fig, axes = plt.subplots(figsize=(7,4))`
`plt.figure(figsize=(3, 4))`



(わからない3)  axes使ってないじゃん

axesとfigureは、複数のグラフのレイアウトをするときにうまいことやってくれます。詳しくは次の章にまとめます。

## グラフのレイアウトの仕方
### 1. figure 1 つのとき
```py3:figure1つのとき
x = np.linspace(0, 10, 20)
y1 = x
y2 = x ** 2 

# figure は 1 つ
plt.figure(figsize=(6, 2)) # figureの縦横の大きさ

plt.subplot(1,2,1) # figure内の枠の大きさとどこに配置している。subplot(行の数,列の数,何番目に配置しているか)
plt.plot(x, y1)

plt.subplot(1,2,2)
plt.plot(x, y2)

```
イメージ：
![ai (5).jpg](https://qiita-image-store.s3.amazonaws.com/0/176316/7993a0d8-b312-4b19-8c74-2b8eee3e569b.jpeg)



結果：
<img width="242" alt="Capture1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/176316/9ff27cc5-40f7-cff7-7353-52a954521f24.png">


### 2. figures 2つのとき
```py3:figures2つのとき
x = np.linspace(-3, 3, 20)
y1 = x
y2 = x ** 2

# figure 1 つ目
plt.figure(figsize=(3, 2))
plt.plot(x, y1)

# figure 2 つ目
plt.figure(figsize=(3, 2))
plt.plot(x, y2)
```
イメージ：
![ai (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/176316/047e3af5-692f-7124-97d3-d37a45f62f9d.jpeg)


結果：
<img width="242" alt="Capture6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/176316/02f7e144-cd01-1fff-68a2-e0ac42f873d4.png">



### 3. subplotsとax[x,x]
```py3:subplotsとax[x,x]
x = np.linspace(-3, 3, 20)
y1 = x
y2 = x ** 2
y3 = x ** 3
y4 = x ** 4

fig, ax = plt.subplots(2, 2, figsize=(6, 4))

# 左上
ax[0, 0].plot(x, y1)

# 右上
ax[0, 1].plot(x, y2)

# 左下
ax[1, 0].plot(x, y3)

# 右下
ax[1, 1].plot(x, y4)
```

イメージ：
![ai (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/176316/f4003a1f-541d-3e03-0f95-eeb0f3835df4.jpeg)

結果：
<img width="239" alt="Capture3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/176316/9e85f97c-478e-6202-0e29-e06dac40e2e1.png">



### 4. add_subplot
```py3:add_subplot
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)
```
イメージ：
![ai (3).jpg](https://qiita-image-store.s3.amazonaws.com/0/176316/b6a0cdeb-0829-94d5-4eb8-b8f1a1c59bcc.jpeg)

結果：
<img width="242" alt="Capture4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/176316/07564f89-3d84-592d-bfc3-4a5c52d8b00e.png">

## subplotの使い方
subplot(行数、列数、プロット番号)

行数と列数はfigure内の位置を指している。
プロット番号は3x3だとこんな感じで指定。
 1 2 3
 4 5 6
 7 8 9

`plt.subplot(221) `とも書ける。

## あとがき

異なるグラフをひとつのグラフの中で重ねたりもできる（一番最初の例ではsinとcosのグラフを一つに書いている）と最後に気づきました。次はグラフ一つ一つを整理しながら、まとめたいと思います。

参考：
[matplotlib の figure（図） と axes（座標軸）－python](http://ailaby.com/matplotlib_fig/)

大変参考になりました、ありがとうございました。