Matplotlibについて

## Matplotlibについて
今回はmatplotlibについてまとめましたのでpandas同様に共有していきます。
要点だけまとめております。

## Matplotlibとは
matplotlibは、プログラミング言語Python及びその科学計算用ライブラリNumpyのためのグラフ描画ライブラリである。オブジェクト指向のAPIを提供しており、様々な種類のグラフを描画する能力を持つ。描画できるのは主に2次元のグラフを描画する(プロット)だが、3次元のグラフを描画する(プロット)機能も追加されてきている。

## Matplotlibでできること
- 折線グラフと散布図の描画
- グラフを並べて表示するsubplotsメソッド
- 円グラフ
- 棒グラフ

以上のデータの可視化をすることが可能。

## インストール

```python:qiita.py
$ pip install matplotlib
```

## インポート
ライブラリインポート。
今回はnumpyとpandasも利用しますのであらかじめインポートしておきます。

```python:qiita.py
$ import numpy as np
  import pandas as pd
  import matplotlib.pyplot as plt
  %matplolib inline
```

## 散布図
matplotlibでは散布図を作成することが可能です。
その前にまずデータフレームを作成します。

```python:qiita.py
# 適当に値とindex、columnsを用意
$ df = pd.DataFrame([[21, 13, 32, 44, 54], [50, 49, 38, 29, 10], [55, 44, 33, 11, 35], [66, 27, 38, 49, 70], [51, 62, 73, 84, 95]],
index=['A', 'B', 'C', 'D', 'E'], columns=['A1', 'B2', 'C3', 'D4', 'E5'])
```

![スクリーンショット 2021-04-02 1.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/179cd29e-3524-510d-2c71-5eef8778fa7d.png)

```python:qiita.py
# 散布図(scatter)
# xlabelを'B2'でylabelを'A1'と置いた時
$ plt.scatter(df['B2'], df['A1'])
```

![スクリーンショット 2021-04-02 1.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/e111db5a-271b-58cc-8ab5-767f951bc2cf.png)

はい！出力することができました！

## ヒストグラム
ヒストグラムではplt.hist(df['カラム名'])で出力することができます。
散布図と似ているので覚えやすいかと思います！
ヒストグラムでは「データの散らばり」を確認することができます。
binsという幅を指定することで広く狭くデータを確認することができるので一度やってみてください。

```python:qiita.py
$ plt.hist(df['D4'])
```

![スクリーンショット 2021-04-02 1.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/c7f73618-b270-36e8-3c4c-8d1e52666863.png)


## 折線グラフ
今回は(x, y)のような折線グラフを作成します。

```python:qiita.py
# xの値
# np.linspaceは指定した値をx等分することが可能
$ x = np.linspace(1, 100, 100)
  y = 2*x
  plt.plot(x, y)
# plt.grid()でグリッド線を追加
  plt.grid()
```

![スクリーンショット 2021-04-03 0.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/d6e6b7e5-bc5d-4b54-11c3-e426999a55bb.png)


次は反比例を作ります。

```python:qiita.py
$ y_1 = 1/x
  plt.plot(x, y_1)
  plt.grid()
```

![スクリーンショット 2021-04-03 0.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/d2323f60-04d2-eee9-f91c-226021e5eff5.png)


次に二次関数を作ります。

```python:qiita.py
$ y_2 = 5*x*x
  plt.plot(x, y_2)
  plt.grid()
```

![スクリーンショット 2021-04-03 0.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/502e1d97-3ff4-40a3-685e-c8af39bc9e56.png)


## subplotによる複数のグラフを並べる
先程作成した折線グラフと反比例のグラフ、二次関数のグラフをsubplotを使って複数同時に並べます。
また、タイトルやカラー、スペースなども同時に紹介します。

```python:qiita.py
# 折線グラフと反比例グラフを並べる
$ plt.subplot(121)
# カラー指定
plt.plot(x, y, color='blue')
plt.grid()
# タイトル指定
plt.title('Linear function')

plt.subplot(122)
# カラー指定
plt.plot(x, y_1, color='red')
plt.grid()
# タイトル指定
plt.title('Inverse proportional')

# 横のスペース指定
plt.subplots_adjust(wspace=0.5)

# 全体の大きさ
plt.figure(figsize=(9, 3))

# グラフ上部の位置変更
plt.subplots_adjust(top=0.8)
```

![スクリーンショット 2021-04-03 1.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/cc1c3a7a-2951-06c9-5216-e677b953af51.png)

最後に3つを並べます！

```python:qiita.py
$ plt.subplot(121)
plt.plot(x, y, color='blue')
plt.grid()

plt.subplot(222)
plt.plot(x, y_1, color='red')
plt.grid()

# 二次関数
plt.subplot(224)
plt.plot(x, y_2, color='yellow')
plt.grid()

# 横のスペース指定
plt.subplots_adjust(wspace=0.5)
# 全体のタイトルと文字の大きさ指定
plt.suptitle('The entire', fontsize=18)
```

![スクリーンショット 2021-04-03 1.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/ac89b1fb-b19e-e992-068c-84607dcf1926.png)

## 円グラフ
次に円グラフについてです。
まず作成してみますが、「ラベル」と「サイズ」を指定してみます。

```python:qiita.py
# ラベル指定
labels = ['A', 'B', 'C', 'D']
# サイズ指定
sizes = [15, 30, 35, 10]

plt.pie(sizes, labels=labels)

plt.show()
```

![スクリーンショット 2021-04-07 22.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/637bf1ae-e85e-c714-9b7c-57a00d0a6035.png)

次に円グラフの切り離しを行います。

```python:qiita.py
# 円グラフ切り離し
# ラベル指定
labels = ['A', 'B', 'C', 'D']
# サイズ指定
sizes = [15, 30, 35, 10]
# 切り離し
explode = (0, 0.1, 0.05, 0)

plt.pie(sizes, labels=labels, explode=explode)

plt.show()
```

![スクリーンショット 2021-04-07 22.56.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/6e3c1a61-e0c7-a3dc-06d9-7232066984f4.png)

現在反時計回りになっているので時計回りに直します。

```python:qiita.py
# 円グラフ時計回り

# 円グラフ

# ラベル指定
labels = ['A', 'B', 'C', 'D']
# サイズ指定
sizes = [15, 30, 35, 10]
# 時計回り(counterclock)
plt.pie(sizes, labels=labels, counterclock=False)

plt.show()
```

![スクリーンショット 2021-04-07 22.59.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/c70e1689-12ac-9742-fb43-6c2bd8318118.png)

次に円グラフに影をつけます。

```python:qiita.py
# 円グラフ影をつける

# 円グラフ

# ラベル指定
labels = ['A', 'B', 'C', 'D']
# サイズ指定
sizes = [15, 30, 35, 10]
# 切り離し
explode = (0, 0.1, 0.05, 0)

# 影をつける(shadow=True)
plt.pie(sizes, labels=labels, explode=explode, counterclock=False, shadow=True)

plt.show()
```

![スクリーンショット 2021-04-07 23.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/816f6fa0-bb58-b7f1-9672-435587d252c3.png)


次に値をグラフ内に表示します。

```python:qiita.py
# 値を円グラフ内に表示
# ラベル指定
labels = ['A', 'B', 'C', 'D']
# サイズ指定
sizes = [15, 30, 35, 10]
# 切り離し
explode = (0, 0.1, 0.05, 0)

# 値を設定(autopct)
plt.pie(sizes, labels=labels, explode=explode, counterclock=False, shadow=True, autopct='%1.1f%%')

plt.show()
```

![スクリーンショット 2021-04-07 23.01.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/5b0c257e-5bff-b2a4-f60c-79a3204b6e1d.png)


次にドーナツ状にします。

```python:qiita.py
# ドーナツ

# 円グラフ

# ラベル指定
labels = ['A', 'B', 'C', 'D']
# サイズ指定
sizes = [15, 30, 35, 10]
# 切り離し
explode = (0, 0.1, 0.05, 0)
# ドーナツサイズ
size = 0.5

# ドーナツ状へ設定(wedgeprop)
plt.pie(sizes, labels=labels, explode=explode, counterclock=False, shadow=True, autopct='%1.1f%%', wedgeprops=dict(width=size, edgecolor='w'))

plt.show()
```

![スクリーンショット 2021-04-07 23.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/a1114a0b-5201-601e-480b-1a8884f5e539.png)


次に半径の円グラフを表示します。

```python:qiita.py
# 半径

# 円グラフ

# ラベル指定
labels = ['A', 'B', 'C', 'D']
# サイズ指定
sizes = [15, 30, 35, 10]
# 切り離し
explode = (0, 0.1, 0.05, 0)
# 半径(円型)サイズ
size = 0.5

# 半径設定(radius)
plt.pie(sizes, labels=labels, explode=explode, counterclock=False, shadow=True, autopct='%1.1f%%', wedgeprops=dict(width=size, edgecolor='w'), radius=2)

plt.show()
```

![スクリーンショット 2021-04-07 23.08.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/36a0a00f-c065-0fc9-ac26-714936ac67b6.png)


## 棒グラフ
最後に棒グラフをプロットして終わります！！

```python:qiita.py
# 棒グラフ

plt.bar(x, y)
```

![スクリーンショット 2021-04-07 23.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/4a2cc14e-805a-f721-4f7a-0005b5a469ba.png)


```python:qiita.py
a = (np.linspace(1, 100, 10))
b = (np.linspace(1, 100, 10))

plt.bar(a, b)
plt.grid()
plt.title('bin')
plt.show()
```

![スクリーンショット 2021-04-07 23.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057107/dc2ab12e-2472-2a24-6d74-c823774fed4c.png)


## 最後に
今回はmatplotlibについてまとめました！
次回は機械学習の線形回帰について私個人のわかる範囲で共有していこうと思います！！