matplotlibの基本的なグラフ設定を列挙〜棒グラフと円グラフ〜

# はじめに
pythonでグラフを作成するときの定番は`matplotlib`ですが、設定項目が多いのでいちいち調べて使うのは大変です。
基本の使用方法を列挙して、すぐに使えるようにしておこうと思います。

# 参考

- https://www.tableau.com/about/blog/2016/7/colors-upgrade-tableau-10-56782
- https://pythondatascience.plavox.info/matplotlib/%E5%86%86%E3%82%B0%E3%83%A9%E3%83%95
- https://qiita.com/skotaro/items/5c9893d186ccd31f459d

# 環境
- Google colab
- matplotlib==3.0.2

# 手順
### 棒グラフ
棒グラフは`plt.bar`で表示できます。x軸に指定した値を中心として、デフォルト幅0.8の棒を表示します。

```python
import matplotlib.pyplot as plt

# 表示するデータ
Y = [4,15,8]
X = range(len(X))

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

# 棒グラフを中央寄せで表示
plt.bar(X, Y, align="center", width=0.8)

# グラフのラベル
plt.xticks(X, ['A','B','C'])

# XとYのラベル
plt.xlabel("x-axis label")
plt.ylabel("y-axis label")

# タイトル表示
plt.title('title', fontsize=15)

# グリッド線を表示
plt.grid(True)
```
<img width="618" alt="スクリーンショット 2018-12-13 0.24.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/81448872-07d3-39d0-0162-fac4372c314b.png">

`align`のパラメータを`edge`に変えると、xの値を左端にするように棒を表示します。
<img width="618" alt="スクリーンショット 2018-12-13 0.28.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/f0c6d71c-c17c-f85a-e68d-cd1cf8812409.png">

### 横向き棒グラフ
横向き棒グラフでは、棒グラフの`width`に相当するものは`height`になります。また、データXがy軸に並ぶので、データXのラベルをy軸ラベルにする必要があります。

```python
import matplotlib.pyplot as plt

# 表示するデータ
Y = [4,15,8]
X = range(len(Y))

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

# 棒グラフを中央寄せで表示
plt.barh(X, Y, align="center", height=0.8)

# グラフのラベル
plt.yticks(X, ['A','B','C']) # データXがy軸に表示されていることに注意

# XとYのラベル
plt.xlabel("x-axis label")
plt.ylabel("y-axis label")

# タイトル表示
plt.title('title', fontsize=15)

# グリッド線を表示
plt.grid(True)
```
<img width="618" alt="スクリーンショット 2018-12-13 0.31.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/3a637b07-fddb-3973-867a-b32a8211f390.png">

### グラフを複数表示

```python
import matplotlib.pyplot as plt
import numpy as np

Y1 = np.array([10,20,30])
Y2 = np.array([50,60,20])
Y3 = np.array([30,20,10])
N = 3 # y軸データの種類数

X = np.arange(len(Y1))

# 棒の幅
w = 0.8 / N

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

plt.bar(X, Y1, color='xkcd:sky blue', width=w, label='Kinoko', align="center")
plt.bar(X + w, Y2, color='xkcd:turquoise', width=w, label='Takenoko', align="center")
plt.bar(X + 2*w, Y3, color='xkcd:grey blue', width=w, label='Pokky', align="center")

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

# 棒のグループにラベル貼り付け
plt.xticks(X + (N-1)/2*w, ['Tokyo','Osaka','Nagoya'])

# XとYのラベル
plt.xlabel("City")
plt.ylabel("Love")

# タイトル表示
plt.title('Kinoko Takenoko War', fontsize=15)

# グリッド線を表示
plt.grid(True)
```
<img width="618" alt="スクリーンショット 2018-12-13 0.54.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/9d949597-0a57-671a-aba6-6e1bd7f7958e.png">

今回、棒の色は[xkcd color name survey](https://xkcd.com/color/rgb/)というのから選択しました。`xkcd:`の後に色名を指定すればその色に設定できます。ちなみに`color`を設定しない場合は自動で色を割り当ててくれます。

### 積み上げ棒グラフ
`bottom`に棒が始まる位置を指定できます。積み上げる位置を指定することで積み上げ棒グラフを作成できます。

```python
import matplotlib.pyplot as plt

# 表示するデータ
Y1 = [4,15,8]
Y2 = [10,2,4]
X = range(len(Y1))

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

# bottomに積み上げる位置を指定する。
plt.bar(X, Y1, align="center", label='AAA')
plt.bar(X, Y2, align="center", bottom=Y1, label='BBB')

# グラフそれぞれのレベル
plt.xticks(X, ['A','B','C']) # データXがy軸に表示されていることに注意

# XとYのラベル
plt.xlabel("x-axis label")
plt.ylabel("y-axis label")

# タイトル表示
plt.title('title', fontsize=15)

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

# グリッド線を表示
plt.grid(True)
```
<img width="618" alt="スクリーンショット 2018-12-13 1.03.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/1fefa40e-7e58-46f5-af17-0cf8963cb8db.png">

### 円グラフ

```python
import matplotlib.pyplot as plt

# 表示するデータ
data = [45, 30, 22, 10]

# データのラベル
labels = 'A', 'B', 'C', 'D'

# 色
cmap = plt.get_cmap('tab10') # Tableauの基本10色を使用
colors = [cmap(i) for i in range(len(data))]

# パーツの間隔
explode = (0.1, 0., 0., 0.) 

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

# startangleは開始する角度、counterclockは向きを指定、
# autopctは構成割合で少数点第一位まで表示、shadowはグラフを影付きにする
plt.pie(data, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90, counterclock=False)

# 真円で表示するためにアスペクト比を1対1にする
plt.axis('equal')
```
<img width="337" alt="スクリーンショット 2018-12-13 1.22.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/49dd4d5d-9c6f-530b-01c1-e5c17324d459.png">

今回は`cmap`で[Tableauと呼ばれるソフトウェアのカラーパレットを取得](https://qiita.com/skotaro/items/5c9893d186ccd31f459d)して、そこから色を指定してみました。

### バブルチャート
散布図をプロットし、点の大きさを調整することでバブルチャートにすることができます。

```python
import numpy as np
import matplotlib.pyplot as plt

# X,Y軸
x = [0.2, 0.1, 0.6, 0.3, 0.2, 0.9, 0.1, 0.3, 0.3, 0.7]
y = [0.5, 0.6, 0.1, 0.3, 0.9, 0.7, 0.4, 0.6, 0.3, 0.5]
data = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])

# color番号
colors = [cmap(i) for i in range(len(data))]

# バブルの大きさ
area = 10000 * np.pi * data**2

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

plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.grid(True)
```
<img width="878" alt="スクリーンショット 2018-12-13 1.38.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/50489c5e-2f4e-fd4f-5c27-f281a291a01e.png">