Matplotlib_チートシート_Python データ分析学習備忘録


## チートシート
自己学習用です。
正規の内容はドキュメントを参照してください。

## 文法

### グラフ描画 基本文法

```python
# matplotlib.pyplotをpltとしてimport
import matplotlib.pyplot as plt
import numpy as np

# np.piは円周率
x = np.linspace(0, 2*np.pi)
y = np.sin(x)

# データx, yをグラフにプロットして表示
plt.plot(x, y)
```

* 表示範囲：`plt.xlim([始まりの値, 終わりの値])` `plot.ylim([始まりの値, 終わりの値])`
* グラフタイトル：`plt.title("タイトル名")`
* 軸ラベル：`plt.xlabel("ラベル名")` `plt.ylabel("ラベル名")`
* グリッド表示：`plt.grid(True)`
* グラフ軸のメモリを設定：`plt.xticks([目盛りを挿入する位置], [表示する目盛りの文字列])` 
* グラフサイズ：`plt.figure(figsize=(横の大きさ, 縦の大きさ(デフォルトは8, 6)))`
* 色の指定：`plt.plot(x, y, color="色指定")`
カラーコード（#に続く6桁の16進数）か下記の文字を指定
`"b"` : 青
`"g"` : 緑
`"r"` : 赤
`"c"` : シアン
`"m"` : マゼンタ
`"y"` : 黄色
`"k"` : 黒
`"w"` : 白

**系列ラベルの設定**
```python
plt.plot(x, y1, label="ラベル名1")
plt.plot(x, y2, label="ラベル名2")
plt.pyplot.legend()
```

### サブプロット
図（figure）の中に任意の数のグラフを生成して複数のグラフを描画できる
`add_subplot()`メソッドを指定し、図を分割するレイアウトとその中でのサブプロットの位置を指定する

`add_subplot(行数, 列数, 何番目か)`
```Python
import matplotlib.pyplot as plt
import numpy as np


# figureオブジェクトを作成
fig = plt.figure(figsize=(9, 6))
# axesオブジェクトを2行３列に分割して右下にグラフを追加
ax = fig.add_subplot(2, 3, 6)

#  y=xのグラフをaxesオブジェクトに描画
x = np.linspace(0, 100)
y = x
ax.plot(x, y)

# グラフの位置をわかりやすくするため空白部分をサブプロットで埋める
for i in range(6):
    if i != 5:
        fig.add_subplot(2, 3, i+1)
    

plt.show()
```

#### サブプロット内のグラフ表示操作
サブプロットオブジェクトを変数axとして

余白の調整：`plt.subplots_adjust(wspace=横の間隔幅, hspace=縦の間隔幅)`
グリッドの表示：`ax.grid(True)`


**グラフの表示範囲を設定**
x軸の表示範囲を設定する：`ax.set_xlim([最小値, 最大値])`
y軸の表示範囲を設定する：`ax.set_ylim([最小値, 最大値])`

**グラフの要素に名前を設定**
グラフのタイトルを設定する：`ax.set_title("タイトル")`
x軸のラベルを設定する：`ax.set_xlabel("x軸の名前")`
y軸のラベルを設定する：`ax.set_ylabel("y軸の名前")`

**グラフの軸に目盛りを設定**
x軸に挿入する目盛りの位置：`ax.set_xticks([挿入位置のリスト])`
x軸に挿入する目盛りのラベル：`ax.set_xticklabels([目盛りラベルのリスト])`

**マーカーの種類と色を設定**
`plt.plot(x, y, marker="マーカーの種類", markerfacecolor="マーカーの色")`

マーカーの種類と色
マーカー
`"o"`: 円
`"s"`: 四角
`"p"`: 五角形
`"*"`: 星
`"+"`: プラス
`"D"`: ダイアモンド


**線のスタイルと色**
`plt.plot(x, y, linestyle="線のスタイル", color="線の色")`
線のスタイル
`"-"`: 実線
`"--"`: 破線
`"-."`: 破線（点入り）
`":"`: 点線

**色**
`"b"` : 青
`"g"` : 緑
`"r"` : 赤
`"c"` : シアン
`"m"` : マゼンタ
`"y"` : 黄色
`"k"` : 黒
`"w"` : 白

## グラフの描画

### 折線グラフ　plt.plot()
**マーカーの形、線のスタイル、色の指定**
```python
matplotlib.pyplot.plot(
    x, y, 
    linestyle="線のスタイル", color="線の色", 
    marker="マーカーの種類", markerfacecolor="マーカーの色",
    )
```

マーカーの種類
`"o"`: 円
`"s"`: 四角
`"p"`: 五角形
`"*"`: 星
`"+"`: プラス
`"D"`: ダイアモンド

### 棒グラフ　plt.bar()
**横軸にラベルを設定**
`
matplotlib.pyplot.bar(x, y, tick_label=[ラベルのリスト])
`
**積み上げ棒グラフ**
```Python
x = [1, 2, 3, 4, 5, 6]
y1 = [12, 41, 32, 36, 21, 17]
y2 = [43, 1, 6, 17, 17, 9]
labels = ["Apple", "Orange", "Banana", "Pineapple", "Kiwifruit", "Strawberry"]

# 下側のグラフ：ラベルを設定
plt.bar(x, y1, tick_label=labels)
# 上側のグラフ：bottomで下側のグラフを設定することで余白ができる
plt.bar(x, y2, bottom=y1)

# 系列ラベルの設定が可能
plt.legend(("y1", "y2"))
```

### ヒストグラム　plt.hist()

* グラフデータの標準化（正規化）：`density=True`
* ビン数指定（データをいくつの階級に分けるか）：`bins=100`
* 累積ヒストグラムの設定：`cumulative=True`

### 散布図　plt.scatter()

#### 基本記法
```Python
import numpy as np
import matplotlib.pyplot as plt

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

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

plt.show()
```

**マーカー指定**
`matplotlib.pyplot.scatter(x, y, marker="マーカーの種類", color="マーカーの色")`

**マーカー**
`"o"`: 円
`"s"`: 四角
`"p"`: 五角形
`"*"`: 星
`"+"`: プラス
`"D"`: ダイアモンド



**マーカーサイズ**
`s=マーカーのサイズ`
デフォルト：20

**マーカー色　色系統指定子**
`matplotlib.pyplot.scatter(x, y, c=マーカーの色 または プロットデータに対応するリスト型のデータ, cmap="色系統指定子")
`

色系統指定子
`"Reds"`: 赤
`"Blues"`: 青
`"Greens"`: 緑
`"Purples"`: 紫

**カラーバーの表示**：`plt.colorbar()`

### 円グラフ plt.pie()

#### 基本記法
```python
import matplotlib.pyplot as plt

data = [60, 20, 10, 5, 3, 2]

# 変数dataを円グラフで描画
plt.pie(data)

# 円グラフを楕円から円形に変更
plt.axis("equal")

plt.show()
```
**円の要素のラベル指定**
`matplotlib.pyplot.pie(データ, labels=[ラベルのリスト])`

**特定の要素を目立たせる**
`matplotlib.pyplot.pie(データ, explode=[目立たせ度合いのリスト(0~1)])`

### 3D Axesの作成

3Dグラフを描画するには、3D描画機能を持ったサブプロットを作成する必要があり、サブプロットを作成する際にprojection="3d"と指定する
```Python
import numpy as np
import matplotlib.pyplot as plt

# 3D描画を行うために必要なライブラリ
from mpl_toolkits.mplot3d import Axes3D

t = np.linspace(-2*np.pi, 2*np.pi)
X, Y = np.meshgrid(t, t)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

# Figureオブジェクトを作成
fig = plt.figure(figsize=(6, 6))

# 3D描画機能を持ったサブプロットaxを追加
ax = fig.add_subplot(1, 1, 1,  projection="3d")

# プロットして表示
ax.plot_surface(X, Y, Z)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3100685/67a47f9a-9c84-d0f2-1b80-18524e726b4f.png)

**曲面の作成**

`plot_surface()`にx軸、y軸、z軸に対応するデータを指定
```Python
x = y = np.linspace(-5, 5)
X, Y = np.meshgrid(x, y)
Z = np.exp(-(X**2 + Y**2)/2) / (2*np.pi)

# Figureオブジェクトを作成
fig = plt.figure(figsize=(6, 6))
# 3D描画機能を持ったサブプロットaxを追加
ax = fig.add_subplot(1, 1, 1, projection="3d")

# 曲面を描画
ax.plot_surface(X, Y, Z)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3100685/aacd683a-4528-d797-a6f8-84d609ae2a0c.png)

**3Dヒストグラムを作成**
3次元のヒストグラムや棒グラフは2つの要素の関係性を見出すのに有効な手法で、データセットの各要素をそれぞれx軸とy軸に対応させ、z軸方向に積み上げて表現する
bar3d()にx軸、y軸、z軸の位置と変化量に対応するデータを指定


```Python
# Figureオブジェクトを作成
fig = plt.figure(figsize=(5, 5))
# サブプロットaxを追加
ax = fig.add_subplot(1,1,1, projection="3d")

# x, y, zの位置を決める
xpos = [i for i in range(10)]
ypos = [i for i in range(10)]
zpos = np.zeros(10)

# x, y, zの変化量を決める
dx = np.ones(10)
dy = np.ones(10)
dz = [i for i in range(10)]

# 3次元のbarを作成
ax.bar3d(
    xpos（x位置）, ypos（y位置）, zpos（z位置）, dx（x変化量）, dy（y変化料）, dz（z変化量）
    )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3100685/fbbc4ab9-bce6-f8e6-45a9-7c2ac15f7a0c.png)

**3D散布図を作成**
3次元の散布図は互いに関係を持っている（または持っていると思われる）3種類のデータを3次元の空間上にプロットすることでデータの傾向を視覚的に予測するのに有効

3次元の散布図を描画するにはscatter3D()メソッド使い、引数に、x軸、y軸、z軸に対応する位置データを指定する。

```Python
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
z = np.random.randn(1000)

# Figureオブジェクトを作成
fig = plt.figure(figsize=(6, 6))
# サブプロットaxを追加
ax = fig.add_subplot(1,1,1, projection="3d")

# 3D散布図を作成してください
ax.scatter3D(x, y, z)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3100685/fa3e0ee4-cb04-0459-9c87-f38ce5c702d5.png)

**3Dグラフにカラーマップを適用する**
グラフの点がとる座標に応じて表示する色を変える機能を追加が可能
あらかじめmatplotlibからcmをimportし、データをプロットする際に
`plot_surface()`に`cmap=cm.coolwarm`を指定すると、z軸の値にカラーマップを適用する

```Python
from matplotlib import cm
# サブプロットが変数`ax`の場合
ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3100685/327de0fa-eb67-1796-280c-bc7904f73e53.png)