オレオレ流Python可視化 チートシート ※随時更新※

完全な備忘録です。
ある程度まとまったら見やすい形に編集しますが、それまでは殴り書きです。
ご容赦ください。

# import

```py
import matplotlib.pyplot as plt #Visulization
import seaborn as sns #Visulization
%matplotlib inline
```

# ヒストグラムを表示

```py
plt.hist(train['quality'], bins=12)
plt.title("quality_Histgram")
plt.xlabel('quality')
plt.ylabel('count')
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/67a7247a-eed2-4a01-6b54-60f8f6accbd3.png)

データの作成からやってみる

```py
random.seed(0)
plt.figure(figsize=(20, 6))
plt.hist(np.random.randn(10**5)*10 + 50, bins=60,range=(20,80))
plt.grid(True)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/9630a590-d1c2-21a1-e156-6bdaf1528c9c.png)

# 棒グラフ
## 2つのデータを比較したい場合
```py
plt.figure(figsize=(4,3),facecolor="white")

Y1 = np.array([30,10,40])
Y2 = np.array([10,50,90])

X = np.arange(len(Y1))
# X = [0 1 2]

# グラフの幅
w=0.4

# グラフの大きさ指定
plt.figure(figsize=(15, 6))

plt.bar(X, Y1, color='b', width=w, label='Math first', align="center")
plt.bar(X + w, Y2, color='g', width=w, label='Math final', align="center")

# 凡例を最適な位置に配置
plt.legend(loc="best")

plt.xticks(X + w/2, ['Class A','Class B','Class C'])
plt.grid(True)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/9572dcfe-1282-6bc5-8a98-7688482ccb5a.png)

## 積み上げ棒グラフ
```py
left = np.array([1, 2, 3, 4, 5])

height1 = np.array([100, 200, 300, 400, 500])
height2 = np.array([1000, 800, 600, 400, 200])

# グラフの大きさ指定
plt.figure(figsize=(15, 6))

p1 = plt.bar(left, height1, color="blue")
p2 = plt.bar(left, height2, bottom=height1, color="lightblue")

plt.legend((p1[0], p2[0]), ("Class 1", "Class 2"))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/f8ce1546-9b57-ebad-cff1-16003bcbc83d.png)

# 円グラフ

`explode`に設定する値によって、円からどの程度分離させるか設定できる

```py
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0)  # 円から切り離して表示させることが可能

# グラフの大きさ指定
plt.figure(figsize=(15, 6))

# startangleは各要素の出力を開始する角度を表す(反時計回りが正), 向きはcounterclockで指定可能
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/568a7102-3efb-40e5-68c2-82843b98381c.png)

# バブルチャート

```py
N = 25

# X,Y軸
x = np.random.rand(N)
y = np.random.rand(N)

# color番号
colors = np.random.rand(N)

# バブルの大きさ
area = 10 * np.pi * (15 * np.random.rand(N))**2

# グラフの大きさ指定
plt.figure(figsize=(15, 6))

plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.grid(True)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/0133b3c2-aaca-72da-0664-df0c9a9a5769.png)



# 散布図を表示

```py
#　シード値の固定
random.seed(0)
x = np.random.randn(50) # x軸のデータ
y = np.sin(x) + np.random.randn(50) # y軸のデータ
plt.figure(figsize=(16, 6)) # グラフの大きさ指定

# グラフの描写
plt.plot(x, y, "o")

#以下でも散布図が描ける
#plt.scatter(x, y)

# title
plt.title("Title Name")
# Xの座標名
plt.xlabel("X")
# Yの座標名
plt.ylabel("Y")

# gridの表示
plt.grid(True)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/f4196fb3-194a-c48e-c0e0-d89b503503f4.png)

連続した値を与えることで、曲線を描くことも可能

```py
# シード値の指定
np.random.seed(0)
# データの範囲
numpy_data_x = np.arange(1000)

# 乱数の発生と積み上げ
numpy_random_data_y = np.random.randn(1000).cumsum()

# グラフの大きさを指定
plt.figure(figsize=(20, 6))

# label=とlegendでラベルをつけることが可能
plt.plot(numpy_data_x,numpy_random_data_y,label="Label")
plt.legend()

plt.xlabel("X")
plt.ylabel("Y")
plt.grid(True)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/d53fb27e-314b-1de1-37b1-9b727e70f87f.png)

# 関数グラフの描画
下記関数をグラフにプロットする

```math
f(x) = x^2 + 2x +1
```

```py
# 関数の定義
def sample_function(x):
    return (x**2 + 2*x + 1)

x = np.arange(-10, 10)
plt.figure(figsize=(20, 6))
plt.plot(x, sample_function(x)) 
plt.grid(True)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/2d4bf010-512c-a4b1-1bb8-b40e0fc69de5.png)




# ヒートマップを表示

```py
k = 13 # 表示する特徴量の数
corrmat = train.corr()
cols = corrmat.nlargest(k, 'quality').index # リストの最大値から順にk個の要素の添字(index)を取得
# df_train[cols].head()
cm = np.corrcoef(train[cols].values.T) # 相関関数行列を求める ※転置が必要
sns.set(font_scale=1.25)
f, ax = plt.subplots(figsize=(16, 12))
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 8}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/3ea386f8-a06e-07e2-ad25-2757345ea9de.png)

# 散布図をペアプロットする
```py
sns.set()
cols = ['quality', 'alcohol', 'citric.acid', 'free.sulfur.dioxide', 'sulphates', 'pH', 'total.sulfur.dioxide'] # プロットしたい特徴量
sns.pairplot(train[cols], size = 2.0)
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/7c4985c1-7e1f-19e0-79e6-6b717160ab93.png)



# 散布図とヒストグラムを同時に表示する

```py
sns.jointplot(x="quality", y="alcohol", data=train, ratio=3, color="r", size=6)
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/ac0fc098-fc70-8ccd-35f4-e71ba5927ade.png)

ちなみに、`joinplot`の引数は下記のようなものが存在する。

|変数      |説明|
|:-----------------|:-------|
|x, y              |データをベクトルで指定、または、データセットの列名を文字列で指定。|
|data	           |描画に用いるデータフレーム。出力対象の列名は上記 x と y で指定します。|
|kind	           |プロットの種類。以下から指定する。<br>"scatter" : 散布図<br>"reg": 散布図と回帰直線<br>"resid": y 軸に回帰直線からの残差 (誤差) を出力する<br>"kde": カーネル密度推定を用いた等高線風の図<br>"hex": 六角形のヒートマップ|
|stat_func         |散布図の右上に表示する統計量を計算する関数。入力パラメータは、(x, y) の 2 値であり、出力は (統計量, p 値) で構成される必要があります。|
|color             |各要素をプロットする際に用いる matplotlib の色名を指定。|
|size              |図のサイズを数値で指定。|
|ratio              |numeric, optional	Ratio of joint axes size to marginal axes height.|
|space              |散布図と散布図の外側に出力するヒストグラムの間の空きスペースの大きさを数値で指定する。|
|dropna              |True に設定すると、欠損値を乗り除きます。|
|xlim, ylim              |x軸、y軸の下限、上限をタプル (下限, 条件) で指定。|
|joint_kws, marginal_kws, annot_kws|プロットに用いる各種オプションをディクショナリで指定。|


# 決定木やランダムフォレストで使用された特徴量を可視化する

```py
def plot_feature_importance(model):
  n_features = X.shape[1]
  plt.barh(range(n_features), model.feature_importances_, align='center')
  plt.yticks(np.arange(n_features), X.columns)
  plt.xlabel('Feature importance')
  plt.ylabel('Feature')

# ※Xはtrain_test_splitで分割する前のtrainデータを想定
```

下記は使用例
ランダムフォレスト以外にも
`決定木:DecisionTreeClassifier`
`勾配ブースティング回帰木：GradientBoostingClassifier`
でも同じように利用できます。

```py
# ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(n_estimators=100, random_state=20181101) # n_estimatorsは構築する決定木の数
forest.fit(X_train, y_train)

# 表示
plot_feature_importance(forest)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/eacc3cf4-3ed6-a4db-cd5a-a0d05895fc5b.png)


# LightGBMで使用された特徴量を可視化する

```py
import lightgbm as lgb
# 可視化（modelはlightgbmで学習させたモデル）
lgb.plot_importance(model, figsize=(12, 8))
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193032/a32268a3-0c3a-7931-8f7f-092680acee4c.png)


可視化って素晴らしい！