棒グラフの作成

目的

機械学習やビッグデータの解析では,大量にある多次元データを様々な側面から見る必要がある.ここでは,matplotlibを用いた棒グラフの作成方法を学ぶ.

説明

棒グラフの描画

まずは簡単な棒グラフを描画してみよう.

7行目から12行目で,4名の学生の3回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる3次元配列を作っている.この例では,全学生・全ての回の点数の平均を科目ごとに求め,棒グラフとして表示している.14行目で科目ごとの平均を求め,15行目で横軸のデータを作成している.19行目のように,axオブジェクトのbarメソッドを,横軸と縦軸のデータを引数として指定して呼び出すと,棒グラフが作成される.

色の指定

棒グラフの色を指定するには,barメソッドのキーワード引数colorを使用すればよい.

枠線の色の指定

棒グラフの枠線の色を指定するには,barメソッドのキーワード引数edgecolorを使用すればよい.

軸ラベル・目盛りの指定

軸ラベルと目盛りの指定の仕方は折れ線グラフと同様である.

20,21行目で横軸の目盛りを,22,23行目で各軸のラベルを指定している.

軸の目盛りに表示する文字列は回転させることができる.

21行目のように,set_xticklabelsメソッドのキーワード引数rotationで回転角度を指定すれば,横軸の目盛りの文字列を回転させることができる.文字列が図からはみ出る場合には,24行目のようにレイアウトを調整すればよい.

エラーバーの表示

以上の例では各科目のテストの点数の平均点を棒グラフで表した.このような場合,データの散らばりを表す標準偏差や最大値最小値からなるデータの範囲をエラーバーとして示すことがある.エラーバーを表示するには,以下のようにすればよい.

15行目で各科目のテストの点数の標準偏差を求め,20行目でbarメソッドのキーワード引数yerrに標準偏差のデータを指定している.

エラーバーの色を指定するには,barメソッドのキーワード引数ecolorに色を,エラーバーの上下に横線を表示する場合には,キーワード引数capsizeに横線の長さを指定すればよい.

図のタイトル

図のタイトルの指定方法は折れ線グラフのときと同様である.

グリッド線の指定

棒グラフにグリッド線を表示するには,以下のようにすればよい.

26行目のように記述すると,黒の点線でグリッド線を表示することができる.棒グラフの場合には,横方向のグリッド線だけを表示したいことがある.そのような場合には,キーワード引数axisに’y’を指定すればよい.また,デフォルトではグリッド線が棒グラフの手前に表示されるため,グリッド線を後ろに表示したい場合には,27行目のように記述すればよい.

複数のデータからなる棒グラフ

以上の例では,科目間のテストの点数を比較するための棒グラフを描画した.科目ごとに4名の学生のテストの点数を比較するための棒グラフを作成してみよう.

14,15行目で各科目・各学生に対して3回のテストの平均点と標準偏差を求めている.22行目から25行目までで,4名の学生それぞれに対して棒グラフを作成している.これまでとの違いは,棒グラフの幅を狭くし,描画する位置を水平方向に少しずつずらしている点である.20行目で4本のグラフの幅を,21行目で1本のグラフの幅を求めている.22行目から25行目のように,barメソッドのキーワード引数widthに各グラフの幅を指定している.また,22行目では水平方向の位置を「x + 0 * w」と,23行目では「x + 1 * w」と,24行目では「x + 2 * w」と,24行目では「x + 3 * w」と,各グラフの幅だけずらしながら描画している.

上の例では,青い棒グラフの中央に横軸の目盛りが振られている.これを中央(オレンジと緑の境目)に表示するには,4本のグラフの水平位置を,1本のグラフの幅の半分だけ右にずらし,4本のグラフの幅の半分だけ左にずらせばよい.例えば以下のように記述すると,目盛りを中央に配置することができる.

凡例の表示

複数のデータからなる棒グラフでは,どの棒グラフが何のデータを表すかを示す凡例を表示する必要がある.凡例を表示する方法は折れ線グラフのときとほぼ同じである.

22行目から25行目のように,barメソッドのキーワード引数labelに凡例として表示する文字列を指定し,30行目のように記述することで,凡例を表示することができる.

積み上げ棒グラフ

複数のデータを扱う際に,あるデータ中の比率や割合を,他のデータと比較したいことがある.そのような場合に積み上げ棒グラフを使用することがある.ここでは,ある学生の5教科の平均点の割合を,他の学生と比較するための積み上げ棒グラフを描画してみよう.

19行目で英語のテストの点数の棒グラフを描画し,20行目で数学の棒グラフを描画している.その際,barメソッドのキーワード引数bottomに英語の点数を指定することにより,英語の点数のグラフの上に数学のグラフを表示している.同様に,21行目から23行目のように記述すると,国語・理科・社会のグラフを積み上げることができる.

以上の例では,bottomの値を求める処理が冗長であった.numpyモジュールのcumsum関数を使用すると,累積和(cumulative sum)を求めることができる.

15行目で平均値の(科目方向の)累積和を求め,16行目で表示している.結果は以下のようになり,科目方向の累積和が求められていることがわかる.22行目から25行目のように記述することで,簡潔な記述で積み上げ棒グラフを描画することができる.

水平方向の棒グラフ

ここまでの例では,垂直方向の棒グラフを描画した.ここでは,水平方向の棒グラフを描画してみよう.

複数データに対する棒グラフ

複数データに対する棒グラフを水平方向に描画するには,以下のように記述すればよい.barメソッドがbarhメソッドに変わり,x座標やy座標をあらわすx, yが逆転し,width等がheight等となる他は,垂直方向のときと同様である.

積み上げ棒グラフ

積み上げ棒グラフを水平方向に描画するには,以下のように記述すればよい.barメソッドがbarhメソッドに変わり,x座標やy座標をあらわすx, yが逆転し,bottomがleftになる他は,垂直方向のときと同様である.

対数棒グラフ

折れ線グラフのときと同様に,桁が異なるデータどうしを比較する際に,縦軸が対数スケールの棒グラフを描画することがある.まず,桁が異なるデータを通常の棒グラフで表示してみよう.

7行目から12行目で桁が異なる5つの数値からなる配列を作り,それを棒グラフで表示している.実行結果は以下のようになり,小さい数値同士の大小関係がわかりづらくなっている.

縦軸を対数スケールとして表示するには,barメソッドのキーワード引数logにTrueを指定すればよい.

実行結果は以下のようになり,0番の数値が1番の数値より大きいことが確認できる.

ヒストグラムの作成

データの階級ごとの分布を視覚化したいときにヒストグラムを作成することがある.ここでは,3000人の学生のテストの点数の分布をヒストグラムで表してみよう.

6行目から8行目で,平均60・標準偏差10の正規分布から,3000人分のテストの点数からなる配列を生成している.12行目のように,axオブジェクトのhistメソッドを使用すると,最小値から最大値の区間を10等分した階級でヒストグラムを作成することができる.

範囲の指定

テストの点数が100点満点だとし,0点から100点を10等分した階級でヒストグラムを作成してみよう.

12行目のように,histメソッドのキーワード引数rangeでヒストグラムを求める範囲をタプルで指定することができる.

バーと枠線の色の指定

ヒストグラムのバーと枠線の色を指定する方法は,棒グラフのときと同様である.

階級の数の指定

ヒストグラムの階級(bins)の数を指定するには,histメソッドのキーワード引数binsを使用すればよい.

比率として表示

ヒストグラムの縦軸を数ではなく,比率として表示したいことがある.縦軸を比率にするには,histメソッドのキーワード引数densityにTrueを指定すればよい.

累積表示

ヒストグラムを累積して表示したいことがある.そのような場合には,histメソッドのキーワード引数cumulativeにTrueを指定すればよい.

課題

課題0

4名の学生の3回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列を作成し,全学生・全ての回の平均と標準偏差を科目ごとに求め,棒クラフとして表わせ.

課題1

4名の学生の3回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列を作成し,英語のテストの各学生の平均点と標準偏差を棒グラフで表し,それを科目数分描画せよ.

課題2

4名の学生の3回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列を作成し,学生0の5教科の平均点を積み上げ棒グラフで表し,それを学生数分描画せよ.

課題3

4名の学生の3回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列を作成し,全学生・全ての回の平均と標準偏差を科目ごとに求め,水平方向の棒クラフとして表せ.

課題4

4名の学生の3回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列を作成し,英語のテストの各学生の平均点と標準偏差を水平方向の棒グラフで表し,それを科目数分描画せよ.

課題5

4名の学生の3回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列を作成し,学生0の5教科の平均点を水平方向の積み上げ棒グラフで表し,それを学生数分描画せよ.

課題6

桁違いに大きい数値が混ざっているデータを作成し,縦軸が対数スケールの棒グラフとして表示せよ.

課題7

3000人のテストの点数からなる配列を作成し,20点ごとのヒストグラムとして表せ.

課題8

1万人の身長からなる配列を作成し,5cmごとのヒストグラムとして表わせ.ただし,縦軸を比率とせよ.

課題9

1万人の身長からなる配列を作成し,5cmごとの累積ヒストグラムとして表せ.