Pythonの「Matplotlib」は、データをグラフ形式で可視化するためのライブラリです。近年では、さまざまな場面で「データの利活用」が重要になっており、情報をわかりやすく示すことが求められています。しかし、Pythonでゼロからグラフを作成するのは困難です。
そこで役立つのが、今回ご紹介するMatplotlibです。Matplotlibを活用すると、データを用意してメソッドを呼び出すだけで、あらゆる形式のグラフを描画できます。代表的なグラフの作成方法や、各メソッドの使い方を理解しておけば、データの可視化に困ることはないでしょう。
この記事では、PythonのMatplotlibの使い方や応用テクニックについて解説します。サンプルコードも合わせてご紹介するので、ぜひ参考にしてみてください。
目次
「Matplotlib」とは、Pythonでグラフを描画するためのライブラリです。単純なソースコードを書くだけで、あらゆる種類・形状のグラフを描画できます。専門知識がなくても複雑なデータを可視化できることが魅力で、さまざまな分野で活用されています。
また、科学計算用のライブラリである「NumPy」と組み合わせて、算出したデータを可視化するために使用されることも多いです。PyQtやwxPythonなど、一般的なGUIライブラリで開発したアプリに、グラフの描画機能を搭載するためにも使えます。
なお、NumPyは数値計算を効率的に行うためのライブラリです。行列やベクトルの演算に長けているという特性は、高度な画像処理において有利に働きます。さらに、NumPyの内部はC言語で実装されているため、非常に高速な動作が可能なことも魅力です。そのため、データの解析結果をわかりやすく表示したい場合は、「MatplotlibとNumPyの活用が必須」といっても過言ではありません。
Matplotlibを活用すると、以下のようなグラフを表示できます。
「棒グラフ」は、データの大小を棒の「高さ」もしくは「長さ」で表すグラフです。主に2つ以上の値を比較したり、値の大きな項目・小さな項目を比較するために使います。たとえば先進各国のGDPを比較するときは、左側から順番にアメリカ・中国・日本・ドイツ・インドと並び、棒の高さで各国のGDPを比較できます。
「円グラフ」は、ひとつの円を扇形に分割し、その大きさで構成比率を表すグラフです。円グラフは、全体に占める各要素の割合を比較するために使います。たとえば、血液型の割合を比較したいときは、円が大きい順にA型・O型・B型・AB型と並び、それぞれの円の大きさを比較することでその割合が視覚的にわかります。
「折れ線グラフ」は、時系列ごとの連続的なデータの変化を表現するためのグラフです。横軸に年月といった時間を取り、縦軸にデータの値を取ることが一般的。折れ線グラフは、値の変化を視覚化するために使います。たとえば、日本のGDPの推移を比較するときは、横軸に年数・縦軸に各年のGDPを取ることでGDPの変化が理解できるでしょう。
「散布図」は、「点」でデータの量や大きさを示すグラフ。縦軸と横軸にそれぞれ異なる項目を取り、データが当てはまる場所に点を打つことが特徴です。散布図は、2つの量に関連性があるかどうかを調査するために使うものです。
たとえば、足の大きさと身長の関連性を調べたい場合は、一方の軸に足の大きさ・他方に身長を取り、対応する部分に点を打てば関連性がわかります。もし両者に関連性があるのなら、点が多く集まっている部分を線で結ぶと、右肩上がりのグラフが浮き彫りになります。
「ヒートマップ」は、色の濃淡でデータの強弱を表現するグラフです。データは縦軸と横軸の行列型になっており、その色によってデータのヒエラルキーがわかります。ヒートマップは、主にWebサイトのアクセス解析を行うために活用されています。たとえば、Webページにおけるユーザーの行動をヒートマップ化すれば「どの部分が多く読まれているか」を把握することが可能です。
「ヒストグラム」は、縦軸にデータの度数・横軸に階級を取る統計グラフです。ヒストグラムは、統計学や画像処理などの分野で、データの分布状況を視覚的に表現するために活用されています。たとえば、画像の「画素値」のヒストグラムを表示すると、「どの系統の色が多く使われているか」を把握できます。その情報を活用すれば、画像編集や加工がスムーズに行いやすくなるでしょう。
「極座標グラフ」は、円形のグリッド上にデータを表示するグラフ。極座標の大きな特徴は、原点からの距離と角度で平面上の点を示すことや、角度でデータの傾向を示すことです。たとえば、方向によるデータの変化量を示すなど、数学や統計の分野で極座標グラフが活用されています。
MatplotlibはPythonに標準で備わっている機能ではないため、使用前にあらかじめインストールしておく必要があります。まずは、Matplotlibとセットで使用することが多い「NumPy」をインストールするために、Pythonのアップデートを行いましょう。コマンドプロンプトを開いて、以下のPIPコマンドを入力してください。
py -m pip install –upgrade pip
上記のコマンドで、Pythonパッケージである「PIP」が最新バージョンにアップデートされると、次のように「Successfully installed pip」と表示されます。
そのうえで、以下のコマンドを入力すると、NumPyパッケージをインストールできます。
py -m pip install numpy
続いて、Matplotlibをインストールするために、以下のPIPコマンドを入力しましょう。
py -m pip install matplotlib
Matplotlibのインストールが完了すると、以下のような画面が表示されます。これで、Matplotlibが使えるようになります。
PythonのMatplotlibでグラフを表示するためには、matplotlibライブラリの「pyplotモジュール」に搭載されている、「plot()」と「show()」という関数を使用します。ここでは、以下の10個のポイントに分けて、基本的なグラフの描画方法について解説します。
1次関数のグラフは、plot()とshow()の2つの関数・メソッドを、以下の構文で使用することで表示できます。
# XとYのグラフをプロットする
pyplot.plot(x, y)
# 作成したグラフをウィンドウに表示する
pyplot.show()
plot()はデータをグラフにプロットし、show()はそのグラフを画面に表示するためのものです。ただし、XとYそれぞれの値を格納したデータ配列を、あらかじめ個別に作成しておく必要があります。本記事のサンプルコードでは、「numpy.linspace()関数」でX軸方向のデータを自動生成しています。
データ配列 = numpy.linspace(開始値, 終了値, データ数)
以上のようにすると、「開始値」から「終了値」までの値を「データ数」で分割した配列を作成できます。詳細は以下のサンプルプログラムのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 0から100までの数値を1000分割したデータを生成する x = numpy.linspace(0, 100, 1000) # Y座標はX座標の半分とする y = x * 0.5 # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
numpy.linspace()関数の引数を変更すると、さまざまな1次関数のグラフが作れます。たとえば、数値が減っていくようにするとグラフの形状が変わります。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 0から10までの数値を100分割したデータを生成する x = numpy.linspace(0, 10, 100) # Y座標はX座標の4分の1で、符号をマイナスとする y = x * -0.25 # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
2次関数のグラフも、基本的な部分は先ほどの1次関数と同じ手順で表示できるでしょう。ただし、2次関数になるようにするためには、Yの値は2乗値である必要があるので注意してください。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # -10から10までの数値を100分割したデータを生成する x = numpy.linspace(-10, 10, 100) # Y座標はX座標の2乗とする y = x * x # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
Yの符号を反転させると、以下のように逆向きのグラフとなります。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # -10から10までの数値を100分割したデータを生成する x = numpy.linspace(-10, 10, 100) # Y座標はX座標の2乗として、符号を反転させる y = x * x * -1 # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
3次関数のグラフの描画も、1次関数・2次関数とほとんど同じです。Yの値がXの3乗になるようなデータを作成し、グラフを描画すると以下のようになります。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # -10から10までの数値を100分割したデータを生成する x = numpy.linspace(-10, 10, 100) # Y座標はX座標の3乗とする y = x * x * x # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
Yの符号を反転させると、以下のように逆向きのグラフになります。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # -10から10までの数値を100分割したデータを生成する x = numpy.linspace(-10, 10, 100) # Y座標はX座標の3乗として、符号を反転させる y = x * x * x * -1 # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
三角関数のグラフも、Matplotlibなら簡単に描画できます。三角関数のデータをリストに格納し、plot()とshow()を呼び出せばOKです。三角関数には、主に「sin関数(正弦関数)」「cos関数(余弦関数)」「tan関数(正接関数)」の3種類があるため、それぞれの表示方法を解説します。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # 正弦関数とする y = numpy.sin(x) # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
cos関数(余弦関数)を表示するサンプルコードは、以下のとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # 余弦関数とする y = numpy.cos(x) # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
tan関数(正接関数)を表示するサンプルコードは、以下のとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # 正接関数とする y = numpy.tan(x) # ただし、そのままではおかしなグラフとなるため # Yの値が10を超えた場合は「numpy.inf(無限大)」にするようにする threshold = 10 y[y > threshold] = numpy.inf y[y < -threshold] = numpy.inf # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
なお、tan関数を描画するときは「一定以上の値を無限大にする処理」を加えなければ、以下のようにおかしなグラフになってしまうので注意が必要です。
以下の構文で「pyplot.bar()関数」を使用すると、棒グラフを表示できます。
pyplot.bar(棒グラフの位置データ, height = 棒グラフの高さデータ, tick_label = 棒グラフの項目名データ)
棒グラフの位置データは、基本的にはrange()関数で0から順番に並べれば問題ありません。ただし、要素数がデータ数と一致しなければ、エラーになるので注意が必要です。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 棒グラフの生成に必要な3種類のデータを準備する numbers = [i for i in range(0, 10)] # 棒グラフの位置 values = [random.randint(0, 100) for i in range(0, 10)] # 棒グラフの高さ labels = [str(i + 1) for i in range(0, 10)] # 棒グラフの項目名 # 棒グラフをプロットする pyplot.bar(numbers, height = values, tick_label = labels) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
円グラフを表示する場合は、「pyplot.pie()関数」を以下の構文で使用しましょう。
pyplot.pie(数値データ, labels = グラフの文字列, colors = グラフの色情報, explode = グラフのオフセット, autopct = “値のフォーマット”, counterclock = 反時計回りか)
ただし、pie()関数に引き渡すためのデータ・ラベル名・色情報などのデータを、あらかじめ作成しておく必要があります。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 割合を示すデータを生成する value = numpy.array([0.40, 0.30, 0.15, 0.10, 0.05]) # 各項目につけるラベルの文字列を設定する # ASCII文字のみ対応しており、日本語や中国語などのマルチバイト文字は不可 label = ["A", "B", "C", "D", "E"] # 各項目のグラフの色を指定する color = ["tomato", "lightgreen", "gold", "skyblue", "lightgray"] # 円グラフのオフセット値を設定する # 最も大きな要素を少しズラすと、目立たせることができる offset = [0.1, 0.0, 0.0, 0.0, 0.0] # 円グラフをプロットする # 第1引数は割合のデータ # 「labels引数」は要素の文字列 # 「colors引数」は色情報 # 「explode引数」はオフセット # 「autopct引数」は値の表示フォーマット # 「counterclock引数」は反時計回りかどうか pyplot.pie(value, labels = label, colors = color, explode = offset, autopct = "%1.1f%%", counterclock = False) # 綺麗な円グラフを描画するために軸を等しく設定する pyplot.axis("equal") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
pie()関数の「explode引数」と「counterclock引数」は省略できます。ただし、counterclock引数を省略すると、グラフが反時計回りになるので注意が必要です。「autopct引数」は、数値の表示桁数やパーセンテージ記号などの指定を行うためのものです。
なお、上記のサンプルプログラムではoffsetリストを設定し、1番大きな要素だけ少しズラすようにしています。このようにすると最大要素を目立たせることができるので、特定のデータをアピールしたいときにおすすめです。
なお、Matplotlibは基本的に「マルチバイト文字」に対応していないため、データなどに日本語を使うとエラーや文字化けが発生します。マルチバイト文字とは、日本語や中国語など複雑な文字を表示するためのコードです。Matplotlibはデフォルト設定の状態では、英数字のようなシングルバイト文字しか扱えないため、英数字を使うのが無難です。なお、Matplotlibで日本語を使う方法については後述します。
折れ線グラフを表示する場合も、グラフのプロットや表示などの部分はこれまでと同じです。今回は、range()関数で30個のX座標値を取得し、Y座標値をrandom.uniform()関数でランダムに設定しています。なお、XとYのデータ個数は、必ず同じでなければいけません。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 30個の数値データを生成する x = [i for i in range(0, 30)] y = [random.uniform(-100, 100) for i in range(0, 30)] # XとYのグラフをプロットする pyplot.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
散布図を表示する場合は、「pyplot.scatter()関数」を使用して、引数でxとyのデータを指定しましょう。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 0から10までの数値を100分割したデータを生成する x = numpy.linspace(0, 10, 100) # 100個の値をランダムに生成する y = numpy.random.randn(100) # 散布図を作成する pyplot.scatter(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
データの大きさを色で表すヒートマップは、「pyplot.pcolor()関数」で作成できます。ただし、ヒートマップのデータは縦横に並ぶ行列形式であるため、2次元リストを作成する必要があります。そのデータをpyplot.pcolor()関数に、以下の構文で引き渡せばヒートマップを作成可能です。その戻り値を、figure.colorbar()関数に渡すことで、ヒートマップの表示準備が整います。
ヒートマップデータ = pyplot.pcolor(2次元リストデータ, cmap = “カラーマップの種類”)
「cmap引数」には、多様な種類を指定できます。たとえば、「”Blues”」の場合は青系統、「”Greens”」だと緑系統になります。詳細は以下のサイトを参照してください。
https://matplotlib.org/stable/tutorials/colors/colormaps.html
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 縦と横のサイズを指定する x = 15 y = 10 # ヒートマップデータの2次元リストを確保する data = [] # forループを回して、2次元リストを作成する for i in range(y): temp = [] for j in range(x): # 100段階のランダムなデータを作成する temp.append(random.randint(0, 100)) data.append(temp) # figureオブジェクトを取得する figure = pyplot.figure() # ヒートマップを作成する color = pyplot.pcolor(data, cmap = "Blues") # データの色や大きさの凡例を示すカラーバーを表示する figure.colorbar(color) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
なお、colorbar()関数を呼び出すためには、事前に「pyplot.figure()関数」を呼び出し、figureオブジェクトを取得しておく必要があります。詳細は後述しますが、pyplot.figure()はグラフやプロットのさまざまな設定に活用できるので、慣れておきましょう。
ヒストグラムは「hist()関数」で表示します。「bins引数」を指定することで、グラフの分解能を調整できます。なお、今回は「numpy.random.normal()関数」を使用して、正規分布に従ったデータを使用します。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 正規分布(ガウス分布)の乱数を生成する # 第1引数は平均値 # 第2引数は標準偏差 # 第3引数は数値の数 x = numpy.random.normal(0, 10, 10000) # 数値データからヒストグラムを生成する # 「bins引数」はグラフの分割数を指定する pyplot.hist(x, bins = 50) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
正規分布(ガウス分布)とは、平均値の付近にデータが集積しているようなものを指します。上記のように、平均値である「0」を中心として、ほぼ左右対称になるようにデータの数が分布していることが特徴です。
より高度なグラフを作成するには、事前にfigureオブジェクトを取得したうえで、以下の構文で「add_subplot()関数」を呼び出してサブプロットを作成する必要があります。
figure.add_subplot(111)
add_subplot()の引数については後述しますが、現時点では「111」でOKです。以上の点を踏まえて、特殊なグラフの描画方法を以下の3つの観点から解説します。
左右に2つのY軸(縦軸)があるグラフは、「サブプロット」を使うことで描画できます。もう1つの縦軸は、1つ目のサブプロットオブジェクトの「twinx()関数」を呼び出し、作ることがポイントになります。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # figureオブジェクトを取得する # プロットの表示位置は自動調整する figure = pyplot.figure(figsize = (8, 5), tight_layout = True) # 2つのサブプロットを生成する # 2つ目のサブプロットはもう1つのY軸用 sub1 = figure.add_subplot(111) sub2 = sub1.twinx() # グラフのデータを生成する x = numpy.linspace(0, 10, 100) y1 = x y2 = x ** 2 # X軸とY軸それぞれの名称を設定する sub1.set_xlabel("x_value") sub1.set_ylabel("y = x") sub2.set_ylabel("$y = x^2$") # 2つのグラフをプロットする p1 = sub1.plot(x, y1, label = "y = x", color = "red", linewidth = 2, linestyle = "solid") p2 = sub2.plot(x, y2, label = "$y = x^2$", color = "blue", linewidth = 2, linestyle = "dashed") # グラフの凡例を表示する sub1.legend((p1[0], p2[0]), ("Data 1", "Data 2"), bbox_to_anchor = (1.1, 1.0), loc = "best") sub2.legend((p1[0], p2[0]), ("Data 1", "Data 2"), bbox_to_anchor = (1.1, 1.0), loc = "best") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
まず、figure.add_subplot()関数を呼び出すことで、1つ目のサブプロットオブジェクトを作成します。そのうえで、1つ目のオブジェクトにあるtwinx()を呼び出すと、もう1つの縦軸を表示するためのサブプロットオブジェクトを生成できます。
3次元のグラフを描画する場合は、add_subplot()関数の「projection引数」に「”3d”」を指定し、戻り値のサブプロットオブジェクトのplot関数を呼び出します。3次元グラフの描画方法について、以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 3次元のデータを作成する x = numpy.arange(-3.0, 3.0, 0.1) # 0.1間隔の等差数列を作成する y = numpy.arange(-3.0, 3.0, 0.1) # 0.1間隔の等差数列を作成する z = x ** 2 + y ** 2 # 両者の2乗値を足し合わせる # figureオブジェクトを取得する figure = pyplot.figure() # 3次元グラフに対応したサブプロットを生成する sub = figure.add_subplot(111, projection = "3d") # 3次元グラフを作成する sub.plot(x, y, z) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
前述したように、極座標グラフは「原点からの距離と角度でデータを表現するグラフ」のことです。極座標の描画方法は、add_subplot()関数の「projection引数」に「”polar”」を指定するだけです。詳細を以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # データ数を指定する num = 1000 # 極座標グラフのデータを生成する x = numpy.linspace(0, numpy.pi * 2, num) y = numpy.sin(x * 5) + numpy.random.normal(0, 0.1, num) # figureオブジェクトを取得する figure = pyplot.figure() # 極座標グラフに対応したサブプロットを生成する sub = figure.add_subplot(111, projection = "polar") # 極座標グラフを作成する sub.plot(x, y) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
極座標グラフは、データの中身や変化を工夫することで、上記のような幾何学模様を描画できることが魅力です。
Matplotlibでは、グラフの表示形式を細かく設定できます。本章では、Matplotlibの設定方法について、以下の12個のポイントから見ていきましょう。
グラフのサイズは、「pyplot.figure()関数」を以下の構文で使用すると設定できます。
pyplot.figure(figsize = (Xサイズ, Yサイズ))
「figsize引数」に、X方向・Y方向のサイズを指定しましょう。ただし、この部分には「実際のグラフのピクセルサイズ÷100」とすることが重要です。たとえば、グラフのサイズを800×500にしたい場合は、引数は「(8, 5)」となります。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # 正接関数とする y = numpy.tan(x) # ただし、そのままではおかしなグラフとなるため # Yの値が10を超えた場合は「numpy.inf(無限大)」にするようにする threshold = 10 y[y > threshold] = numpy.inf y[y < -threshold] = numpy.inf # グラフエリアのサイズを設定する pyplot.figure(figsize = (8, 5)) # XとYのグラフをプロットする # 「color引数」で線の色を設定 pyplot.plot(x, y, color = "blue") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
figsize引数の値を(5, 5)にすると、以下のような画面になります。グラフのサイズが小さすぎると、データが見づらくなってしまうので、適切なサイズに設定することが重要です。
グラフの色を変えたい場合は、pyplot.plot()関数の「color引数」を設定しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # 正接関数とする y = numpy.tan(x) # ただし、そのままではおかしなグラフとなるため # Yの値が10を超えた場合は「numpy.inf(無限大)」にするようにする threshold = 10 y[y > threshold] = numpy.inf y[y < -threshold] = numpy.inf # XとYのグラフをプロットする # 「color引数」で線の色を設定 pyplot.plot(x, y, color = "blue") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
pyplot.plot()のcolor引数を変更すれば、通常のグラフだけではなく散布図の色も変更できます。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 0から10までの数値を100分割したデータを生成する x = numpy.linspace(0, 10, 100) # 100個の値をランダムに生成する y = numpy.random.randn(100) # 散布図を作成する # 「color引数」で点の色を設定 pyplot.scatter(x, y, color = "blue") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
グラフの太さを変えたい場合は、pyplot.plot()関数の「linewidth引数」を設定しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # 正接関数とする y = numpy.tan(x) # ただし、そのままではおかしなグラフとなるため # Yの値が10を超えた場合は「numpy.inf(無限大)」にするようにする threshold = 10 y[y > threshold] = numpy.inf y[y < -threshold] = numpy.inf # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 pyplot.plot(x, y, color = "green", linewidth = 10) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
pyplot.plot()関数のlinewidth引数を変更すれば、通常のグラフだけではなく、散布図の太さも変更できます。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 0から10までの数値を100分割したデータを生成する x = numpy.linspace(0, 10, 100) # 100個の値をランダムに生成する y = numpy.random.randn(100) # 散布図を作成する # 「color引数」で点の色を設定 # 「linewidth引数」で点の太さを設定 pyplot.scatter(x, y, color = "blue", linewidth = 5) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
Matplotlibでは、グラフの線の種類を変更することもできます。その場合は、「pyplot.plot()関数」の「linestyle引数」に、表示形式の名称を指定しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # -10から10までの数値を100分割したデータを生成する x = numpy.linspace(-10, 10, 100) # Y座標はX座標の3乗とする y = x * x * x # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, color = "blue", linewidth = 1, linestyle = "dashed") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
上記のサンプルプログラムでは、linestyle引数を「”dashed”」にしたため、グラフが破線形式で表示されています。linestyleを「”dotted”」にすると、以下のように点の集まりに変更できます。linestyleには、以下の4種類を指定することが可能です。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # -2πから2πまでの数値を100分割したデータを生成する x = numpy.linspace(math.pi * -2, math.pi * 2, 100) # -10から10までの数値を100分割したデータを生成する x = numpy.linspace(-10, 10, 100) # Y座標はX座標の3乗とする y = x * x * x # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, color = "blue", linewidth = 1, linestyle = "dotted") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
グラフの各値をわかりやすく示すために、マーカーを表示することもできます。その場合は、pyplot.plot()関数で追加の引数を設定しましょう。「marker」でマーカーの形状、「markerfacecolor」でマーカーの色、「markersize」でマーカーのサイズを指定できます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 30個の数値データを生成する x = [i for i in range(0, 30)] y = [random.uniform(-100, 100) for i in range(0, 30)] # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, color = "blue", linewidth = 1, linestyle = "dashed", marker = "o", markerfacecolor = "green", markersize = 5) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
marker引数には、以下のような値を設定できます。設定内容によってマーカーの形状がまったく異なるため、さまざまなパターンを試してみましょう。
グラフのタイトルやX軸・Y軸の名称をつけたいときは、「title()」「xlabel()」「ylabel()」関数で簡単に設定できます。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 30個の数値データを生成する x = [i for i in range(0, 30)] y = [random.uniform(-100, 100) for i in range(0, 30)] # グラフのタイトルを設定する pyplot.title("Sample Graph") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("Number") pyplot.ylabel("Value") # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, color = "blue", linewidth = 1, linestyle = "dashed", marker = "o", markerfacecolor = "green", markersize = 5) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
グラフのX軸やY軸の値が大きい場合は、値が省略されて表示されてしまうことがあります。そこで、以下の構文でフォーマットを指定することで、正確な値が表示されます。
pyplot.gca().xaxis.set_major_formatter(pyplot.FormatStrFormatter(“フォーマット”))
pyplot.gca().yaxis.set_major_formatter(pyplot.FormatStrFormatter(“フォーマット”))
フォーマットは整数値が「%d」・浮動小数点値が「%f」となります。小数点以下を表示したい場合は、たとえば小数点以下2桁まで表示するのであれば「%.2f」としましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 棒グラフの生成に必要な3種類のデータを準備する numbers = [i for i in range(0, 10)] # 棒グラフの位置 values = [25346805, 19911593, 4912147, 4256540, 3534743, 3376003, 2936702, 2221218, 2058330, 1833274] # 棒グラフの高さ labels = ["USA", "China", "Japan", "Germany", "India", "UK", "France", "Canada", "Italy", "Brazil"] # 棒グラフの項目名 # グラフエリアのサイズとレイアウトを設定する pyplot.figure(figsize = (8, 5), tight_layout = True) # 棒グラフをプロットする pyplot.bar(numbers, height = values, tick_label = labels) # Y軸の値のフォーマットを設定する pyplot.gca().yaxis.set_major_formatter(pyplot.FormatStrFormatter("%d")) # グラフのタイトルを設定する pyplot.title("Top 10 GDP") # X軸のラベルを設定する pyplot.xlabel("Country") # Y軸のラベルを設定する pyplot.ylabel("GDP Million USD($)") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
フォーマットを指定しない場合は、以下のように省略されるため、データが見づらくなってしまいます。
グラフの各項目上部に値を表示したいときは、forループを回して、以下の構文で「pyplot.text()」関数を呼び出しましょう。
pyplot.text(ループカウンタ, データリスト[ループカウンタ], データリスト[ループカウンタ], ha = “center”)
ha引数を「”center”」とすることで、データの値が各項目の真上に表示されます。今回は一例として、世界のGDPトップ10をプロットするサンプルコードをご紹介しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 棒グラフの生成に必要な3種類のデータを準備する numbers = [i for i in range(0, 10)] # 棒グラフの位置 values = [25346805, 19911593, 4912147, 4256540, 3534743, 3376003, 2936702, 2221218, 2058330, 1833274] # 棒グラフの高さ labels = ["USA", "China", "Japan", "Germany", "India", "UK", "France", "Canada", "Italy", "Brazil"] # 棒グラフの項目名 # グラフエリアのサイズとレイアウトを設定する pyplot.figure(figsize = (8, 5), tight_layout = True) # 棒グラフをプロットする pyplot.bar(numbers, height = values, tick_label = labels) # 棒グラフ上部に値を表示する for i in range(0, len(labels)): pyplot.text(i, values[i], values[i], ha = "center") # Y軸の値のフォーマットを設定する pyplot.gca().yaxis.set_major_formatter(pyplot.FormatStrFormatter("%d")) # グラフのタイトルを設定する pyplot.title("Top 10 GDP") # X軸のラベルを設定する pyplot.xlabel("Country") # Y軸のラベルを設定する pyplot.ylabel("GDP Million USD($)") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
上記のように、グラフの真上にGDP値が表示されるため、データを視覚的に表現できます。ただし、pyplot.text()の「ha引数」を指定しなければ、以下のように値の表示がズレてしまうため注意が必要です。
Matplotlibの背景色は、「グラフエリア」と「プロットエリア」双方のものを設定できます。グラフエリアはグラフの外側で、プロットエリアは実際にグラフを描画する部分を指します。
グラフエリアの背景色は、「pyplot.figure()」関数のfacecolor引数で設定可能です。プロットエリアの背景色は、まずpyplot.axes()で軸オブジェクトを生成し、そのset_facecolor()を呼び出せば設定できます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 30個の数値データを生成する x = [i for i in range(0, 30)] y = [random.uniform(-100, 100) for i in range(0, 30)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue") # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("lightgray") # グラフのタイトルを設定する pyplot.title("Sample Graph") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("Number") pyplot.ylabel("Value") # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, color = "blue", linewidth = 1, linestyle = "dashed", marker = "o", markerfacecolor = "green", markersize = 5) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
「pyplot.xticks()」と「pyplot.yticks()」に、引数としてすべての目盛りを指定することで、グラフに目盛りを表示できるでしょう。ただし、手作業での作成は困難なので、以下のようにnumpy.linspace()関数を使用することをおすすめします。
pyplot.xticks(numpy.linspace(X目盛りの最小値, X目盛りの最大値, 目盛りの分割数))
pyplot.yticks(numpy.linspace(Y目盛りの最小値, Y目盛りの最大値, 目盛りの分割数))
グラフの目盛りを表示するサンプルコードを確認しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 30個の数値データを生成する x = [i for i in range(-15, 15)] y = [random.uniform(-100, 100) for i in range(0, 30)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue") # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("lightgray") # グラフのタイトルを設定する pyplot.title("Sample Graph") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("Number") pyplot.ylabel("Value") # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, color = "blue", linewidth = 1, linestyle = "dashed", marker = "o", markerfacecolor = "green", markersize = 5) # X軸とY軸の目盛りを設定する pyplot.xticks(numpy.linspace(-30, 30, 13)) pyplot.yticks(numpy.linspace(-150, 150, 11)) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
pyplot.grid()関数を呼び出すだけで、グラフに目盛りごとのグリッドを表示できます。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 30個の数値データを生成する x = [i for i in range(0, 30)] y = [random.uniform(-100, 100) for i in range(0, 30)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue") # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("lightgray") # グラフのタイトルを設定する pyplot.title("Sample Graph") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("Number") pyplot.ylabel("Value") # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, color = "blue", linewidth = 1, linestyle = "dashed", marker = "o", markerfacecolor = "green", markersize = 5) # グラフにグリッドを表示する pyplot.grid() # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
散布図では、点の大きさや色でデータを表現することもできます。通常、散布図はX軸とY軸の2つで表現しますが、もうひとつのデータを用意することがポイントです。そのうえで、pyplot.scatter()関数を以下の構文で使用します。
scatter = pyplot.scatter(X軸データ, Y軸データ, s = 点のサイズリスト, c = 色情報, cmap = “カラーマップ”, alpha = アルファ値)
通常の散布図とは異なり、さまざまな引数を追加します。こうすることで、通常の散布図よりも多くの情報を表現できるようになります。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 0から10までの数値を100分割したデータを生成する x = numpy.linspace(0, 10, 100) # 100個の値をランダムに生成する y = numpy.random.randn(100) # 100段階でデータのサイズをランダムに設定する # いわば3つ目のデータとなる z = numpy.random.randint(1, 100, 100) # figureオブジェクトを取得する figure = pyplot.figure() # 散布図を作成する scatter = pyplot.scatter(x, y, s = z * 10, c = z, cmap = "viridis", alpha = 0.5) # データの色や大きさの凡例を示すカラーバーを表示する figure.colorbar(scatter) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
Matplotlibには、複数のグラフや凡例を表示するための機能も備わっています。ここでは、わかりやすいグラフを作成するために重要な、以下の6つの応用テクニックをご紹介します。
複数のグラフを表示したいときは、plot()関数を2回呼び出すだけでOKです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 1つ目のデータを生成する x1 = [i for i in range(0, 10)] y1 = [random.uniform(-100, 100) for i in range(0, 10)] # 2つ目のデータを生成する x2 = [i for i in range(0, 10)] y2 = [random.uniform(-100, 100) for i in range(0, 10)] # 2つのグラフをプロットする pyplot.plot(x1, y1, color = "red", linewidth = 1, linestyle = "solid") pyplot.plot(x2, y2, color = "blue", linewidth = 1, linestyle = "dashed") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
グラフを表示するときは、「凡例」をつけるようにするとわかりやすくなります。凡例とは、各グラフがどのデータを示すものか示すためのものです。Matplotlibでは、plot()関数の「label引数」で名称を指定したあとで、pyplot.legend()関数を呼び出すことで凡例を表示できます。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # データを生成する x = [i for i in range(0, 10)] y = [random.uniform(-100, 100) for i in range(0, 10)] # グラフをプロットする # 凡例の名称は「Sample Data」とする pyplot.plot(x, y, label = "Sample Data", color = "red", linewidth = 1, linestyle = "solid") # グラフの凡例を表示する pyplot.legend() # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
凡例の表示は、複数のグラフを表示するときにより効果的です。複数のグラフを凡例つきで描画するためには、pyplot.legend()関数を以下の構文で使用する必要があります。
pyplot.legend((1つ目のプロット[0], 2つ目のプロット[0]), (“1つ目のグラフ名”, “2つ目のグラフ名”), loc = “凡例の表示位置”)
上記のように、プロットデータとグラフ名をタプル形式で並べ、「loc引数」で凡例の表示位置を指定すればOKです。たとえば、5つのグラフを描画する場合は、5つのデータとグラフ名を指定します。ただし、plot()関数を呼び出したときに、その戻り値を受け取っておく必要があるので注意してください。「loc引数」は、以下の11種類から選びます。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 1つ目のデータを生成する x1 = [i for i in range(0, 10)] y1 = [random.uniform(-100, 100) for i in range(0, 10)] # 2つ目のデータを生成する x2 = [i for i in range(0, 10)] y2 = [random.uniform(-100, 100) for i in range(0, 10)] # 2つのグラフをプロットする # この時点では凡例を指定しない p1 = pyplot.plot(x1, y1, color = "red", linewidth = 1, linestyle = "solid") p2 = pyplot.plot(x2, y2, color = "blue", linewidth = 1, linestyle = "dashed") # グラフの凡例を表示する pyplot.legend((p1[0], p2[0]), ("Data 1", "Data 2"), loc = "lower right") # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
凡例の表示方式は細かく設定できるのが魅力です。「pyplot.legend引数」に以下の引数を指定することで、表示形式や背景色などさまざまな要素を指定できます。
項目 | 概要 | 備考 |
---|---|---|
frameon | 凡例の枠をつけるか | Trueで枠をつける Falseで枠をつけない |
fancybox | 凡例の枠の角を丸めるか | Trueで角を丸める Falseで角を丸めない |
shadow | 凡例の枠に影をつけるか | Trueで影をつける Falseで影をつけない |
framealpha | 凡例のアルファチャンネル | 0.0~1.0の範囲で指定する 数値が大きいと不透明 小さいと半透明に近づく |
facecolor | 凡例の色を指定する | 文字列で色を指定する |
edgecolor | 凡例の枠の色を指定する | 色を文字列で指定する |
title | 凡例のタイトルを設定する | 任意の文字列を指定する |
title_fontsize | 凡例のフォントサイズを指定する | 数値でサイズを指定する |
凡例の設定方法について、以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 1つ目のデータを生成する x1 = [i for i in range(0, 10)] y1 = [random.uniform(-100, 100) for i in range(0, 10)] # 2つ目のデータを生成する x2 = [i for i in range(0, 10)] y2 = [random.uniform(-100, 100) for i in range(0, 10)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue") # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("white") # グラフのタイトルを設定する pyplot.title("Sample Graph") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("Number") pyplot.ylabel("Value") # 2つのグラフをプロットする # この時点では凡例を指定しない p1 = pyplot.plot(x1, y1, color = "red", linewidth = 1, linestyle = "solid") p2 = pyplot.plot(x2, y2, color = "blue", linewidth = 1, linestyle = "dashed") # グラフの凡例を表示する pyplot.legend((p1[0], p2[0]), ("Data 1", "Data 2"), loc = "lower right", frameon = True, fancybox = True, shadow = True, framealpha = 0.1, facecolor = "lightgray", edgecolor = "green", title = "Sample Legend", title_fontsize = 10) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
凡例がグラフ内部にあると、前述した方法でアルファ値を下げたとしても、データが見づらくなることがあります。そこで、凡例をグラフ外部に表示すると、データが見やすくなります。legend()関数の「bbox_to_anchor引数」に、オフセット値をタプル形式で指定することで、プロットの外側に凡例を表示可能です。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 1つ目のデータを生成する x1 = [i for i in range(0, 10)] y1 = [random.uniform(-100, 100) for i in range(0, 10)] # 2つ目のデータを生成する x2 = [i for i in range(0, 10)] y2 = [random.uniform(-100, 100) for i in range(0, 10)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue") # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("white") # グラフのタイトルを設定する pyplot.title("Sample Graph") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("Number") pyplot.ylabel("Value") # 2つのグラフをプロットする # この時点では凡例を指定しない p1 = pyplot.plot(x1, y1, color = "red", linewidth = 1, linestyle = "solid") p2 = pyplot.plot(x2, y2, color = "blue", linewidth = 1, linestyle = "dashed") # グラフの凡例を表示する # 「bbox_to_anchor引数」の値を調整することで、プロットの外側に凡例を表示できる pyplot.legend((p1[0], p2[0]), ("Data 1", "Data 2"), bbox_to_anchor = (1.0, 1.0), loc = "upper left", frameon = True, fancybox = True, shadow = True, framealpha = 0.1, facecolor = "lightgray", edgecolor = "green", title = "Sample Legend", title_fontsize = 10) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
上記のように外側に凡例を表示できますが、そのままではウィンドウからはみ出してしまっていることが問題です。そのため、次の項目で解説する手順を実行し、プロットのレイアウトを自動調整する必要があります。
figure()関数の「tight_layout引数」をTrueにすると、サブプロットの表示位置が自動調整されます。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 1つ目のデータを生成する x1 = [i for i in range(0, 10)] y1 = [random.uniform(-100, 100) for i in range(0, 10)] # 2つ目のデータを生成する x2 = [i for i in range(0, 10)] y2 = [random.uniform(-100, 100) for i in range(0, 10)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue", tight_layout = True) # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("white") # グラフのタイトルを設定する pyplot.title("Sample Graph") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("Number") pyplot.ylabel("Value") # 2つのグラフをプロットする # この時点では凡例を指定しない p1 = pyplot.plot(x1, y1, color = "red", linewidth = 1, linestyle = "solid") p2 = pyplot.plot(x2, y2, color = "blue", linewidth = 1, linestyle = "dashed") # グラフの凡例を表示する pyplot.legend((p1[0], p2[0]), ("Data 1", "Data 2"), bbox_to_anchor = (1.0, 1.0), loc = "upper left", frameon = True, fancybox = True, shadow = True, framealpha = 0.1, facecolor = "lightgray", edgecolor = "green", title = "Sample Legend", title_fontsize = 10) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
このように、プロットや凡例の位置が自動的に調整されて、ダブりのない見やすい画面となります。そのため、figure()関数のtight_layout引数は、基本的にTrueにしておくことをおすすめです。
Matplotlibでは、グラフだけではなくプロット自体を複数表示することもできます。複数のプロットを作成する方法について、以下の3つのポイントから解説しましょう。
複数のプロットを表示するためには、figureオブジェクトのadd_subplot()関数を呼び出し、各サブプロットのplot()関数でデータを設定する必要があります。figureオブジェクトは、先ほど紹介したpyplot.figure()関数の戻り値で取得できます。ただし、add_subplot()関数の引数が以下のように独特なので、利用時は注意が必要です。
figure.add_subplot(「Y軸方向のプロット数」「X軸方向のプロット数」「当該プロットの番号」)
たとえば、横方向に2つ・縦方向に1つのプロットを並べる場合は、figure.add_subplot()の引数は1つ目のプロットが「121」・2つ目のプロットが「122」となります。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 複数のプロットデータを準備する x1 = [i for i in range(0, 10)] y1 = [random.uniform(-100, 100) for i in range(0, 10)] x2 = [i for i in range(0, 10)] y2 = [random.uniform(-100, 100) for i in range(0, 10)] # figureオブジェクトを生成する # サブプロットを作成するために、figure()関数の呼び出しが必須 figure = pyplot.figure(figsize = (8, 5)) # 2つのサブプロットを作成する # 引数の並びは「Y軸方向のプロット数」「X軸方向のプロット数」「当該プロットの番号」 # 今回は横2個・縦1個の並びなので、上2桁は「12」となる sub1 = figure.add_subplot(121) # 1番目のプロットなので3桁目は「1」 sub2 = figure.add_subplot(122) # 2番目のプロットなので3桁目は「2」 # 各サブプロットにデータをセットする sub1.plot(x1, y1) sub2.plot(x2, y2) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
横に3つ・縦に2つ並べるなど、より多くのサブプロットを並べる場合は、以下のようにリストを活用するのが効率的です。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 複数のプロットデータを格納するためのリストを確保する x = [] y = [] sub = [] # figureオブジェクトを生成する # サブプロットを作成するために、figure()関数の呼び出しが必須 figure = pyplot.figure(figsize = (8, 5)) # forループを回してプロットデータとサブプロットを作成する for i in range(6): x.append([i for i in range(0, 10)]) y.append([random.uniform(-100, 100) for i in range(0, 10)]) sub.append(figure.add_subplot(230 + (i + 1))) # 各サブプロットにデータをセットする for i in range(6): sub[i].plot(x[i], y[i]) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
横に3つ・縦に2つ並べるので、add_subplotの引数の上2桁は「23」となります。3桁目に関しては、forループのカウンタを使用して自動的に設定しています。プロット数が大きくなるほど管理が難しくなるので、ぜひ参考にしてみてください。
それぞれのサブプロットに複数のグラフを表示したい場合は、各サブプロットのplot()関数を複数回呼び出しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 複数のプロットデータを格納するためのリストを確保する x1 = [] # 1つ目のデータのX座標 y1 = [] # 1つ目のデータのY座標 x2 = [] # 2つ目のデータのX座標 y2 = [] # 2つ目のデータのY座標 sub = [] # サブプロットのオブジェクト # figureオブジェクトを生成する # サブプロットを作成するために、figure()関数の呼び出しが必須 figure = pyplot.figure(figsize = (8, 5)) # forループを回してプロットデータとサブプロットを作成する for i in range(6): # 1つ目のデータを作成する x1.append([i for i in range(0, 10)]) y1.append([random.uniform(-100, 100) for i in range(0, 10)]) # 2つ目のデータを作成する x2.append([i for i in range(0, 10)]) y2.append([random.uniform(-100, 100) for i in range(0, 10)]) # サブプロットのオブジェクトを作成する sub.append(figure.add_subplot(230 + (i + 1))) # 各サブプロットにデータをセットする for i in range(6): # 1つ目のデータをプロットする sub[i].plot(x1[i], y1[i]) # 2つ目のデータをプロットする sub[i].plot(x2[i], y2[i]) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
サブプロットにタイトル・ラベル・凡例をつけるときは、各サブプロットオブジェクトの「set_title()」「set_xlabel()」「set_ylabel()」「legend()」を呼び出せばOKです。ただし、ダブりやはみ出しが多くなるので、前述した方法で調整する必要があります。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 複数のプロットデータを格納するためのリストを確保する x1 = [] # 1つ目のデータのX座標 y1 = [] # 1つ目のデータのY座標 x2 = [] # 2つ目のデータのX座標 y2 = [] # 2つ目のデータのY座標 sub = [] # サブプロットのオブジェクト # figureオブジェクトを生成する # サブプロットを作成するために、figure()関数の呼び出しが必須 figure = pyplot.figure(figsize = (12, 5), tight_layout = True) # forループを回してプロットデータとサブプロットを作成する for i in range(6): # 1つ目のデータを作成する x1.append([i for i in range(0, 10)]) y1.append([random.uniform(-100, 100) for i in range(0, 10)]) # 2つ目のデータを作成する x2.append([i for i in range(0, 10)]) y2.append([random.uniform(-100, 100) for i in range(0, 10)]) # サブプロットのオブジェクトを作成する sub.append(figure.add_subplot(230 + (i + 1))) # 各サブプロットにデータをセットする for i in range(6): # プロットにタイトルを設定する sub[i].set_title(f"Data{i + 1}") # X軸とY軸それぞれの名称を設定する sub[i].set_xlabel("Number") sub[i].set_ylabel("Value") # 1つ目のデータをプロットする p1 = sub[i].plot(x1[i], y1[i], color = "red", linewidth = 1, linestyle = "solid") # 2つ目のデータをプロットする p2 = sub[i].plot(x2[i], y2[i], color = "blue", linewidth = 1, linestyle = "dashed") # グラフの凡例を表示する sub[i].legend((p1[0], p2[0]), ("Data 1", "Data 2"), bbox_to_anchor = (1.0, 1.0), loc = "upper left", frameon = True, fancybox = True, shadow = True, framealpha = 1.0, facecolor = "skyblue", edgecolor = "blue", title = "Sample Legend", title_fontsize = 10) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
Matplotlibをより便利に使うために必要な、以下の2つのテクニックをご紹介します。
これまでに解説した方法で作成したグラフを、ファイル形式で出力したい場合は、以下の構文で「pyplot.savefig()関数」を使用します。
pyplot.savefig(“ファイル名”, format = “ファイル形式”, dpi = 解像度)
「format引数」には、以下の13種類のものを選べます。出力する目的や活用法に応じて、適切なものを選びましょう。
以下のサンプルコードは、複数のデータをプロットし、その結果をPNG形式で出力するためのものです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 複数のプロットデータを格納するためのリストを確保する x1 = [] # 1つ目のデータのX座標 y1 = [] # 1つ目のデータのY座標 x2 = [] # 2つ目のデータのX座標 y2 = [] # 2つ目のデータのY座標 sub = [] # サブプロットのオブジェクト # figureオブジェクトを生成する # サブプロットを作成するために、figure()関数の呼び出しが必須 figure = pyplot.figure(figsize = (12, 5), tight_layout = True) # forループを回してプロットデータとサブプロットを作成する for i in range(6): # 1つ目のデータを作成する x1.append([i for i in range(0, 10)]) y1.append([random.uniform(-100, 100) for i in range(0, 10)]) # 2つ目のデータを作成する x2.append([i for i in range(0, 10)]) y2.append([random.uniform(-100, 100) for i in range(0, 10)]) # サブプロットのオブジェクトを作成する sub.append(figure.add_subplot(230 + (i + 1))) # 各サブプロットにデータをセットする for i in range(6): # プロットにタイトルを設定する sub[i].set_title(f"Data{i + 1}") # X軸とY軸それぞれの名称を設定する sub[i].set_xlabel("Number") sub[i].set_ylabel("Value") # 1つ目のデータをプロットする p1 = sub[i].plot(x1[i], y1[i], color = "red", linewidth = 1, linestyle = "solid") # 2つ目のデータをプロットする p2 = sub[i].plot(x2[i], y2[i], color = "blue", linewidth = 1, linestyle = "dashed") # グラフの凡例を表示する sub[i].legend((p1[0], p2[0]), ("Data 1", "Data 2"), bbox_to_anchor = (1.0, 1.0), loc = "upper left", frameon = True, fancybox = True, shadow = True, framealpha = 1.0, facecolor = "skyblue", edgecolor = "blue", title = "Sample Legend", title_fontsize = 10) # 作成したグラフをPNGファイルで出力する pyplot.savefig("Graph.png", format = "png", dpi = 300) # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
pyplot.savefig()関数を使えば、データの作成・プロットからデータの出力まで、複雑な工程をプログラムで一元化できます。データの利活用に極めて便利なので、ぜひご活用ください。
前述したように、Matplotlibで日本語を使うと文字化けするうえに、コンソール画面には大量のエラーが表示されてしまいます。その状況を以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 30個の数値データを生成する x = [i for i in range(0, 30)] y = [random.uniform(-100, 100) for i in range(0, 30)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue") # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("lightgray") # グラフのタイトルを設定する pyplot.title("サンプルグラフ") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("番号") pyplot.ylabel("数値") # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, label = "サンプルデータ", color = "blue", linewidth = 1, linestyle = "dashed", marker = "o", markerfacecolor = "green", markersize = 5) # グラフにグリッドを表示する pyplot.grid() # グラフの凡例を表示する pyplot.legend() # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
メインウィンドウ
コンソール画面
Matplotlibで日本語を表示するためには、pyplot.rcParamsプロパティの「”font.family”」に、以下の構文でフォント名を指定する必要があります。
pyplot.rcParams[“font.family”] = “フォント名”
詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: UTF-8 # matplotlibライブラリ「pyplotモジュール」を「pyplot」という名称でimportする import matplotlib.pyplot as pyplot # 「numpy」ライブラリをimportする import numpy # 「math」ライブラリをimportする import math # 「random」ライブラリをimportする import random # 「MS Gothic」フォントを使用する pyplot.rcParams["font.family"] = "MS Gothic" # 30個の数値データを生成する x = [i for i in range(0, 30)] y = [random.uniform(-100, 100) for i in range(0, 30)] # グラフエリアの背景色を設定する pyplot.figure(figsize = (8, 5), facecolor = "lightblue") # プロットエリアの背景色を設定する axes = pyplot.axes() axes.set_facecolor("lightgray") # グラフのタイトルを設定する pyplot.title("サンプルグラフ") # X軸とY軸それぞれの名称を設定する pyplot.xlabel("番号") pyplot.ylabel("数値") # XとYのグラフをプロットする # 「color引数」で線の色を設定 # 「linewidth引数」で線の太さを設定 # 「linestyle引数」で線の種類を設定 pyplot.plot(x, y, label = "サンプルデータ", color = "blue", linewidth = 1, linestyle = "dashed", marker = "o", markerfacecolor = "green", markersize = 5) # グラフにグリッドを表示する pyplot.grid() # グラフの凡例を表示する pyplot.legend() # 作成したグラフをウィンドウに表示する pyplot.show()
//実行結果
Matplotlibでデータを可視化する際は、「目で見てすぐ理解できる」ことも重要です。そのため、上記の方法で日本語表示を可能にしておくと、よりわかりやすいグラフが作成できるようになります。
PythonのMatplotlibを活用すると、大量のデータや複雑なデータを、わかりやすい形で視覚化できます。あらゆる種類・形式のグラフを描画できるため、データ利活用において大きなメリットが得られるでしょう。Matplotlibには膨大な機能があるので、どの機能を使うべきかわかりにくいかもしれません。しかし、今回ご紹介したサンプルコードを参考にすることで、基本的なグラフの描画手順が身につくでしょう。
2024.06.17
子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介
#プログラミングスクール
2022.01.06
【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説
#プログラミングスクール
2024.01.26
【未経験でも転職可】30代におすすめプログラミングスクール8選!
#プログラミングスクール
2024.01.26
初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説
#JAVA
2024.01.26
忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説
#プログラミングスクール
2022.01.06
【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介
#プログラミングスクール
2024.01.26
【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説
#プログラミングスクール
2024.01.26
【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説
#プログラミングスクール