『Pythonからはじめる数学入門』2章 データをグラフで可視化する
『Pythonからはじめる数学入門』
2章 データをグラフで可視化する
の解説です。 www.oreilly.co.jp
機械学習で数値データを提示する際には、
グラフを用いることが多いです。
今回は、
Pythonでグラフを使う方法についてご説明します。
2章 データをグラフで可視化する
2.1 デカルト座標平面を理解する
デカルト座標平面とは、いわゆるx-y平面のことです。
高校数学で出てくるので、用語のみ記載します。
座標coordinates 原点origin 集合set プロットplot グラフgraph
2.2 リストとタプルの操作
リスト:可変的な要素のかたまり(あとで変更できる)
タプル:固定された要素のかたまり(あとで変更できない)
2.2.1 リストやタプルで繰り返す
リストやタプルはfor文で繰り返すことができます。
>>> list = [1,2,3] >>> for item in list: ... print(item) ... 1 2 3 >>> for index, item in enumerate(list): ... print(index, item) ... (0, 1) (1, 2) (2, 3)
2.3 matplotlibでグラフを作る
matplotlibは、Pythonのグラフ描画パッケージです。
インストール方法は、次のコマンドでインストールするか、 別途「matplotlib インストール」などで検索してみてください。
pip install matplotlib
さっそく以下のコードを打ち込んでいきますが、
#点(1,2), (2,4), (3,6)をプロット x = [1,2,3] y = [2,4,6] from pylab import plot, show plot(x, y) show()
以下は、説明でにグラフ描画を表示するため、 コマンドラインではなく、 Jupyter Notebookを使って実行していきます。
上記の実行結果です。
2.3.1 グラフで点を作る
プロットを明示する場合です。
plot(x, y, marker='o')
実行結果です。
マーカーのみ表示する場合は、以下のように記載します。
plot(x, y, 'o')
2.3.2 ニューヨーク市の年間平均気温をグラフ化する
複数のプロットをしていけば、データの傾向をつかめます。
nyc_temp=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4,57.3] plot(nyc_temp, marker='o')
x軸に年など特定の値を設定する方法です。
years = range(2000,2013) plot(years, nyc_temp, marker='o')
2.3.3 ニューヨーク市の月間気温傾向を比較する
複数のグラフを重ね合わせる方法です。
#データはダミー y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4] y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1] y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4] months = range(1,13) plot(months, y2000, months, y2006, months, y2012, marker='o') from pylab import legend legend([2000,2006,2012])
legend()で、凡例の指定ができます。
細かい引数の指定方法は、以下を参照してください。
legend and legend_handler — Matplotlib 2.1.0 documentation
2.3.4 グラフのカスタマイズ
タイトル、X軸名、Y軸名など、
他にカスタマイズする方法は、以下のとおりです。
y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4] y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1] y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4] months = range(1,13) plot(months, y2000, months, y2006, months, y2012, marker='o') from pylab import legend legend([2000,2006,2012]) from pylab import title, xlabel, ylabel #title title('matplotlib title') #xlabel xlabel('Month') #ylabel ylabel('Temp')
また、
axis()によって、軸の最小値、最大値を指定できます。
Y軸の最小値を0にした場合です。
y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4] y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1] y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4] months = range(1,13) plot(months, y2000, months, y2006, months, y2012, marker='o') from pylab import legend legend([2000,2006,2012]) from pylab import title, xlabel, ylabel title('matplotlib title') xlabel('Month') ylabel('Temp') from pylab import axis axis(ymin=0)
また、
X軸の最小値・最大値、Y軸の最小値・最大値を以下の通り指定できます。
y2000=[53.9,56.3,56.4,53.4,54.5,55.8,56.8,55.0,55.3,54.0,56.7,56.4] y2006=[56.9,56.1,46.4,51.4,56.5,65.8,56.8,55.3,59.3,44.0,59.7,56.1] y2012=[51.9,59.3,51.4,52.4,53.5,59.8,51.8,52.0,57.3,53.0,56.2,66.4] months = range(1,13) plot(months, y2000, months, y2006, months, y2012, marker='o') from pylab import legend legend([2000,2006,2012]) from pylab import title, xlabel, ylabel title('matplotlib title') xlabel('Month') ylabel('Temp') from pylab import axis axis([0,13,0,100])
最後に、対話シェルではなく、プログラムの一部として、グラフを使う場合は、
pylabではなくpyplotを使います。
import matplotlib.pyplot as plt def create_graph(): x = [1,2,3] y = [2,4,6] plt.plot(x,y) if __name__ == '__main__': create_graph()
2.3.5 プロットの保存
グラフを保存するには、savefig()を使います。
from pylab import plot,savefig x = [1,2,3] y = [2,4,6] plot(x,y) savefig('mygraph.png')
2.4 式をプロットする
今までのご説明は、
すでにプロットするデータがあった場合ですが、
数式からプロットする方法があります。
2.4.1 ニュートンの万有引力の法則
詳細説明は省略しますが、イメージとして以下のようなグラフを描画できます。
import matplotlib.pyplot as plt def draw_graph(x,y): plt.plot(x, y, marker='o') plt.xlabel('Distance in meters') plt.ylabel('Gravitational force in newtons') plt.title('Gravitational force and distance') plt.show() def generate_F_r(): r = range(100, 1001, 50) F = [] G = 6.674*(10**-11) m1 = 0.5 m2 = 1.5 for dist in r: force = G*(m1*m2)/(dist**2) F.append(force) draw_graph(r, F) if __name__=='__main__': generate_F_r()
2.4.2 投射運動
略
以上、
『Pythonからはじめる数学入門』2章 データをグラフで可視化する
の解説でした。