最後に、外部ライブラリの利用例としてMatplotlibを利用して簡単なグラフを描画してみよう。Matplotlibは2次元のグラフ描画に使える多様な機能を提供するものだ。本連載で使用している[Try Jupyter]ページから起動できるJupyter環境にはこれが標準でインストールされているので、import文で導入するだけで、その機能を利用できる。
PythonのプログラムからMatplotlibを使ってグラフを描画するときには、次のようにしてインポートを行うのが一般的だ。
import matplotlib.pyplot as plt
まずはこのコードを実行しておこう。
Matplotlibは多数のモジュールを集めたモジュールとなっていて*1、pyplotモジュールはMatplotlibが提供するモジュール(サブモジュール)の一つであり、コマンド形式でグラフを描画可能な関数群を提供している。
*1 このように複数のモジュールをまとめたものを「パッケージ」と呼ぶ。ただし、Python公式サイトのドキュメントによれば「すべてのパッケージはモジュール」でもあり、パッケージの配布元でもパッケージとモジュールを厳密に区別していないことも多い。
上のコードにある「matplotlib.pyplot」というのは、Matplotlibが提供する多数のモジュールの中からpyplotモジュールだけをインポートすることを指示するものだ。「パッケージ.モジュール」あるいは「モジュール.サブモジュール」という書き方で、特定のモジュールだけをインポートできることも覚えておこう(パッケージについては、後続の回で取り上げる)。「as plt」とあるので、この後は「plt」という名前を介して、matplotlib.pyplotモジュールにアクセスする。
このモジュールには多数の関数が含まれているが、ここではplot関数とshow関数だけを使用する。詳細な構文はここでは省略するので、気になる方は「matplotlib.pyplot」ページから該当の関数を検索してほしい。
簡単には、X座標を格納するリストとY座標を格納するリストをplot関数に渡して、グラフを描画して、最後にshow関数でそれを実際に表示するという使い方をする。
実際に何かを描画するに当たっては、本連載の第1回「Pythonってどんな言語なの?」の「Pythonの外部ライブラリを使えば、単回帰分析を行うコードも数行に」で作成したコードに再登場してもらうことにする。それが以下のコードだ。ただし、最後の行だけは、変数aとbに傾きと切片を代入するように変更してある。
def fit(x, y):
x_mean = sum(x) / len(x)
y_mean = sum(y) / len(y)
x_centered = [item - x_mean for item in x]
y_centered = [item - y_mean for item in y]
xy = [item_x * item_y for item_x, item_y in zip(x_centered, y_centered)]
xx = [item * item for item in x_centered]
sum_xy = sum(xy)
sum_xx = sum(xx)
a = sum_xy / sum_xx
b = y_mean - a * x_mean
return (a, b)
# サンプルデータ
x = [-0.03, 0.78, 2.07, 2.77, 4.10, 5.38, 5.99, 6.84, 8.12, 8.89, 9.43]
y = [0.88, 2.45, 2.43, 4.07, 5.49, 6.46, 7.02, 8.27, 8.70, 10.23, 10.65]
# 一次関数の推測を行う
a, b = fit(x, y)
これはサンプルデータとしてX座標を含んだリストと、Y座標を含んだリストが用意されている。これをfit関数に渡してサンプルデータに最も合致する一次関数の傾きと切片を求めるものだ。
まずは、サンプルデータを基にグラフを描画してみよう。これには以下のコードを実行すればよい。第3引数に指定した文字列'o'はドットを描画することを指示するものだ。
plt.plot(x, y, 'o')
これによって次のようにグラフが描画される。
描画されないときには、以下のコードを実行しよう*2。
plt.show()
*2 環境やJupyterのバージョンによっては、セルに「%matplotlib inline」を入力、実行しておく必要があるかもしれない。詳細についてはMatplotlib公式サイトのドキュメント「Startup Commands」などを参照のこと。
今度はこれに推測した結果を基に作成したグラフを描画してみる。X座標は既に分かっているので、「X座標×傾き(a)+切片(b)」を計算した「もう一つのY座標を格納したリスト」を作成すればいいだろう。
y2 = [num * a + b for num in x]
plt.plot(x, y2)
plt.plot(x, y, 'o') # 元のドットも同時に描画しておく
plt.show()
これを実行すると、次のようになるはずだ。
実は第1回では、これと同じ手順でグラフを描画していた。また、第1回ではNumPyと呼ばれるパッケージも使用しているが、それを使う際にもimport文を使っている。
今回までに説明した知識を持った上で、第1回あるいは上記のfit関数のコードを読み直してみてほしい。「なんだ、カンタンじゃん!」と思えれば、Pythonの知識がそれなりに付いたということだ。
今回はPythonのモジュールを「使う」という観点から取り上げた。次回は、自分でモジュールを作成してみることにしよう。
「Python入門」
Copyright© Digital Advantage Corp. All Rights Reserved.
編集部からのお知らせ