matplotlibによる基本的なグラフ描画
pythonによるグラフ描画ライブラリmatplotlibの使い方をまとめていきます。
matplotlibでできることは多岐に渡るため、今回は僕の視点で良く使われるであろうと思われる機能を中心にまとめていきます。
○今回はmatplotlibを使って、以下のことができるようになります。
・データをグラフとして描画(複数のグラフを例にします。)
・グラフタイトルの表示
・X/Y軸ラベルの表示
・凡例の表示
・描画したグラフのファイル保存
○pyplotインターフェース、オブジェクト指向インターフェースの違いを大まかに説明します。
○グラフの例として、以下のグラフを描画します。
・折れ線グラフ
・縦棒グラフ
・横棒グラフ
・散布図
・ヒストグラム
・円グラフ
なぜmatplotlibなのか
機械学習にせよデータ分析にせよ、データを数値で並べただけでは全体像を把握することが難しいです。自分が把握できていないものを人に説明することも難しいです。そのためグラフで視覚的に表現することで傾向を把握して、伝えることは大事なことです。
Excelとかでもやってやれないことはないですし、使いやすい機能がたくさんあって、他のMicrosoftOfficeとも連携しやすいのは良いのですが、データの量が多くなるとExcelの動作が重くなるという問題があります。高度な数値計算をするのが面倒だったりもします。
Matlabという選択肢もありますが有償ですし、その分使っている人が少なくて情報が出回っていない印象です。かく言う僕もMatlabは学生の頃に授業で使ったきりで、ほぼ何も覚えていません。
その点、matplotlibであれば情報も出回っていますし、Numpyなどと組み合わせればMatlab相当のことはできるようです。必要であれば書いたコードをそのままPythonスクリプトに埋め込むことだってできます。何よりも無償です。
というわけでmatplotlibの使い方をまとめていきます。
主に参考にさせて頂いたサイト
○matplotlib
本家サイトです。主にTutorialsを参考にしています。
○早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話
また紹介しますが、pyplotインターフェースとオブジェクト指向インターフェースの違いが分からず、記法の統一・使い分けができなくて困っていたところ、こちらのサイトで勉強させていただきました。
基本的なグラフの作成方法
実行環境は以下の通りです。
import datetime
import platform
import matplotlib
print(f"Platform : {platform.platform()}")
print(f"Python : {platform.python_version()}")
print(f"matplotlib: {matplotlib.__version__}")
# Platform : Windows-10-10.0.18362-SP0
# Python : 3.8.3
# matplotlib: 3.2.2
グラフ描画するには"matplotlib.pyplot"をインポートする必要があります。
もちろんデータも準備しておく必要があります。
# 必要なライブラリのインポート
import matplotlib.pyplot as plt
# データ生成用にインポート
# グラフ描画そのものとは無関係
import numpy
# 描画データの生成(sin波)
x = numpy.arange(-5, 5, 0.1) # -5から5までの0.1区切りのデータ
y = numpy.sin(x) # 配列xに対してsin(x)の配列を求める
pyplotインターフェースとオブジェクト指向インターフェースの違い
pyplotインターフェースを利用する方法と、オブジェクト指向インターフェースを作成して利用する方法の大きく2種類あります。
描画機能そのものは基本的にどちらも変わりがないようです。
○pyplotインターフェース
・pyplotモジュールから直接関数を呼び出します。
・主にMatlabの記法を合わせるための書き方のようです。
○オブジェクト指向インターフェース
・Figureオブジェクト、Axesオブジェクトなどを生成して、それらを操作します。
・細かい調整をしたくなったときには、こちらでないと調整できないようです。
特に理由がなければ、オブジェクト指向インターフェースに統一したほうがいいでしょう。細かい調整をしたくなったときに記法が混ざってしまうと、可読性が下がってしまいます。
今回は、折れ線グラフの例のときだけpyplotインターフェースを使った例も一緒に示しますが、それ以外はオブジェクト指向インターフェースで統一します。
以下、基本的に良く使われるであろうと僕が思っている機能に絞って紹介します。それ以外の機能は別の機会にまとめていきます。
pyplotインターフェース
pyplotモジュールから直接関数を呼び出します。
○pyplot.plot(...)など
・描画したいグラフに合わせて呼び出す関数を変える必要があります。
・上の例は折れ線グラフです。
○pyplot.show()
・描画したグラフを表示します。
基本的にグラフを表示するのに必須なのは上の2つだけです。
あとは追加で表示したい内容や、表示したグラフの扱いなどに応じて追加で関数を使用します。
○pyplot.title(...)
・グラフタイトルを指定します。
○pyplot.xlabel(...)
・x軸のラベルを指定します。
○pyplot.ylabel(...)
・y軸のラベルを指定します。
○pyplot.legend()
・凡例を表示します。
・このときグラフ描画関数(plotなど)の引数"label"で指定したラベルが表示されます。
○plot.savefig(...)
・描画したグラフをファイルに保存します。
オブジェクト指向インターフェース
Figureオブジェクト、Axesオブジェクトを作成して、それらを操作します。
○pyplot.figure()
・Figureオブジェクトを作成します。
・僕はグラフを描画するキャンバスみたいなものをイメージしています。
○Figure.add_subplot()
・Axesオブジェクトを作成します。
・グラフ本体のイメージです。
○Axes.plot(...)など
・描画したいグラフに合わせて呼び出す関数を変える必要があります。
・上の例は折れ線グラフです。
○Axes.show()
・描画したグラフを表示します。
基本的にグラフ表示するのに必須なのは上の2つだけです。あとは追加で表示したい内容や、表示したグラフの扱いなどに応じて追加で関数を使用します。
○Axes.set_title(...)
・グラフタイトルを指定します。
○Axes.set_xlabel(...)
・x軸のラベルを指定します。
○Axes.set_ylabel(...)
・y軸のラベルを指定します。
○Axes.legend()
・凡例を表示します。
・このときグラフ描画関数(plotなど)の引数"label"で指定したラベルが表示されます。
○Figure.savefig(...)
・描画したグラフをファイルに保存します。
<例>折れ線グラフ
まずはpyplotインターフェースを使った例です。
# pyplotインターフェース
# pyplotモジュールから直接関数を呼び出します。
# グラフ描画(折れ線グラフ)
plt.plot(x, y, label="sin")
# グラフタイトル
# 使用しなければグラフタイトルがないグラフになります。
plt.title("glaph title") # グラフタイトルとして表示されます。
# 軸ラベル
# 使用しなければ軸ラベルがないグラフになります。
plt.xlabel("x axis label") # x軸ラベルとして表示されます。
plt.ylabel("y axis label") # y軸ラベルとして表示されます。
# 凡例追加
# グラフ描画のときに"label"として指定した文字列が凡例の文字列として表示されます。
# 使用しなければ凡例がないグラフになります。
plt.legend()
# グラフをファイルへ保存
# 使用しなければ表示だけになります。
plt.savefig("plot1.png")
# グラフ表示
plt.show()
続いてオブジェクト指向インターフェースを使った例です。やっていることの意味・描画したグラフは、pyplotインターフェースを使った例と全く同じです。
# オブジェクト指向インターフェース
# pyplotモジュールからFigureオブジェクト、Axesオブジェクトを作成して、それらを操作します。
# Figureオブジェクトを作成
fig = plt.figure()
# Axesオブジェクトを取得
axes = fig.add_subplot()
# グラフ描画(折れ線グラフ)
axes.plot(x, y, label="sin")
# グラフタイトル
# 使用しなければグラフタイトルがないグラフになります。
axes.set_title("glaph title") # グラフタイトルとして表示されます。
# 軸ラベル
# 使用しなければ軸ラベルがないグラフになります。
axes.set_xlabel("x axis label") # x軸ラベルとして表示されます。
axes.set_ylabel("y axis label") # y軸ラベルとして表示されます。
# 凡例追加
# グラフ描画のときに"label"として指定した文字列が凡例の文字列として表示されます。
# 使用しなければ凡例がないグラフになります。
axes.legend()
# グラフをファイルへ保存
# 使用しなければ表示だけになります。
fig.savefig("plot2.png")
# グラフ表示
fig.show()
<例>縦棒グラフ
# Figureオブジェクトを作成
fig = plt.figure()
# Axesオブジェクトを取得
axes = fig.add_subplot()
# グラフ描画(縦棒グラフ)
axes.bar(x, y, label="sin")
# グラフタイトル
axes.set_title("glaph title")
# 軸ラベル
axes.set_xlabel("x axis label")
axes.set_ylabel("y axis label")
# 凡例追加
axes.legend()
# グラフをファイルへ保存
fig.savefig("bar.png")
# グラフ表示
fig.show()
<例>横棒グラフ
# Figureオブジェクトを作成
fig = plt.figure()
# Axesオブジェクトを取得
axes = fig.add_subplot()
# グラフ描画(横棒グラフ)
axes.barh(x, y, label="sin")
# グラフタイトル
axes.set_title("glaph title")
# 軸ラベル
axes.set_xlabel("x axis label")
axes.set_ylabel("y axis label")
# 凡例追加
axes.legend()
# グラフをファイルへ保存
fig.savefig("barh.png")
# グラフ表示
fig.show()
<例>散布図
# Figureオブジェクトを作成
fig = plt.figure()
# Axesオブジェクトを取得
axes = fig.add_subplot()
# グラフ描画(散布図)
axes.scatter(x, y, label="sin")
# グラフタイトル
axes.set_title("glaph title")
# 軸ラベル
axes.set_xlabel("x axis label")
axes.set_ylabel("y axis label")
# 凡例追加
axes.legend()
# グラフをファイルへ保存
fig.savefig("scatter.png")
# グラフ表示
fig.show()
<例>ヒストグラム
# Figureオブジェクトを作成
fig = plt.figure()
# Axesオブジェクトを取得
axes = fig.add_subplot()
# グラフ描画(ヒストグラム)
axes.hist(y, label="sin")
# グラフタイトル
axes.set_title("glaph title")
# 軸ラベル
axes.set_xlabel("x axis label")
axes.set_ylabel("y axis label")
# 凡例追加
axes.legend()
# グラフをファイルへ保存
fig.savefig("hist.png")
# グラフ表示
fig.show()
<例>円グラフ
# データを準備
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Figureオブジェクトを作成
fig = plt.figure()
# Axesオブジェクトを取得
axes = fig.add_subplot()
# グラフ描画(円グラフ)
axes.pie(data, labels=["a", "b", "c", "d", "e", "f", "g", "h", "i" ,"j"])
# グラフタイトル
axes.set_title("glaph title")
# 軸ラベル
axes.set_xlabel("x axis label")
axes.set_ylabel("y axis label")
# 凡例追加
axes.legend()
# グラフをファイルへ保存
fig.savefig("pie.png")
# グラフ表示
fig.show()
まとめ
matplotlibを使ったグラフ描画方法をまとめました。今回は僕が良く使うであろうグラフ・機能に絞って紹介しました。もっと色々と細かい調整をしたり、様々なグラフを描画することができます。
・大きくpyplotインターフェースを使った方法と、オブジェクト指向インターフェースを使った方法の2種類があります。
・基本的にはオブジェクト指向インターフェースに統一したほうが、細かい調整をする必要が出てきたときに、記法の統一ができて、可読性が上がるでしょう。
この記事が気に入ったらサポートをしてみませんか?