Pythonでヒストグラムを書く


ヒストグラムを描画したかったが分からなかったので調べました。

##環境
The version of the notebook server is: 5.4.0
Python 3.6.4 |Anaconda custom (64-bit)| [GCC 7.2.0]

##前置き
今回ランダムな値を使用するのでグラフの形が完全に一致することはありません。（正規分布に従った形にはなる）

##データ
***データは必ずSeriesかlistです。DataFrameでは変なヒストグラムになります。***

```python
# ランダムな値を生成するためnumpyをインポート
import numpy as np

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

また、DataFrameであった場合はSeriesかlistに変換します

```python
# ランダムな値を生成するためnumpyをインポート、DataFrameを作るためpandasをインポート
import pandas as pd
import numpy as np

# DataFrameでの平均 50, 標準偏差 10 の正規乱数を1,000件生成
dict =  {'score':np.random.normal(50, 10, 1000)}
df = pd.DataFrame.from_dict(dict)

# list、またはSeriesに変換
data = df['score'].tolist()
data = df.iloc[:,0]
```

DataFrameだとこのようなヒストグラムが出来上がります。
![スクリーンショット 2018-06-16 18.21.20.png](https://qiita-image-store.s3.amazonaws.com/0/256447/36319148-2754-4a93-5aea-5ba3199f0b89.png)

##描画する

### 最もシンプルな形

![スクリーンショット 2018-06-16 18.30.35.png](https://qiita-image-store.s3.amazonaws.com/0/256447/7b596fea-4038-f74e-928b-0172c8792ec0.png)

```python
# グラフ描画のためmatplotlibのpyplotをインポート
import matplotlib.pyplot as plt

# ヒストグラムを描画する
plt.hist(data);
```

参照：[matplotlibとは(Wikipedia)](https://ja.wikipedia.org/wiki/Matplotlib)

非常にシンプルです。あとはここに各要素を追加していきます。

### タイトルを追加する

![スクリーンショット 2018-06-16 19.18.57.png](https://qiita-image-store.s3.amazonaws.com/0/256447/d7e0c173-0188-c3f9-6493-0d0e6c70f997.png)


```python
# グラフ描画のためmatplotlibのpyplotをインポート
import matplotlib.pyplot as plt

# タイトル追加
plt.title('score')

# ヒストグラムを描画する
plt.hist(data);
```

### ラベルを追加する

![スクリーンショット 2018-06-16 19.17.56.png](https://qiita-image-store.s3.amazonaws.com/0/256447/ae892b07-3491-39ee-542c-0357ec188cb5.png)


```python
# グラフ描画のためmatplotlibのpyplotをインポート
import matplotlib.pyplot as plt

# タイトル追加
plt.title('score')

# x軸にscore、y軸にfreq
plt.xlabel('score')
plt.ylabel('freq')


# ヒストグラムを描画する
plt.hist(data);
```

### 表示の幅を変更する

![スクリーンショット 2018-06-16 19.20.52.png](https://qiita-image-store.s3.amazonaws.com/0/256447/d0254c52-ffc8-48f7-2e00-4326dcb2e8b8.png)

```python
# グラフ描画のためmatplotlibのpyplotをインポート
import matplotlib.pyplot as plt

# タイトル追加
plt.title('score')

# x軸にscore、y軸にfreq
plt.xlabel('score')
plt.ylabel('freq')


# ヒストグラムを描画する（表示する幅は50〜100）
plt.hist(data, range=(50, 100));
```

### 階級幅（棒の数）を変える

![スクリーンショット 2018-06-16 20.24.48.png](https://qiita-image-store.s3.amazonaws.com/0/256447/6047c044-93c4-f365-d375-ca22db4cbdec.png)

```python
# グラフ描画のためmatplotlibのpyplotをインポート
import matplotlib.pyplot as plt

# タイトル追加
plt.title('score')

# x軸にscore、y軸にfreq
plt.xlabel('score')
plt.ylabel('freq')

# ヒストグラムを描画する（表示する幅は50〜100）、階級数（棒の数）は20
plt.hist(data, range=(50, 100), bins=20);
```

### 目盛りを変更する

![スクリーンショット 2018-06-16 20.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/256447/62d2b7b9-3efb-b28f-9068-db18400b28eb.png)

```python
# グラフ描画のためmatplotlibのpyplotをインポート
import matplotlib.pyplot as plt

# タイトル追加
plt.title('score')

# x軸にscore、y軸にfreq
plt.xlabel('score')
plt.ylabel('freq')

# 目盛りを変更
plt.xticks([50,75,80,100]) 
plt.yticks([0,10,20,30,40,80,100])

# ヒストグラムを描画する（表示する幅は50〜100）、階級数（棒の数）は20
plt.hist(data, range=(50, 100), bins=20);
```

## 補足

このように簡単にヒストグラムを描画する事ができました。

しかし、これは全てPyplotがうまくやってくれているお陰です。
実際はPyplot関数が呼ばれた時に、内部的にFigureオブジェクトが作られていたり
Pyplotの関数からAxesオブジェクトを操作する事ができています。

FigureとAxesという概念についてはここでは詳しく触れませんが
下記のようにFigureとAxesを使って上記同様なヒストグラムを描画する事ができます。

```python
import matplotlib.pyplot as plt

# Figureのインスタンスを明示的に作成
fig = plt.figure()

# add_subplot()でFigureにaxesを追加
ax = fig.add_subplot(1, 1, 1)

# タイトル追加
ax.set_title('score')

# x軸にscore、y軸にfreq
ax.set_xlabel('score')
ax.set_ylabel('freq')

# 目盛りを変更
ax.set_xticks([50,75,80,100]) 
ax.set_yticks([0,10,20,30,40,80,100])

# ヒストグラムを描画する（表示する幅は50〜100）、階級数（棒の数）は20
plt.hist(data, range=(50, 100), bins=20);
```

##参照
http://bicycle1885.hatenablog.com/entry/2014/02/14/023734
http://ailaby.com/matplotlib_fig/