Python初学者がmatplotlib.pyplotでヒストグラムを作ってみる

Pythonは覚えることが、とにかく多い（涙、と言うより毎日泣いている）

今回は備忘録として、matplotlib.pyplotでヒストグラムをいくつか作ってみました。

```ruby:qiita.rb
import numpy
import matplotlib.pyplot as plt
```

```ruby:qiita.rb
#適当にランダムなデータを作る。
#random.normalは「ランダムな正規分布」を作る。（平均,分散,件数）

data1 = numpy.random.normal(70, 10, 300)    
data2 = numpy.random.normal(20, 20, 300)
data3 = numpy.random.normal(50, 30, 300)
data4 = numpy.random.normal(98, 85, 300) 
```

##普通にグラフを描いてみる＆２つのグラフを重ねてみる。
ヒストグラムを描くときはコレ。

<b>ply.hist(データ,色,透明度）</b>

グラフのタイトルや軸の説明を設定し、表示する。
別のデータで重ねてヒストグラムを描く。
重ねるために色を変えて alpha で半透明にしている

```ruby:qiita.rb
plt.hist(data1, color='red', alpha=.5)  
plt.hist(data2, color='blue', alpha=.5) 

plt.title('histgram test')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.show()
```
<img width="576" alt="hist1.png" src="https://qiita-image-store.s3.amazonaws.com/0/241427/70d509d2-04b5-ac48-6a62-436e85801c4f.png">

##複数のグラフをレイアウトして並べてみる
複数のグラフを描くときはこれ。
<b>plt.figureメソッドのadd_subplot（行,列,位置）
histメソッドで（data）を与える。
axはaxis＝軸のこと。</b>

・サブプロット（グラフ）を作りレイアウトする 
 -> 3x3 分割の 1 番（左上）にグラフを置く
 ※ひとつ目だけ「色指定、半透明」にした。
・データを与えてヒストグラムを描く
・2つ目のグラフを作る
 -> 3x3 分割の左上から数えて６番目の場所にグラフを置く
・3x3 分割の左上から数えて8番目の場所にグラフを置く

```ruby:qiita.rb
fig = plt.figure()
ax1 = fig.add_subplot(3, 3, 1) 
ax1.hist(data1,color='red', alpha=.5) 
ax2 = fig.add_subplot(3, 3, 6)  
ax2.hist(data2)
ax3 = fig.add_subplot(3, 3, 8)  
ax3.hist(data3)
plt.show()
```
<img width="576" alt="hist2.png" src="https://qiita-image-store.s3.amazonaws.com/0/241427/b622badf-fb9f-c998-8aff-20f7e9fe0a64.png">

##縦横２つずつ、計４つのグラフを並べてみる
行列形式でグラフを配置
<b>plt.subplot（行,列）で形状指定
行列の指定位置にdataを置く。
axesはaxisの複数形で複数の軸＝2次元以上のこと。
また、pltではtitleがplt.titleで表現できるが、axesではaxes.set_titaleとsetが余計に入る点に注意。</b>

・[0,0] 左上にレイアウトされたグラフ
・[0,1] 右上（以下同文）
・[1,0] 左下（以下同文）
・[1,1] 右下（以下同文）

```ruby:qiita.rb
fig2, axes = plt.subplots(2, 2)
axes[0, 0].hist(data1)
axes[0, 0].set_title('data1')
axes[0, 1].hist(data2) 
axes[0, 1].set_title('data2')
axes[1, 0].hist(data3) 
axes[1, 0].set_title('data3')
axes[1, 1].hist(data4) 
axes[1, 1].set_title('data4')
plt.show()
```
<img width="576" alt="hist3.png" src="https://qiita-image-store.s3.amazonaws.com/0/241427/7458b9df-87e7-990f-fa0f-f34fccfed177.png">

なるほど、なるほど。
でも、これって敢えて行列形式で練習しているけど、さっきの配置指定でも可だよね。

```ruby:qiita.rb
fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1) 
ax1.hist(data1,color='red', alpha=.5) 
ax2 = fig.add_subplot(2, 2, 2)  
ax2.hist(data2)
ax3 = fig.add_subplot(2, 2, 3)  
ax3.hist(data3)
ax4 = fig.add_subplot(2, 2 ,4)
ax4.hist(data4)
plt.show()
```
<img width="576" alt="hist4.png" src="https://qiita-image-store.s3.amazonaws.com/0/241427/9c51700f-acb1-c635-b344-74745f678cf3.png">

うん、やっぱり同じ。よし！

##この例をループを使ってかっこつけてやってみる
<b>ループを使うのでデータはリストに入っている必要がある
data_list=[・・・]
注）fig.add_subplotのsubplotは単数形だが、fig3, axes2＝plt.subplotsは複数形</b>

・縦横２つずつのグラフが２次元配列に入っているが、ループで処理したいので１次元配列として（直列に）並べる。なるほど。
・ループでデータやタイトルをセットしていく

```ruby:qiita.rb
data_list = [data1, data2, data3, data4]    
fig3, axes2 = plt.subplots(2, 2)
ax = axes2.ravel()  

for i in range(4):
    ax[i].hist(data_list[i])
    ax[i].set_title('data' + str(i + 1))
    ax[i].set_xlabel('x axis')
    ax[i].set_ylabel('y axis')

plt.show()
```
<img width="576" alt="hist5.png" src="https://qiita-image-store.s3.amazonaws.com/0/241427/ffd447ba-79eb-bec8-787c-6b617b6306a8.png">

うん、うん同じ。なんとな～くわかってきた。