Matplotlib グラフ活用の基礎⑵〜様々なグラフの出力と編集事例

# Matplotlib  
Matplotlibを活用したデータビジュアライゼーションの基礎を紹介します。
一見複雑そうなデータも、ビジュアル表現を活用することで思わぬ発見や構造を見つけることができます。


⑵では、主要なグラフの基礎的な出力方法を紹介します。
データの種類や分析の目的に応じたグラフの選択・活用能力が身につくかと思います。

⑴グラフの出力と編集 → https://qiita.com/ryo111/items/e9d01053df76c7b6b171
⑶複数のグラフを出力 → https://qiita.com/ryo111/items/dbf266a83b3029aa3a35
■デザイン関連まとめ【カラー・マーカー・スタイル】→ https://qiita.com/ryo111/items/c9b66d4f990c6749f39b

<img width="425" alt="Screen Shot 2019-01-29 at 21.51.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/e11dbe5a-63f1-57f7-4f35-151248343fa1.png">

**Matplotlibとは**
Pythonのグラフ描画ライブラリ、NumPyやpandasで作成・編集したデータのグラフ出力も可能。
機械学習やデーサイエンス分野で活用されています。
https://matplotlib.org/


###0.ライブラリのインポート

```py
import matplotlib.pyplot as plt
%matplotlib inline　 

# Numpyとpandasもインポート
import numpy as np
import pandas as pd
```

###1.折れ線グラフ

⑴の復習になります。

#### **■ グラフ出力　plt.plot(x, y)**

```py
#元データ作成
x = np.arange(1, 11)
y = np.array([200, 240, 300, 320, 290, 360, 410, 290, 320, 340])

#グラフの出力、設定
plt.plot(x, y, marker="o" , color="b")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show();
```
<img width="400" alt="Screen Shot 2019-01-30 at 19.38.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/d2698aea-5dfc-1adc-447e-cfa698f80636.png">

###2.棒グラフ

#### **■ グラフ出力　plt.bar(x, y)**
```py
#元データ作成
x = ["A", "B", "C", "D"]
y = [500, 400, 250, 350]

#グラフの出力
plt.bar(x, y)
plt.show();
```

<img width="389" alt="Screen Shot 2019-01-30 at 19.47.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/f4b61d64-71ab-2e87-5f70-5b052442befd.png">

#### **■ より編集されたグラフの出力**

```py
product = ["A", "B", "C", "D", "E", "F"]
store_A = [200, 210, 270, 90, 270, 300]
store_B = [410, 360, 400, 400, 460, 220]

plt.bar(product, store_A, color="b")
plt.bar(product, store_B, bottom=store_A, color="g") #bottom=で下側データを指定
plt.xlabel("product")
plt.ylabel("store_A, store_B")
plt.legend(("store_A", "store_B"))
plt.show()
```

<img width="401" alt="Screen Shot 2019-01-30 at 20.13.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/890f77a1-c01b-e518-4938-078b113b2363.png">

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

#### **■ グラフ出力**

```py
#元データ作成
np.random.seed(0)
x = np.random.randn(1000)

#グラフの出力
plt.hist(x)
plt.show();
```

<img width="379" alt="Screen Shot 2019-01-30 at 20.21.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/7bf8824a-5030-ac45-ddef-1c8b255d2a5e.png">

- ビン数変更

```py
np.random.seed(0)
x = np.random.randn(1000)

#ビン数指定
plt.hist(x, bins=30)
plt.show();
```

<img width="368" alt="Screen Shot 2019-01-30 at 20.42.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/b41f7314-6b1e-c2fc-56bd-b051c1bed453.png">

- 累積ヒストグラム

```py
np.random.seed(0)
x = np.random.randn(1000)

#累積ヒストグラムに変更
plt.hist(x, bins=30, cumulative=True)
plt.show();
```
<img width="381" alt="Screen Shot 2019-01-30 at 20.42.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/be9162f2-e813-917c-b8c4-890080adef0e.png">


#### **■ より編集されたグラフの出力**

```py
np.random.seed(0)
x = np.random.randn(10000)

plt.style.use('ggplot') #スタイル変更

# alphaで透明度を調節し色やラベルを追加
plt.hist(x-1, bins=50, alpha=0.3, histtype='stepfilled', color='m', label="A")
plt.hist(x+1, bins=50, alpha=0.5, histtype='stepfilled', color='g', label="B")
plt.legend()
plt.show();
```

<img width="390" alt="Screen Shot 2019-01-30 at 23.43.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/036f774f-2b30-88ef-b11c-7985d66a512d.png">


```py
np.random.seed(0)
x = np.random.normal(0, 20, 1000)
y = np.random.normal(0, 15, 1000)
z = np.random.normal(0, 10, 1000)
labels = ['x', 'y', 'z']

plt.style.use('ggplot')
plt.hist((x, y, z), label=labels)
plt.legend()
plt.show();
```

<img width="382" alt="Screen Shot 2019-01-30 at 23.41.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/658977be-4c0a-c305-6f59-dedf3d48d854.png">



###4.散布図　plt.scatter(x, y)

#### **■ グラフ出力**

```py
#元データ作成
np.random.seed(0)
#1から100までの数値をランダムに100個出力
x = np.random.randint(1, 101, 100)
y = np.random.randint(1, 101, 100) 


#グラフの出力 
plt.scatter(x, y)
plt.show();
```

<img width="371" alt="Screen Shot 2019-01-30 at 20.51.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/95df5781-d2f9-0057-59cd-63d445afc31c.png">

#### **■ より編集されたグラフの出力**


```py
np.random.seed(0)
x = np.random.randint(1, 101, 100)
y = np.random.randint(1, 101, 100)
z = np.random.randint(1, 101, 100) #第３の変数追加

# zの値を色の濃淡で表現するよう指定
plt.scatter(x, y, c=z, cmap="summer")

# カラーバーを表示
plt.colorbar()

plt.show();
```

<img width="341" alt="Screen Shot 2019-01-30 at 21.25.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/928c4ab4-6d60-96d0-c127-f77928d02962.png">



```py
np.random.seed(0)
x = np.random.randint(1, 101, 100)
y = np.random.randint(1, 101, 100)
z = np.random.randint(1, 101, 100)
z_2 = np.random.randint(1, 101, 100)

# z_2の値が各点の大きさで表現されるよう指定
plt.scatter(x, y, c=z, cmap="coolwarm", s=z_2)
plt.colorbar()
plt.show()
```

<img width="350" alt="Screen Shot 2019-01-30 at 22.43.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/fd97fa1c-e13f-8e8c-e28c-784fbbb4cc7e.png">



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

#### **■ グラフ出力**

```py
#元データ作成
x = [40, 30, 15, 10, 5]
labels = ["A", "B", "C", "D", "E"]

#グラフの出力
plt.pie(x, labels=labels)
plt.show();
```
<img width="210" alt="Screen Shot 2019-01-30 at 21.49.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/a4c65d1b-fe7c-5274-14dc-174f6bef0a60.png">


#### **■ より編集されたグラフの出力**

```py
x = [60, 20, 10, 5, 3, 2]
labels = ["Apple", "Orange", "Banana", "Grape", "Melon", "Cherry"]
explode = [0, 0, 0, 0.1, 0, 0.2]

plt.figure(figsize=(9, 6))
plt.style.use('ggplot') #スタイル変更
plt.pie(x, labels=labels, explode = explode, startangle=90,
        autopct=lambda p:'{:.1f}%'.format(p) if p>3 else '') #構成比を表示
plt.axis("equal", loc='left')
plt.legend()
plt.show()
```
<img width="438" alt="Screen Shot 2019-01-30 at 22.09.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/30bd4eac-23bb-c0ca-326a-86bbc7f0f2b9.png">

###4.箱ひげ図　plt.boxplot(x)

#### **■ グラフ出力**

```py
# データを生成
np.random.seed(0)
x = np.random.normal(0, 40, 1000)
y = np.random.normal(10, 50, 1000)
z = np.random.normal(40, 65, 1000)

#グラフの出力
labels = ['x', 'y', 'z']
plt.boxplot((x, y, z), labels=labels)
plt.show();
```
<img width="398" alt="Screen Shot 2019-01-30 at 23.53.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/094ef9e1-c0f1-418c-b455-5bfb5d73c761.png">

#### **■ より編集されたグラフの出力**

```py
fig.suptitle('four_graphs') #デザインを変更

x = [np.random.normal(0, a, 100) for a in range(11, 21)]

plt.boxplot(x,vert=True, patch_artist=True) #patch_artistでカラー表示設定

plt.grid(True) #グリッド追加

plt.show();
```
<img width="374" alt="Screen Shot 2019-02-01 at 13.40.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/278569/884f7309-bf78-1e8d-24f2-8d3e3e4ecb71.png">


⑶では複数のグラフの出力を紹介します。
　→　https://qiita.com/ryo111/items/dbf266a83b3029aa3a35