Python ヒストグラムの見た目を教科書のようにする

Matplotlib(グラフ描画ライブラリ)を用いたヒストグラムの描画

概要

Matplotlib を用いると,データから直接ヒストグラムを作成できます。
(データを数えて度数分布表を作る必要がないので便利です。)
教科書の例にあるような見た目のグラフにするために設定するパラメータをコード例で示します。

度数分布表のデータを元にグラフを作成する場合は,「Python 度数分布表をヒストグラムで表す - 勉強ボックス管理者ブログ」の記事を参考にしてください。

失敗例と完成イメージ

最低限のパラメータ指定で作成したグラフ(左)と,作りたい完成イメージ(右)です。

失敗例のコード

Pythonコード

import matplotlib.pyplot as plt

data = [21.9, 24.5, 23.4, 26.2, 15.3, 22.4, 21.8, 16.8,
        19.9, 19.1, 21.9, 25.9, 20.9, 18.8, 22.1, 20.0,
        15.0, 16.0, 22.2, 26.4, 26.0, 28.3, 18.7, 21.3,
        22.5, 25.0, 22.0, 26.1, 25.6, 25.7]
plt.hist(data, bins=5)

plt.title("東京の2018年4月の最高気温の傾向")
plt.xlabel("階級(℃)")
plt.ylabel("度数(日)")

plt.show()

グラフ描画結果

<修正したい点>

  • 階級が期待した幅になっていない
  • タイトル,軸ラベルの日本語が表示できない
  • 長方形の枠線を表示したい
  • 横線を表示したい

変更したコード

Pythonコード

import matplotlib.pyplot as plt

# 日本語を表示できるようにフォントを設定(Windows環境)
plt.rcParams["font.family"] = "Yu Gothic"

# gridの線がグラフより背面になるように設定
plt.rcParams["axes.axisbelow"] = True

data = [21.9, 24.5, 23.4, 26.2, 15.3, 22.4, 21.8, 16.8,
        19.9, 19.1, 21.9, 25.9, 20.9, 18.8, 22.1, 20.0,
        15.0, 16.0, 22.2, 26.4, 26.0, 28.3, 18.7, 21.3,
        22.5, 25.0, 22.0, 26.1, 25.6, 25.7]

# 階級の幅が3になるように指定
bins=range(15,31,3)
plt.hist(data, bins, color="lightskyblue", edgecolor="black")
# 横軸の目盛りを指定
plt.xticks(bins)

# 縦軸の範囲を指定
plt.ylim(0,12)
# gridの横線を追加
plt.grid(axis="y")

plt.title("東京の2018年4月の最高気温の傾向")
plt.xlabel("階級(℃)")
plt.ylabel("度数(日)")

plt.show()

グラフ描画結果

<変更点の説明>

階級が期待した幅になっていない

plt.hist()実行時のパラメータbinsをシーケンスで範囲を指定するようにしました。

plt.hist(data, bins=range(15,31,3))

 参考:range(開始, 終了, 増分)

次のコードでも同様の結果になりました。

plt.hist(data, bins=[15,18,21,24,27,30])

binsを5個,rangeで範囲を指定するコードでも階級の幅を3にできました。

plt.hist(data, bins=5,range=(15,30))

横軸に階級を表示するため,xticksでX軸の目盛りを指定しました。
上記の例ではbinsのシーケンスを再利用していますが,直接指定もできます。

plt.xticks([15,18,21,24,27,30])
タイトル,軸ラベルの日本語が表示できない

rcParamsの設定を変更して,日本語が表示できるフォントにしました。

plt.rcParams["font.family"] = "Yu Gothic"

(補足)次のような設定変更方法もあります。

import matplotlib
matplotlib.rc("font",**{"family":"Yu Gothic"})
長方形の枠線を表示したい

hist()のパラメータでedgecolorを指定しました。

plt.hist(data, bins, color="lightskyblue", edgecolor="black")
横線を表示したい

grid()で格子線が引けます。例では横軸だけにするためaxis="y"を指定しています。

plt.grid(axis="y")

グラフ描画時に,grid()の線がグラフの全面に表示されていたため,次の設定で背面に指定しました。

plt.rcParams["axes.axisbelow"] = True

(補足)グラフを前面に描画するために zorder を指定する方法もあります。

plt.hist(data, bins, color="lightskyblue", edgecolor="black", zorder=2)