次のヒストグラムは、ウィキペディア(Wikipedia)の「ヒストグラム」にあるモノです。
 この記事では、このヒストグラムと同じものを作成していきます。
 以下では、このヒストグラムを「ゴールのヒストグラム」と呼びます。

この記事を読めば、ヒストグラムを作成できるようになります。
本記事は次の構成で進めていきます。
本記事の内容
- Pythonでヒストグラムを作成するための環境
 - とりあえず、Pythonでヒストグラムを作成する
 - Matplotlibで作成したヒストグラムを調整する
 - Matplotlibで作成したグラフの表示(サイズ、余白、ラベル)を調整する
 
上記の項目に沿って、本記事の説明を行っていきます。
 まずは、この記事で用いた環境の説明からです。
Pythonでヒストグラムを作成するための環境
- Windows 10 Home (バージョン1909)※以下の説明は64bit前提
 - Python 3.7.3
 - NumPy 1.18.5
 - Matplotlib 3.2.1
 
Pythonの上記ライブラリは、すべてインストールする必要があります。
 インストールしていないライブラリは、以下のコマンドでインストール可能です。
pip install numpy pip install matplotlib
Matplotlibを日本語化対応する必要がある場合は、以下の記事をご覧ください。
 日本語が「□□□」と表示される場合は、対応の必要ありです。
とりあえず、Pythonでヒストグラムを作成する
「とりあえず」、Pythonで簡単にヒストグラムを作成しましょう。
 どれほど、簡単に作成できるのかを確認できます。
モジュールを読み込む
ヒストグラムを作成するために必要なモジュールをimportします。
 コードは以下。
import matplotlib.pyplot as plt
データを用意する
ウィキペディア日本語版の記事「ヒストグラム」ページへのアクセスデータです。
ウィキペディア日本語版の記事「ヒストグラム」ページへのアクセスデータです。
| 日 | 閲覧回数 | 日 | 閲覧回数 | 
| 1 | 78 | 16 | 625 | 
| 2 | 126 | 17 | 606 | 
| 3 | 156 | 18 | 483 | 
| 4 | 231 | 19 | 377 | 
| 5 | 215 | 20 | 370 | 
| 6 | 304 | 21 | 587 | 
| 7 | 484 | 22 | 667 | 
| 8 | 544 | 23 | 643 | 
| 9 | 566 | 24 | 756 | 
| 10 | 545 | 25 | 505 | 
| 11 | 478 | 26 | 436 | 
| 12 | 258 | 27 | 399 | 
| 13 | 225 | 28 | 611 | 
| 14 | 373 | 29 | 679 | 
| 15 | 620 | 30 | 575 | 
| 31 | 565 | 
リスト型(list型)のデータを用意します。
 30行前後のデータであるため、そのままコードに書きます。
 もっと行数の多いデータであれば、ファイルに保存して読み込む形を取ります。
# 対象データ
values = [78,126,156,231,215,304,484,544,566,545,478,258,225,373,620,
              625,606,483,377,370,587,667,643,756,505,436,399,611,679,575,565]
ヒストグラムを作成する
ヒストグラムを表示するのは、たったこれだけです。
 この1行で最低限のグラフを作成できます。
# グラフを作成 plt.hist(values)
グラフを画像ファイルに保存する
作成したグラフを画像ファイルに保存します。
 facecolorは、背景色です。
 何も指定しなければ、「白」となります。
# グラフを画像保存
plt.savefig("result.png", facecolor="white")
「とりあえず、Pythonでヒストグラムを作成する」のまとめ
ここまでコードをまとめます。
 コードは、わずか4行です。(コメント除く)
import matplotlib.pyplot as plt
# 対象データ
values = [78,126,156,231,215,304,484,544,566,545,478,258,225,373,620,
              625,606,483,377,370,587,667,643,756,505,436,399,611,679,575,565]
# グラフを表示
plt.hist(values)
# グラフを画像保存
plt.savefig("result.png", facecolor="white")
このプログラムの実行結果が、以下のグラフです。

とりあえず、Pythonでヒストグラムを作成できました。
簡単に作成できるということがわかったと思います。
では、次以降でこのヒストグラムをゴールのヒストグラムに寄せていきます。
Matplotlibで作成したヒストグラムを調整する
ゴールのヒストグラムに近づけていくために、必要な項目を洗い出しましょう。
- ビンを数を設定する
 - ビンの幅を設定する
 - ビンの色を設定する
 
ビンとは?
 以下の見たままです。

ビンを数を設定する
引数にbinsを追加。
 ゴールのヒストグラムを同じく8個に指定します。
plt.hist(values, bins=8)
この結果は以下。

ビンの数は、8個になりました。
 しかし、ゴールのヒストグラムとは、まだ形が異なりますね。
ビンの幅を設定する
ゴールのヒストグラムは、幅100ということです。
 同じように幅100で設定します。
 引数にrwidthを追加。
plt.hist(values, bins=8, rwidth=100)
この結果は以下。

まったく、変わりませんね。
ということは、デフォルトで100だったということになります。
ウィキペディア(Wikipedia)の「ヒストグラム」には、以下の表示があります。
 幅だけではなく、開始と終了も関係があるようです。
| 閲覧回数 | その回数を記録した日数 | 
| 0 – 99 | 1 | 
| 100 – 199 | 2 | 
| 200 – 299 | 4 | 
| 300 – 399 | 5 | 
| 400 – 499 | 4 | 
| 500 – 599 | 7 | 
| 600 – 699 | 7 | 
| 700 – 799 | 1 | 
開始は0、終了は800とグラフと表から読み取れます。
 これらは、rangeで設定可能です。
plt.hist(values, bins=8, rwidth=100, range=(0, 800))
結果は以下。

グラフの形が同じになりました。
ビンの色を設定する
colorで設定します。
 複数データセット(複数種類のビン)がある場合は、配列での指定となります。
plt.hist(values, bins=8, rwidth=100, range=(0, 800), color='#14AE67')
色を変更した結果は以下。

アウトラインがありませんので、追加します。
 以下のコードで設定します。
plt.hist(values, bins=8, rwidth=100, range=(0, 800), color='#14AE67',
         edgecolor='#000000', linestyle='solid', linewidth=1.0)
edgecolorでアウトラインの色を指定します。
linewidthにより、アウトラインの線の太さを指定することになります。
linestyleは、指定しなくても良いですが、念のため。
 なお、linestyleに設定できるのは以下。
| ‘-‘ or ‘solid’ | solid line | 
| ‘–‘ or ‘dashed’ | dashed line | 
| ‘-.’ or ‘dashdot’ | dash-dotted line | 
| ‘:’ or ‘dotted’ | dotted line | 
アウトラインを付けた結果は、以下。

Matplotlibで作成したグラフの表示(サイズ、余白、ラベル)を調整する
ヒストグラムだけのことではなく、Matplotlibで作成したグラフすべてに関連する内容となります。
 この内容の詳細に関しては、次のブログで詳細に説明しています。
そのため、本記事では詳細の説明は省きます。
 詳細を知りたい場合は、上の記事をご覧ください。
画像サイズを合わせる
ゴールのヒストグラムの画像サイズは、横557px・縦491pxです。
 対応するコードは以下。
# サイズ指定 fig = plt.figure(dpi=100, figsize=(5.57, 4.91))
x軸とy軸のラベルを設定する
ラベルを設定するコードは以下。
 y軸のラベルを移動させる処理も含めています。
ax = fig.add_subplot(111)
ax.yaxis.set_label_coords(-0.1, 0.4)
# ラベル設定
plt.xlabel("閲覧回数(回)", fontsize=13)
plt.ylabel("日\n数\n(日)", fontsize=13, rotation=0)
余白を調整する
ゴールのヒストグラムと同じような余白にします。
# 余白調整 plt.subplots_adjust(left=0.13, right=0.99, bottom=0.12, top=0.99)
グラフとy軸間のスペースを除去する

上図の赤線の部分です。
ここをなくすためには、表示位置の調整が必要です。
x軸の目盛表示は、0~850ぐらいですね。
 これは以下のコードで実現できます。
# グラフと枠線とのスペース除去 plt.xlim(0, 850)
上と右の枠線を非表示にする
下図の黄色の部分を非表示にします。

対応するコードは以下。
# 上・右の枠線を非表示 plt.gca().spines['right'].set_visible(False) plt.gca().spines['top'].set_visible(False)
Pythonでヒストグラムを作成する方法のまとめ
ここまでの対応を含めたコードは以下。
import matplotlib.pyplot as plt
# サイズ指定
fig = plt.figure(dpi=100, figsize=(5.57, 4.91))
ax = fig.add_subplot(111)
ax.yaxis.set_label_coords(-0.1, 0.4)
# 対象データ
values = [78,126,156,231,215,304,484,544,566,545,478,258,225,373,620,
               625,606,483,377,370,587,667,643,756,505,436,399,611,679,575,565]
# ラベル設定
plt.xlabel("閲覧回数(回)", fontsize=13)
plt.ylabel("日\n数\n(日)", fontsize=13, rotation=0)
# グラフと枠線とのスペース除去
plt.xlim(0, 850)
# グラフを作成
plt.hist(values, bins=8, rwidth=100, range=(0, 800), color='#14AE67',
         edgecolor='#000000', linestyle='solid', linewidth=1.0)
# 上・右の枠線を非表示
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
# 余白調整
plt.subplots_adjust(left=0.13, right=0.99, bottom=0.12, top=0.99)
# グラフを画像保存
plt.savefig("result.png", facecolor="white")
このコードの実行結果は以下。

ゴールのヒストグラムとほぼ同じ表示です。
これで完了と言ってもいいぐらいです。
でも、まだ一致できていない箇所が残っています。
- 英語のラベル表示
 - x軸・y軸の先頭が矢印
 - x軸の「0」が不要
 
英語のラベル表示
次の英語のラベル表示は未対応です。
 冗長過ぎるため、対応していません。
- Page Views(times)
 - Days
 
x軸・y軸の先頭が矢印
また、x軸・y軸の先頭を矢印にするのは、結構な大事のようです。
 そこまで重要なことではないため、今回は対応を見送ります。
 機会があれば、対応します。
x軸の「0」が不要

不細工な表示になっています。
 x軸のラベルを制御することで対応します。
# x軸の目盛指定 plt.xticks(xscale)
xscaleは、以下の値が設定されています。
[100 200 300 400 500 600 700 800]
最終的に出来上がったコードは以下です。
 途中でx軸の目盛設定のために計算処理を加えました。
 その影響で、importするモジュールが増えています。
import math
import numpy as np
import matplotlib.pyplot as plt
# サイズ指定
fig = plt.figure(dpi=100, figsize=(5.57, 4.91))
ax = fig.add_subplot(111)
ax.yaxis.set_label_coords(-0.1, 0.4)
# 対象データ
values = [78,126,156,231,215,304,484,544,566,545,478,258,225,373,620,
               625,606,483,377,370,587,667,643,756,505,436,399,611,679,575,565]
# x軸の目盛に関する処理
scale_num = 100
x_max = (math.ceil(max(values) / scale_num) + 1 ) * scale_num
xscale = np.arange(scale_num, x_max, scale_num)
# ラベル設定
plt.xlabel("閲覧回数(回)", fontsize=13)
plt.ylabel("日\n数\n(日)", fontsize=13, rotation=0)
# グラフと枠線とのスペース除去
plt.xlim(0, x_max - (scale_num/2))
# x軸の目盛指定
plt.xticks(xscale)
# グラフを作成
plt.hist(values, bins=8, rwidth=100, range=(0, 800), color='#14AE67',
         edgecolor='#000000', linestyle='solid', linewidth=1.0)
# 上・右の枠線を非表示
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
# 余白調整
plt.subplots_adjust(left=0.13, right=0.99, bottom=0.12, top=0.99)
# グラフを画像保存
plt.savefig("result.png", facecolor="white")
そして、最終的に出来上がったヒストグラムのグラフ画像は以下。

今度こそ、完了です。
  
  
  
  


