目的
機械学習やビッグデータの解析では,大量にある多次元データを様々な側面から見る必要がある.Pythonでは,様々なグラフを描画することができるmatplotlibモジュールを使用して,データを視覚化することが多い.ここでは,matplotlibを用いた折れ線グラフの作成方法を学ぶ.
説明
折れ線グラフの描画
まずは簡単な折れ線グラフを描画してみよう.
7行目から12行目で,4名の学生の5回分の3教科(英語・数学・国語)のテストの点数からなる3次元配列を作っている.4行目でmatplotlibパッケージのpyplotモジュールをインポートし,14行目で図を描画するためのfigureオブジェクトを作成し,figという名前をつけている.15行目でfigオブジェクトのadd_subplotメソッドを使用し,図を構成する主要な要素である軸(axes)オブジェクトを作成し,axという名前をつけている.
上の例では0番の学生の英語のテストの各回の点数を折れ線グラフで描画している.折れ線グラフを描画するには,横軸と縦軸のデータが必要になる.16行目で試験の回数分の整数値(0, 1, 2, 3, 4)からなる配列を作成し,これを横軸のデータxとしている.17行目で,axオブジェクトのplotメソッドを,横軸と縦軸のデータを引数で指定し呼び出し,折れ線グラフを作成している.18行目で,pyplotモジュールのshowメソッドを呼び出し,ウィンドウを生成し,折れ線グラフを表示している.
複数のデータを表す折れ線グラフ
次に,複数のデータを折れ線グラフとして表してみよう.0番の学生の3教科のテストの各回の点数を折れ線グラフとして表示するには,以下のようにすればよい.
17行目で英語の点数の折れ線グラフを,18行目で数学の折れ線グラフを,19行目で国語の折れ線グラフを作成している.
線の色の指定
折れ線グラフの色を指定するには,plotメソッドのキーワード引数colorを使用すればよい.
17行目で英語の折れ線を赤で,18行目で数学の折れ線を緑で,19行目で国語の折れ線を青で描画している.
デフォルトの色は’C0′, ‘C1’, ‘C2’のように指定することができる.
線のスタイルの指定
線のスタイルを指定するには, plotメソッドのキーワード引数linestyleを使用すればよい.
17行目から19行目のように,linestyleに’dashed’, ‘dashdot’, ‘dotted’を指定すると,以下のような折れ線が表示される.
凡例の表示
複数のデータを折れ線で表したグラフには,通常凡例(legend)をつける.凡例をつけるには,以下のようにすればよい.
17行目から19行目のように,plotメソッドのキーワード引数labelに凡例で表示する文字列(この例では3教科の名前)を指定し,20行目でaxオブジェクトのlegendメソッドを使用し,凡例を表示している.legendメソッドのキーワード引数locには凡例の位置(location)を指定できる.この例では,’best’と指定することで,ちょうど良い位置に凡例を表示している.
凡例を左上に表示したい場合には,キーワード引数locに’upper left’と指定すればよい.
軸ラベルの表示
折れ線グラフでは,横軸と縦軸が何を表すかを示すために,各軸にラベルをつけることが多い.軸ラベルを表示するには,以下のようにすればよい.
20行目のように,axオブジェクトのset_xlabelメソッドをラベルとして表示する文字列を引数として呼び出すと,x軸のラベルを表示することができる.また,21行目のようにset_ylabelメソッドを使用すれば,y軸のラベルを表示することができる.
表示範囲の指定
テストの点数が100点満点だとすると,グラフの縦軸の範囲(limit)を0点から100点としたいことがある.グラフに表示する範囲を指定するには,以下のようにすればよい.
22行目のように,axオブジェクトのset_ylimメソッドを,表示する範囲を表すタプルを引数として指定して呼び出すと,縦軸の範囲を指定することができる.
目盛りの指定
今回の例では,横軸は試験の回数であるため,連続値ではなく離散値である.横軸の目盛り(ticks)を離散値にするには以下のようにすればよい.
16行目で作成した配列xは0から4までの整数値からなる配列である.24行目のように,axオブジェクトのset_xticksメソッドを配列xを引数として呼び出すと,x軸の0から4までの整数値の位置に目盛りが表示される.
上の例では,試験の回数を表す横軸の目盛りのラベルが「0, 1, 2, 3, 4」となっている.この目盛りのラベルを「1, 2, 3, 4, 5」にしたければ,以下のようにすればよい.
25行目のようにaxオブジェクトのset_xticklabelsメソッドを使用すると,横軸の目盛りのラベルを「1, 2, 3, 4, 5」にすることができる.
図のタイトル
図やグラフにはタイトルをつけることが多い.折れ線グラフにタイトルをつけるには,以下のようにすればよい.
26行目のように,axオブジェクトのset_titleメソッドを,タイトルとして表示したい文字列を引数として呼び出すと,図のタイトルを表示することができる.
グリッド線の指定
グラフにグリッド線を表示するには,以下のようにすればよい.
27行目のように,axオブジェクトのgridメソッドを,キーワード引数colorに線の色を,linestyleに線のスタイルを指定して呼び出すと,グリッド線が表示される.
複数のグラフ(subplot)
縦に2分割
matplotlibでは1つのfigureオブジェクトに複数の描画領域(subplot)を作ることができる.描画領域を縦に2分割して,それぞれに折れ線グラフを表示するには,以下のようにすればよい.
figureオブジェクトのadd_subplotメソッドは,1つのfigureオブジェクトに描画領域を追加するメソッドである.17行目と30行目で2つの描画領域を追加し,それぞれに折れ線グラフを描画している.add_subplotメソッドの第1引数は縦方向の分割数を,第2引数は横方向の分割数を,第3引数はどの領域かを指定するための番号を意味する.この例では,縦に2分割し,横には分割しないため,第1引数と第2引数はそれぞれ2と1となる.17行目では第3引数に1を指定することで,2分割した1番目(上)の領域を指しており,30行目では第3引数に2を指定することで,2分割した2番目(下)の領域を指している.このようにすることで,上下に2分割してグラフを表示することができる.
以上の例では,図1の横軸のラベルと図2のタイトルが重なってしまっている.これを重ならないようにするには,例えば以下のようにすればよい.
43行目のように,pyplotモジュールのtight_layout関数を呼び出すと,複数のグラフの余白等のレイアウトを調整し,ラベルやタイトルが重ならないようにできる.
横に2分割
横に2分割してグラフを表示したいときには,以下のようにすればよい.
17行目と30行目のように,add_subplotメソッドの第1引数に1を,第2引数に2を指定すると,描画領域を横に2分割することができる.17行目で第3引数に1を指定することで,2分割した1番目(左)の領域に,30行目で第3引数に2を指定することで,2分割した2番目(右)の領域にそれぞれグラフを描画している.
4分割(縦横2分割)
表示領域を縦横に2分割して,4つのグラフを表示するには,以下のようにすればよい.
17, 30, 43, 56行目のように,add_subplotメソッドの第1引数に2を,第2引数に2を指定すると,描画領域を縦に2分割・横に2分割することができる.17行目で第3引数に1を指定することで,4分割した1番目(左上)の領域に,30行目で第3引数に2を指定することで,2分割した2番目(右上)の領域に,43行目で第3引数に3を指定することで,4分割した3番目(左下)の領域に,56行目で第3引数に4を指定することで,2分割した4番目(右下)の領域に,それぞれグラフを描画している.
図の大きさの指定
上の例のように,表示領域を4分割してグラフを表示すると,各グラフが小さくなってしまう.図の大きさを指定するには以下のようにすればよい.
14行目のように,figureオブジェクトを生成するときに,コンストラクタのキーワード引数figsizeで図の大きさを指定することができる.デフォルトでは横が6.4インチ,縦が4.8インチであるため,この例では,縦横2倍の大きさに設定している.
片対数グラフ
桁違いに大きい数や小さい数が混在しているデータを比較する際等には縦軸が対数である片対数グラフを描くことがある.まず,桁が異なる数を通常の折れ線グラフで描画してみよう.
8行目で平均50・標準偏差10の正規分布から5つの乱数を生成し,9行目から12行目で桁を変更している.これらの5つの数を折れ線グラフで描画すると,以下のようになる.
このグラフの縦軸を対数にするには,以下のようにすればよい.
20行目のように,axオブジェクトのset_yscaleメソッドを,’log’を引数として指定して呼び出すと,縦軸が対数スケールとなる.また,対数グラフの場合,主要なグリッド線と主要でないグリッド線のスタイルを変えて描くことがある.18,19行目のように記述すると,それぞれのグリッド線の色やスタイルを変更することができる.
関数のグラフ
次に,関数のグラフを描画してみよう.
8行目で横軸のデータを作っている.ここでは,0から2の間を100等分した数値を生成している.等分する数を増やせば滑らかな曲線を描画することができる.9行目で1次関数を,10行目で2次関数を,11行目で3次関数を描画している.
ファイルへの書き出し
描画したグラフや図をファイルに書き出すには,以下のようにすればよい.
28行目のように,pyplotモジュールのsavefig関数を,書き出すファイル名を引数で指定して呼び出すと,描画した図をファイルに書き出すことができる.
課題
課題0
4名の学生の5回分の3教科(英語・数学・国語)のテストの点数からなる配列から,0番の学生の英語の各回の点数を折れ線グラフで表せ.
課題1
4名の学生の5回分の3教科(英語・数学・国語)のテストの点数からなる配列から,0番の学生の3教科の各回の点数を折れ線グラフで表せ.
課題2
4名の学生の5回分の3教科(英語・数学・国語)のテストの点数からなる配列から,0番の学生の3教科の各回の点数を折れ線グラフで表せ.また,その他の3人の学生についても同様の折れ線グラフを描画し,4つのグラフを比較せよ.
課題3
4名の学生の5回分の3教科(英語・数学・国語)のテストの点数からなる配列から,0番の学生の3教科の各回の点数を折れ線グラフで表せ.また,その他の3人の学生についても同様の折れ線グラフを描画し,4つのグラフからなる図をファイルに書き出せ.
課題4
400名の学生の10回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列から,100番の学生の5教科の各回の点数を折れ線グラフで表せ.
課題5
400名の学生の10回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列から,0番の学生の5教科の各回の点数を折れ線グラフで表せ.また,100番の学生についても同様の折れ線グラフを描画し,2つのグラフを比較せよ.
課題6
400名の学生の10回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列から,0番の学生の5教科の各回の点数を折れ線グラフで表せ.また,100番・200番・300番の学生についても同様の折れ線グラフを描画し,4つのグラフを比較せよ.
課題7
400名の学生の10回分の5教科(英語・数学・国語・理科・社会)のテストの点数からなる配列から,0番の学生の5教科の各回の点数を折れ線グラフで表せ.また,100番・200番・300番の学生についても同様の折れ線グラフを描画し,4つのグラフからなる図をファイルに書き出せ.
課題8
y=2^x, y=3^x, y=4^xのグラフをxが0から10の範囲で描け.
課題9
y=2^x, y=3^x, y=4^xのグラフをy軸を対数スケールで描け.