上司を納得させるための図を描くのに必要なmatplotlibの早見表

機械学習などで特徴量を検討していると、色々と図を描きたくなります。
他人（特に上司とか、上司とか、上司とか。。。）に説明するのにも図が重要です。
分かりやすく書かないと、やり直しさせられます。
その時に役立ちそうな処理を一覧にしました。

# インポート
```python
import matplotlib.pyplot as plt
```

## 補足：かっこよくするための追加のおまじない

```python
import matplotlib as mpl
mpl.style.use('ggplot')
```
# 図(fig, ax)の作成
## 単体
```python
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(15, 8), dpi=100)
ax1 = plt.axes()
```
なお、figsizeは(横, 縦)のインチ、dpiはインチ当たりの画素数。
つまり、この場合、1500 x 800の画像になる。
dpi=100はデフォルト、figsizeのデフォルトは(6,4)だが、
最近のディスプレイはもっと横長で高画質なので(15,8)にしてみた。

## 複数
```python
fig = plt.figure(figsize=(15, 8), dpi=100)
ax1 = plt.subplot(2, 2, 1) # 1行1列目
ax2 = plt.subplot(2, 2, 2) # 1行2列目 
ax3 = plt.subplot(2, 2, 3) # 2行1列目
ax4 = plt.subplot(2, 2, 4) # 2行2列目 
```

あるいはまとめて、

```python
fig, ax = plt.subplots(2, 2, figsize=(15, 8), dpi=100)
ax1 = ax[0, 0] # 1行1列目
ax2 = ax[0, 1] # 1行2列目
ax3 = ax[1, 0] # 2行1列目
ax4 = ax[1, 1] # 2行2列目
```

あるいは動的に追加もできる。

```python
fig = plt.figure(figsize=(15, 8), dpi=100)
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)
```

### 補足：軸の共有
subplotを使う時に、軸を共有したくなる場合がある。
そのときは、sharex, shareyを使ってsubplotをあらかじめ作成する。
"col"だとx,y軸を縦方向のサブプロットに対して共有する。
"row"だとx,y軸を横方向のサブプロットに対して共有する。
Trueにすると、どちらにも共有する。

```python
fig, ax = plt.subplots(2, 2, sharex="col", sharey="col", figsize=(15, 8), dpi=100)
ax1 = ax[0, 0] # 1行1列目
ax2 = ax[0, 1] # 1行2列目
ax3 = ax[1, 0] # 2行1列目
ax4 = ax[1, 1] # 2行2列目
```

# 図の描画
## 線を引く
```python
import numpy as np
y = np.random.randn(100) # 標準正規分布から100個をサンプリング
x = np.arange(y.shape[0])
ax1.plot(y, x, linewidth=0.5)
```
linewidthは線の太さ。あと使いそうなのは、color, linestype, marker, label, zorderなどなど。

- linewidth ... 線の太さ。
- linestyle ... 実践や点線などを指定。詳細は[こちら](https://matplotlib.org/gallery/lines_bars_and_markers/line_styles_reference.html)
- marker ... マーカー指定。詳細は[こちら](https://matplotlib.org/api/markers_api.html)。
- color ... 線の色。詳細は[こちら](https://matplotlib.org/api/colors_api.html)
- label ... 凡例に使用。後述のax.legend()で表示させることが可能。
- zorder ... どれを表側、裏側に表示させるかの順番を指定。

matplotlib.pyplot.plotが使えるkwargsは上記以外にもあり、Line2Dプロパティが使える。
一応[ここ](https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D)にその一覧がある。

## 散布図
普通の散布図や、波形上のマーカーとしてよく使います。

```python
ax.scatter(0.5, 0.5, s=600, c="red", alpha=0.1)
```
sはサイズ、cは色、alphaは透過性を設定できます。

## 文字
例えば、マーカー部分の具体的な数値を表したい場合に使います。
最大値っていうけど、具体的にどのくらい？とかを目盛りを読み取らせずに説明できます。

```python
ax.text(0.5, 0.5, "test", va="bottom", ha="left", color="red")
```

## 参考
描画できるものの一覧は[ここ](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html)にあります。

# それぞれのaxを整える
## タイトルをつける
```python
ax1.set_title("タイトル")
```

## 軸の範囲を制限する。
```python
ax1.set_xlim([0.0, 1.0])
ax1.set_ylim([0.0, 1.0])
```

## 目盛りの間隔を制御する。
```python
ax1.set_xticks([0.0, 0.5, 1.0])
ax1.set_yticks([0.0, 0.5, 1.0])
```
実際はnp.linspace(最小, 最大, tick数)で作成するのが実用的。

## 設定した目盛り間隔にラベルを付与
```python
ax1.set_yticklabels(["小", "中", "大"])
```

## 凡例を表示
```python
ax1.legend(["test"], fontsize=7, loc="upper left")
```
plot時にlabelプロパティを指定している場合、["test"]の部分は不要。
fontsizeで文字の大きさ、locで表示する場所を制御できる。
locの設定値は[ここ](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.legend.html)のLocation Stringを参照。

## 軸ラベルを表示
```python
ax1.set_ylabel("X軸")
ax1.set_ylabel("Y軸")
```

## グリッドを表示
```python
ax.grid(b=True, linestyle=":")
```

# すべてのaxを表示した後の調整
## なんとなく整える呪文
```python
plt.tight_layout()
```

## subplotをまとめたタイトル表示
```python
fig.suptitle('title')
plt.tight_layout(rect=[0,0,1,0.96])
```

# 図の出力
画面上に表示。

```python
plt.show()
```

表示できるものがない環境では以下のように画像で出力。

```python
plt.savefig("aaa.png")
```

# 図のクローズ・削除
showしている場合はclose。

```python
plt.close()
```

さらに図を破棄する。破棄しないとメモリを占有する可能性あり。

```python
plt.clf()
```