[python] 非IT系の仕事でも使える matplotlib の使い方

## 始めに
pythonを使って、様々なグラフを描画することができる、matplotlibの使い方備忘録です。簡単にプロット図を作成でき、ラベルやテキストを自由に設定できます。図中のすべての要素（ラベル、凡例、軸、色、タイトル等)を簡単に操作できます。
numpy、pandasとjupyter notebookと組み合わせて使うことをお勧めします。エクセルで行なっていたデータ整理->グラフ化が本当に簡単にできるようになります。
[[python3]すぐに使えるnumpyの使い方まとめ](https://qiita.com/saira/items/000bb3f171a516d68013)
[[python3] 非IT業務でも使える pandas の基本的な使い方](https://qiita.com/saira/items/3fcfc73b967744bec124)

## インポート
pltとしてインポートするのが慣例。
jupyter notebook内にグラフを表示するためのおまじないとして、1行追加。

```python:
import matplotlib.pyplot as plt
%matplotlib inline
```

## pltプロット (MATLABスタイル)

まずデータの準備（numpyを使って)

```python:simple_plot
import numpy as np
x = np.linspace(0, 10, 11)
# => array([ 0.,  1.,  2.,  3.,  4.,  5.,
#            6.,  7.,  8.,  9., 10.])
y = x ** 2
# => array([  0.,   1.,   4.,   9.,  16.,  25.,
#            36.,  49.,  64.,  81., 100.])
```


```python:show_plot
# 3つめの引数で色を指定可能。Hex codeでも可。
plt.plot(x, y, 'blue') 

# X, Yラベルおよびグラフタイトルを追加
plt.xlabel('X label')
plt.ylabel('Y label')
plt.title('Title')
```
グラフが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/576aec5f-8dc7-f901-a58e-3dba4aa20bc9.png)




### 複数の図形を表示
subplot()に引数として整数を渡す。行数、列数、プロットする番号。

```python:
# plt.subplot(nrows, ncols, plot_number)
plt.subplot(1, 2, 1)
plt.plot(x, y, 'r--') # redの破線
plt.subplot(1, 2, 2)
plt.plot(y, x, 'g*-') # greenの*プロット
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/94599133-78d9-0ff9-8dd0-6eb993012408.png)

## オブジェクト指向メソッド (add_axes())
Figureオブジェクトをインスタンス化して、そのオブジェクトからメソッドや属性を呼び出す。 複数のプロットが描かれているキャンパスを扱う場合は、この方法が適している。 はじめにFigureインスタンスを作成し、それからそのキャンパスに軸(Axes)を追加していく。

オブジェクト指向メソッドで、上記MATLABスタイルと同様の図を作成してみる。

```python:simple_plot
# Figureを作成 (空のキャンバス)
fig = plt.figure()
# 軸(axes)をFigureに追加する。
# [左からの距離,下からの距離、グラフの横幅、グラフの高さ]を
# 0~1の範囲で指定
ax = fig.add_axes([0.1,0.1,0.8,0.8])

# 追加した軸(axes)にプロットする
axes.plot(x, y, 'blue')
# メソッドの使うときは、頭にset_を付ける
axes.set_xlabel('X label')
axes.set_ylabel('Y label')
axes.set_title('Title')
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/e41bf630-f60b-1c98-2e33-293b4010d425.png)

コードは少し複雑になるが、Axesが配置される場所を制御できるので、Figureに複数の図を簡単に追加できるようになる。


### 複数のaxesを持つグラフ

```python:
# 空のキャンバスを作成
fig = plt.figure()
# axes を追加
ax1 = fig.add_axes([0.1,0.1,0.8,0.8]) # main axes
ax2 = fig.add_axes([0.2,0.5,0.4,0.3]) # inset axes

# Axes 1
ax1.plot(x, y, 'blue')
ax1.set_xlabel('X_axes1')
ax1.set_ylabel('Y_axes1')
ax1.set_title('Axes 1 Title')

# Insert Figure Axes 2
ax2.plot(y, x, 'red')
ax2.set_xlabel('X_axes2')
ax2.set_ylabel('Y_axes2')
ax2.set_title('Axes 2 Title');
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/a7904522-7253-a183-3d07-54027292d479.png)


## オブジェクト指向メソッド (subplots())
plt.subplots()オブジェクトは、より柔軟にaxesを操作できる。
plt.figure()に似ているが、plt.subplots()はfigとaxesをタプルアンパッキングしている。


```python:
fig, ax = plt.subplots()

# plotに情報を追加するために、axオブジェクトを使用する。
ax.plot(x, y, 'blue')
ax.set_xlabel('X label')
ax.set_ylabel('Y lable')
ax.set_title('Title')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/06ff35da-3f1e-1be3-3807-0b8c0ff6b14a.png)

### 複数グラフを作成する
subplots()オブジェクト作成時に、グラフの行数、列数を指定することができる。これにより、axesアレイ化されるため、pythonのリストのようにイテレートすることが可能になる。

```python:
fig, axes = plt.subplots(nrows=1, ncols=2)

for ax in axes:
    ax.plot(x, y, 'blue')
    ax.set_xlabel('X label')
    ax.set_ylabel('Y label')
    ax.set_title('title') 

# グラフや軸ラベルが重なることを避ける
fig.tight_layout()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/d2dc61b6-56b1-c0bf-f04d-23d87198d096.png)


## Figureのサイズ、アスペクト比、DPI
matplotlibでは、Figureオブジェクトを作成する際に、アスペクト比、DPIおよびFigureサイズを 指定することが出来る。
figsize : 図の幅と高さをインチで表したタプル 
dpi : 1インチあたりのドット数（1インチあたりのピクセル数）

```python:
fig, axes = plt.subplots(figsize=(12,3))

axes.plot(x, y, 'blue')
axes.set_xlabel('X label')
axes.set_ylabel('Y label')
axes.set_title('Title');
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/05bb8934-42f9-efea-b6e2-733829a4c0a9.png)

## Figureの保存

```python:
# ここでも、DPIを設定したり、様々なフォーマットを拡張子で選択可能。
fig.savefig('test.png', dpi=100)
```

## 凡例、ラベル、タイトル、グリッド
それぞれ、引数でフォントサイズやカラーを選択できる。
判例は、plot時に引数として、label=''で指定することで、自動で判例を追加してくれる。凡例の位置は、引数loc=で指定。
デフォルトは、loc=0でベストな位置を自動で判定。

|loc=|配置場所|
|:--:|:--:|
|0|ベストな位置|
|1|右上|
|2|左上|
|3|左下|
|4|右下|
|5|右|
|6|中心より左|
|7|中心より右|
|8|下より中心|
|9|上より中心|
|10|中心|

```python:
fig, ax = plt.subplots()

ax.plot(x, y, 'orange', label='label')

ax.set_xlabel('X', fontsize=10, color='red')
ax.set_ylabel('Y', fontsize=10, color='blue')

ax.grid(True)
ax.legend(loc=2)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/7c6cc5d0-bd84-225c-48fc-efccb81245e1.png)



## 色、線幅、線種

```python:
fig, ax = plt.subplots(figsize=(12,6))

ax.plot(x, x+1, color="red", linewidth=0.50)
ax.plot(x, x+2, color="red", linewidth=2.00)

# 様々なラインオプション ‘-.’, ‘:’
ax.plot(x, x+3, color="green", lw=3, ls='-.')
ax.plot(x, x+4, color="green", lw=3, ls=':')

# 各種マーカー  marker = '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ...
ax.plot(x, x+5, color="blue", lw=3, ls='-', marker='+')
ax.plot(x, x+6, color="blue", lw=3, ls='--', marker='o')

# マーカーのサイズと色
ax.plot(x, x+7, color="purple", lw=1, ls='-', marker='o', markersize=8, markerfacecolor="red")
ax.plot(x, x+8, color="purple", lw=1, ls='-', marker='s', markersize=8, markerfacecolor="yellow", markeredgewidth=3, markeredgecolor="green");
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/29d0df8f-5e3b-ed67-5600-65ea49d180e4.png)

## style

plt.style.use を利用することで、様々なスタイルのグラフを描画できる。
seabornをインストールしていると、seabornスタイルも利用できる。

```python:
# スタイルの設定
# 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-ticks', 'fivethirtyeight', 'seaborn-whitegrid', 'classic', 'seaborn-talk', 'seaborn-dark-palette','seaborn-bright', 'seaborn-pastel', 'grayscale', 'seaborn-notebook','ggplot', 'seaborn-colorblind', 'seaborn-muted', 'seaborn', 'seaborn-paper','bmh', 'seaborn-white', 'dark_background', 'seaborn-poster', 'seaborn-deep'
plt.style.use('ggplot')

plt.plot(x, y)
plt.plot(x, y*2)
plt.plot(x, y*3)
plt.xlabel('X label')
plt.ylabel('Y label')
plt.title('ggplot')
```
・ggplot
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/9d831c9a-7604-0774-747a-bec4af163a44.png)
・seaborn-dark
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/4452cbd7-8869-7922-7f79-8c810416c06e.png)
・classic
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/a903664a-3b8d-c577-be4e-060316485330.png)
・bmh
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/39b3d18b-c101-3f91-1f91-6866ec62b3cf.png)
・fivethirtyeight
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330669/e8571b79-fa6b-a648-9d8c-8263a96d973c.png)