matplotlibについて (2)棒グラフ・円グラフ・ヒストグラム

[前回](https://qiita.com/yuta_rug/items/884b91fe110b29eb5c47)は散布図・折れ線図について書いたので今回は棒グラフ・円グラフ・ヒストグラムについて書こうと思います。
グラフの基本設定については[前回](https://qiita.com/yuta_rug/items/884b91fe110b29eb5c47)の投稿を読んでください

#棒グラフ(bar)
基本的なものは以下の通り

```python:bar_1.py
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [10, 40, 70, 20, 55]

plt.bar(x, y1, width=0.5, color="blue")

plt.title("Bar graph")
plt.xlabel("x")
plt.ylabel("Y")
plt.show()
```
width(=0~1, デフォルトは0.8)を指定すると棒の太さが変化する.
colorは見ての通り色の指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/f4600122-1904-808a-bbae-337b6c9b2407.png)
少しカスタマイズしてみましょう

```python:bar_2.py
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [10, 40, 70, 20, 55]
y2 = [30, 40, 50, 20, 70]
label = ["first", "second", "third", "forth", "fifth"]

plt.bar(x, y1, tick_label=label, color="green", label="class1")
plt.bar(x, y2, tick_label=label, bottom=y1, color="orange", label="class2")

plt.title("Bar graph")
plt.xlabel("x")
plt.ylabel("Y")
plt.legend()
plt.show()
```
bottom=で指定してやることでその指定した分を空けて描画することができる。結果積み重なるグラフを描く事ができる。
この場合でいうとy1の棒グラフを書き、その後y1分空けたところにy2のグラフを描くということで結果y1の上にy2の乗ったグラフを描くことになる。
tick_label=で指定するとx座標に数字ではなく文字列を貼ることができる。
実行結果が下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/4a550a89-0a4e-f2ca-a659-b911b93656b7.png)

```python:bar_3.py
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [10, 40, 70, 20, 55]
y2 = [30, 40, 50, 20, 70]
label = ["first", "second", "third", "forth", "fifth"]

plt.barh(x, y1, tick_label=label, color="green", label="class1")
plt.barh(x, y2, tick_label=label, left=y1, color="orange", label="class2")

plt.title("Bar graph")
plt.xlabel("x")
plt.ylabel("Y")
plt.legend()
plt.show()
```
また、上のコードのようにplt.bar()ではなくplt.bar()で描画すると横向きの棒グラフを描くことができる
このとき、bar()関数ではbottom=で積み重ねを指定していたのがbarh()関数ではleft=で指定することに注意が必要
グラフの形状をイメージしていただけるとなぜleft=なのかわかると思います
実行結果が下のようになるはず
また、上からではなく下から順番にグラフが作られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/f5d83780-4d16-db6d-b11c-9d757c0ebd52.png)

#円グラフ(pie)
次に円グラフの描画

```python:pie.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label)
plt.show()
```
実行するともしかしたら以下のように楕円で表示されるかもしれない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/e852e77b-efbb-626d-9200-41b41ee0aa4c.png)
これを防ぐには、以下のようにplt.axis("equal")を追加する

```python:pie_2.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label)
plt.axis("equal")
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/5992a6a2-44f1-8fe4-9789-8b63d27ef315.png)
これを見てみると一番目の値が右から始まっている。
デフォルトでは反時計回り、頂点から右90度から始まる
頂点から時計回りに初めたいときは、以下のようにする

```python:pie_3.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label, counterclock=False, startangle=90)
plt.axis("equal")
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/d047bac7-1e48-5bc6-1801-598d9a5aface.png)

```python:pie_4.py
import matplotlib.pyplot as plt

x = [100, 200, 300, 400, 500]
label = ["first", "second", "third", "forth", "fifth"]

plt.pie(x, labels=label, counterclock=False, startangle=90, autopct="%.1f%%")
plt.axis("equal")
plt.show()
```
autopct=を指定することで割合を表示できる。上のコードの場合は小数点1桁までを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/61d1b34a-276b-27b5-fcb6-e51cebb39884.png)

#ヒストグラム(hist)
基本コードは以下の通り
今回はデータ作成のためにNumpyをインポートして使用している

```python:hist_1.py
import matplotlib.pyplot as plt
import numpy as np

# 平均50,標準偏差10の正規乱数を1000件生成
x = np.random.normal(50, 10, 1000)

plt.hist(x)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/73989ec6-2f42-b1f9-2233-7de7ed377c8e.png)
これだとビン(分布幅)ごとの区切りが無く見にくいので以下のようなコードにし変更する

```python:hist_2.py
import matplotlib.pyplot as plt
import numpy as np

# 平均50,標準偏差10の正規乱数を1000件生成
x = np.random.normal(50, 10, 1000)

plt.hist(x, ec="black")
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/5803dd92-e311-0bcd-52c3-3034b003da68.png)
デフォルトではビン数(分布の分割数)が10に設定されている
ビン数やビンの範囲を設定することもできる

```python:hist_3.py
import matplotlib.pyplot as plt
import numpy as np

# 平均50,標準偏差10の正規乱数を1000件生成
x = np.random.normal(50, 10, 1000)

plt.hist(x, ec="black", bins=20, range=(0, 100))

plt.xlim(0, 100)
plt.show()
```
bins=でビン数を指定、range=(min, max)で最小・最大値を定める
今回でいうと0~100でビン20個でヒストグラム作成をする
ただデータが平均50の標準偏差10なので0のビンも存在する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356598/14aa6a3a-40d1-7251-8d2b-2bdb454e05d6.png)