matplotlib 入門

python のライブラリ matplotlibについて学んでいきたいと思います。

matplotlib とは
======
```matplotlib``` はpythonのプロットライブラリで、散布図やヒストグラム、棒グラフをコードを使用して作成出来ます。
データ分析に使用されるもので、```pip```等でインストールも可能ですが、```Anaconda```に含まれていますので今回はそちらを使用します。

全体イメージ
============
今回は ```Jupyter Notebook```を使用して実際の結果がすぐに分かるようにしました。

まず全体のイメージから理解します。
以下は基本的な散布図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/8b00b833-5915-50fc-fd83-0842ee4fe2bc.png)

```Figure``` という基盤に ```Axes``` を呼ばれる枠組みを用意します。
Axesの枠組みに定義した```Plotメソッド```を使用して図を描いていきます。 
これがmatplotlibの基本的な描き方かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/0fecd446-5c6e-373c-1413-6c8602012a28.png)

先ほどJupyter Notebookから実行したコードに注釈を入れると、以下のようなイメージになります。

``` sample1.py
# matplotlib のインポート
import matplotlib.pyplot as plt

# プロットする点の定義
X = [1,2,3]
Y = [1,1,1]

# figureオブジェクトを生成する
fig = plt.figure()

# axesオブジェクトをfigureオブジェクトに対して設定する
ax = fig.add_subplot(1, 1, 1)

# axesオブジェクトに対して散布図のメソッドを設定する
ax.scatter(X, Y)

# 表示させる
plt.show()
```

Figure について
============
グラフィックの基盤となるものを定義します。
引数は公式に記載がありますが、全体のフレームをどのようにしたいかを定義するものとなるかと思います。


https://matplotlib.org/stable/api/figure_api.html


先ほど ```plt.figure()```へ定義したものに、少し手を加えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/dff5d749-9f0a-989c-57d4-78f2052eface.png)

```
fig = plt.figure(figsize=(5,5), dpi=60, facecolor='silver', edgecolor='b',linewidth=5)
```
| Property | Description |
|:-:|:-:|
| ***figsize*** | 枠組みのサイズ、float値で(width, height)を指定|
| ***dpi***  | 解像度を整数で指定 |
| ***facecolor***  | 背景色を指定、16 進数のカラーコードも指定可 |
| ***edgecolor***  | 枠の色を指定、b は "Blue"の省略 |
| ***linewidth***  | 枠線の太さを指定、整数  |

Axes について
=============
Figure の上に作成される枠組みであり、この中にグラフが描かれます。
Axes は複数作成することができます。一般的に、グラフの種類に応じたメソッドに対して、リストやndarrayなどのシーケンスを引数に設定します。

add_subplot()
-------------
以下の例では、```add_subplot()```メソッドを使用して複数のaxesを定義しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/d1029d32-e6d8-adb4-bd9c-5d328a41a987.png)


``` sample2.py
import matplotlib.pyplot as plt

fig = plt.figure()

# 1つ目のaxesオブジェクトをfigureオブジェクトに対して設定する
ax1 = fig.add_subplot(2, 3, 1)
# 2つ目のaxesオブジェクトをfigureオブジェクトに対して設定する
ax2 = fig.add_subplot(2, 3, 2)
# 3つ目のaxesオブジェクトをfigureオブジェクトに対して設定する
ax3 = fig.add_subplot(2, 3, 3)
# 4つ目のaxesオブジェクトをfigureオブジェクトに対して設定する
ax4 = fig.add_subplot(2, 3, 4)

plt.show()
```

https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.add_subplot

```add_subplot()``` は ```(nrows, ncols, index)```を入れます。
Figureを```行としてnrows分割```、```列としてncols分割```したうち、```indexの位置```にAxesが返されます。
他にもpropertyを指定する事で、表示形式を変更出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/8a806d88-c3b2-9a27-b941-12e11abc553a.png)

| Property | Description |
|:-:|:-:|
| ***title*** | 文字列のタイトルを指定 |
| ***facecolor***  | axesの色を指定 |
| ***xlabel***  | X軸のタイトルを指定 |
| ***ylabel***  | Y軸のタイトルを指定 |

plt.subplot( )
---------------
```add_subplot（）``` メソッドは、Figureオブジェクト上に定義しますが、
```plt.subplot（）``` メソッドは、Figureオブジェクトの生成が不要となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/157ac517-9060-01b3-d927-687af209a033.png)

散布図 ax.scatter
=======
散布図を描くには ```ax.scatter（）```メソッドを使用します。
以下の例では、Numpyライブラリの ```np.random.rand```を使用して乱数を生成して点を生成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/5b7d738a-e4ec-24eb-dcf9-34a03d0e8c3a.png)

``` sample3.py
from matplotlib import pyplot as plt
import numpy as np

# 乱数を生成
x = np.random.rand(30)
y = np.random.rand(30)

# figureを生成
fig = plt.figure()

# axをfigureに設定
ax = fig.add_subplot(1, 1, 1)

# 散布図を生成
ax.scatter(x, y, s=200,c='blue',edgecolors='black',alpha=0.9, linewidths=2,)

#表示
plt.show()
```

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.scatter.html

| Property | Description |
|:-:|:-:|
| ***x*** | X座標データ配列  |
| ***y***  | Y座標データ配列  |
| ***s***  | マーカーのサイズ  |
| ***c***  |  マーカーの色 |
| ***marker***  | マーカーの形(デフォルトはo) |
| ***alpha***  |  マーカーの透明度 |
| ***linewidths***  | マーカーの枠のサイズ  |
| ***edgecolors***  |  マーカーの枠の色 |

棒グラフ　ax.bar
=====
棒グラフを描くには ```ax.bar()```メソッドを使用します。
以下の例では ```x,height,Label```に定義した配列をax.barで使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/0f78dba4-0cd6-a2f4-d243-599b6d2418a7.png)


``` sample4.py
import matplotlib.pyplot as plt

# 縦軸、横軸のデータ
x = [1, 2, 3, 4, 5, 6]  
height = [2, 3, 2, 2, 5, 4]  

# ラベル
label = ['A', 'B', 'C', 'D', 'E', 'F']

# figureを生成
fig = plt.figure()
 
# axをfigureに設定
ax = fig.add_subplot(1, 1, 1)
 
# axesに棒グラフを設定
ax.bar(x, height, trick_label=label,edgecolor="Blue")

# 表示
plt.show()
```
https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.bar.html

| Property | Description |
|:-:|:-:|
| ***x*** |  X座標データ配列 |
| ***height***  | 棒の高さのデータ配列  |
| ***trick_label***  | 棒単位の名称 |
| ***color*** | 棒の色 | 
| ***edgecolor***  | 棒の枠の色  |

円グラフ ax.pie
=======
円グラフを描くには、```ax.pie```メソッドを使用します。
以下の例では、```label,x```に定義した配列をax.pieで使用します。
また、```ax.axis```は表示補正のために呼び出しを行うようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/df369ad3-0e90-0c64-8292-0283a3f27c06.png)

``` sample4.py
import matplotlib.pyplot as plt

# 対象データ
label = ["A", "B", "C", "D", "E", "F"]
x = [20, 10, 36, 20, 2, 12]

# figureを生成
fig = plt.figure()

# axをfigureに設定
ax = fig.add_subplot(1, 1, 1)

# ax に円グラフを設定
ax.pie(x, labels=label, counterclock=False, startangle=90)

# 表示補正
ax.axis('equal')

# 表示
plt.show()
```

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.pie.html

| Property | Description |
|:-:|:-:|
| ***x***  |  データ配列 |
| ***labels***  | 各要素のラベルの配列  |
| ***counterclock***  | 時計周り(False),反時計周り(True)  |
| ***startangle***  |  開始角度(デフォルトは3時から開始) |

折れ線グラフ ax.plot
======
折れ線グラフは、```ax.plot```メソッドを使用します。
以下の例では、x 軸に6つのデータを定義し、折れ線となる軸を3つ、かつy軸の線に対する値を6つ定義します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/cb388f1e-1809-053c-5919-658c54800e8e.png)

``` sample5.py
import matplotlib.pyplot as plt

# X軸の定義
x = [1, 2, 3, 4, 5, 6]

# Y軸の定義
y1 = [100, 50, 150, 300, 100, 100 ]
y2 = [200, 300, 200, 400, 200, 300]
y3 = [500, 400, 300, 600, 100, 400]

# figureを生成
fig = plt.figure()

# axをfigureに設定
ax = fig.add_subplot(1, 1, 1)

# axに折れ線を設定
ax.plot(x, y1, "-", c="Blue", linewidth=1, marker='o', alpha=1)
ax.plot(x, y2, "-", c="Red", linewidth=1, marker='o', alpha=1)
ax.plot(x, y3, "-", c="Green", linewidth=1, marker='o', alpha=1)

# 表示
plt.show()
```

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.plot.html

| Property | Description |
|:-:|:-:|
| ***x***  | X座標配列データ  |
| ***y***  | Y座標配列データ  |
| ***c***  | 折れ線の色  |
| ***linewidth***  | 折れ線の太さ  |
| ***marker***  | X軸のデータに到達した際の点の形(デフォルトはo) |
| ***alpha***  | 線の透明度 |

その他汎用要素
=======
```plt.grid()``` は、グリッド線を追加する事が出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/44500694-1eff-a34e-31fd-4c6a40a754fb.png)

```ax.legend()``` は、凡例を表示するものです。
グラフを描画したものに対して補足説明をする際に、使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/35a56533-8983-15ba-b81f-710399e552c4.png)


使用してみると、可視化されるので非常に面白かったです。
以上です。