製薬企業研究者がMatplotlibについてまとめてみた

# はじめに

ここでは、Python初心者向けに、Matplotlibについて解説します。
Python3系の使用を想定しています。

# ライブラリの読み込み

他のライブラリと同様に、`import`で読み込みます。
`%matplotlib inlline`は、Jupyter Notebookにおいて、ノートブック上でグラフを描画するための記述です。

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

# 折れ線グラフ

折れ線グラフは、基本的には以下のように描画することができます。

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


x = [1, 2, 3]
y = [3, 1, 2]
plt.title('Line-chart') # グラフタイトル
plt.xlabel('X-axis') # x軸ラベル
plt.ylabel('Y-axis') # y軸ラベル

plt.plot(x, y) # グラフを作成
plt.savefig('matplotlib_2.png') # グラフを画像ファイルとして保存
```

![matplotlib_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/424995d7-68cf-67de-a455-58ecf4030c9f.png)


複数の折れ線グラフを描画する場合は以下のように書きます。

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


plt.plot([1, 2, 3])
plt.plot([3, 1, 2])
plt.title('Line-chart')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend(['Line-1', 'Line-2']) # 凡例

plt.show() # グラフを表示
plt.savefig('matplotlib_3.png')
```

![matplotlib_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/be1a4336-61db-f1ad-597f-2a1403c2c061.png)

また、上のコードは以下のように書き換えることもできます。

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


fig, ax = plt.subplots()

ax.plot([1, 2, 3])
ax.plot([3, 1, 2])
ax.set_title('Line-chart')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.legend(['Line-1', 'Line-2'])

plt.show()
plt.savefig('matplotlib_4.png')
```

![matplotlib_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/026c82b4-496b-dd43-5ff6-201d98276299.png)


複数のグラフを縦に並べることもできます。

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


fig, ax = plt.subplots(2) # 2行に並べる
plt.subplots_adjust(wspace=1, hspace=1) # グラフ間のスペース

ax[0].plot([1, 2, 3])
ax[0].set_title('Line-chart-1')
ax[0].set_xlabel('X-axis')
ax[0].set_ylabel('Y-axis')
ax[1].plot([3, 1, 2])
ax[1].set_title('Line-chart-2')
ax[1].set_xlabel('X-axis')
ax[1].set_ylabel('Y-axis')

plt.show()
plt.savefig('matplotlib_5.png')
```

![matplotlib_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/d3a2e3df-bc7b-ee4a-2bfd-affb80d31ab8.png)


同様に、横に並べることもできます。

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


fig, ax = plt.subplots(1, 2) # 1行2列に並べる
plt.subplots_adjust(wspace=1, hspace=1)

ax[0].plot([1, 2, 3])
ax[0].set_title('Line-chart-1')
ax[0].set_xlabel('X-axis')
ax[0].set_ylabel('Y-axis')
ax[1].plot([3, 1, 2])
ax[0].set_title('Line-chart-1')
ax[1].set_xlabel('X-axis')
ax[1].set_ylabel('Y-axis')

plt.show()
plt.savefig('matplotlib_6.png')
```

![matplotlib_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/04cf7994-558a-aaf6-59e0-f879bfa984ac.png)


# 棒グラフ

棒グラフは、以下のようにして描画することができます。

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


x = [1, 2, 3]
y = [3, 1, 2]

plt.bar(x, y, tick_label=['Bar-1', 'Bar-2', 'Bar-3']) # データ、ラベル名を指定して棒グラフを作成

plt.show()
plt.savefig('matplotlib_7.png')
```

![matplotlib_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/9d557253-0ee5-0c16-4118-2e41526f9811.png)

複数の棒グラフを横に並べる時は以下のように記述します。

```python:matplotlib_8.py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np


y1 = [3, 1, 2]
y2 = [2, 3, 1]
x = np.arange(len(y1))

bar_width = 0.3 # 棒グラフの幅を指定

plt.bar(x, y1, width=bar_width, align='center')
plt.bar(x+bar_width, y2, width=bar_width, align='center')
plt.xticks(x+bar_width/2, ['Bar-1', 'Bar-2', 'Bar-3'])

plt.show()
plt.savefig('matplotlib_8.png')
```

![matplotlib_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/6fd7de18-ef1d-38d9-0e94-a8dd4163bd64.png)


縦に重ねる時は、以下のように書きます。

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


x = [1, 2, 3]
y1 = [3, 1, 2]
y2 = [2, 3, 1]

plt.bar(x, y1, tick_label=['Bar-1', 'Bar-2', 'Bar-3'])
plt.bar(x, y2, bottom=y1) # y1の上にy2を乗せる

plt.show()
plt.savefig('matplotlib_9.png')
```

![matplotlib_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/1ba711af-5db0-d331-94d5-f4a4fd6e385e.png)


# ヒストグラム

ヒストグラムを描画する時は以下のように記述します。

```python:matplotlib_10.py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np


num_random = np.random.randn(100)
plt.hist(num_random, bins=10) # ヒストグラムを作成

plt.show()
plt.savefig('matplotlib_10.png')
```

![matplotlib_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/0c016fa9-e740-fc6b-5db4-641c76111dc1.png)


# 散布図

散布図の描画は以下の通りです。

```python:matplotlib_11.py
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np


x = np.random.choice(np.arange(100), 100)
y = np.random.choice(np.arange(100), 100)

plt.scatter(x, y) # 散布図を作成

plt.show()
plt.savefig('matplotlib_11.png')
```

![matplotlib_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/5d8cbfe1-5ef8-5d0e-7c62-2947b50db65c.png)



# 円グラフ

円グラフは、以下のようにして描画することができます。

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


percent_data = [45, 25, 15, 10, 5]

plt.pie(percent_data, labels=['data-1', 'data-2', 'data-3', 'data-4', 'data-5']) # 円グラフ（楕円）を作成
plt.axis('equal') # 円形にする

plt.show()
plt.savefig('matplotlib_12.png')
```

![matplotlib_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/2c6baaf0-d1e8-52e5-5bf6-2f8a46bf969e.png)

# まとめ

ここでは、Matplotlibを用いて、折れ線グラフ、棒グラフ、ヒストグラム、散布図、円グラフを描画する方法について解説しました。
目的に応じて、適切なデータ可視化方法を選択できるようにしたいところです。


# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)