Python Matplotlib
で描く各種プロット
水谷正大
2016
年度版
ver.0.06
matplotlibはpython用のグラフィックライブラリで、2次元の各種プロットや3次元プロットおよびアニ メーション、さらには動画作成(ffmpegが必要)まで、Excelなどでは得られない高い視覚化性能を有する驚 くような描画を可能にする。matplotlibのドキュメントページmatplotlib docにあるPDFは2,800ページ以上もあり、その豊富な全 容を把握することは困難である。ここでは、pythonスクリプトの基礎とその実行法を既知としてmatplotlib を使った描画の基本的考え方を紹介するに留める。このため、数多くの書籍や公開されている文書を適宜参考 にしてほしい。
matplotlibでどんなことが描けるか、まずmatplotlib GalleryやMatplotlib Examplesを眺めよう。ソー スコードが併せて表示されるので、興味あるプロットについては手元で実際に描画させて、それを元にして改 良を加えてその動作の理解に努めて欲しい。 全ての演習をクリアしていかないと次の段階が理解できないように構成されている。
目次
1 matplotlibのインストール 2 2 pyplotの考え方 2 2.1 原始的方法:与えた点列を1点ずつプロットする . . . 2 2.2 一般的方法:プロット位置をリストで与える . . . 3 2.3 関数のグラフプロット—numpyを利用しない非推奨のやり方 . . . 4 2.4 数論的関数の挙動のプロット . . . 5 3 ライブラリnumpyを使う 6 3.1 数値計算ライブラリ numpy . . . 6 3.2 色とマーカー指定 . . . 8 3.3 連続曲線を描く . . . 9 3.4 色、マーカー、線種の個別指定 . . . 10 3.5 線種指定 . . . 11 付録A matplotlibのインストール 131
matplotlib
のインストール
matplotlibはPython環境本体に付随するものではなく、インストール作業が必要だ。matplotlibのイン
ストールに先立って、これまた有名な数値計算ライブラリnumpyがインストールされている必要がある(詳 しくはmatplotlib Installing、または付録A参照)。実習室のパソコンにはいずれもインストールされている。
2
pyplot
の考え方
まず、matplotlibのオブジェクト指向ライブラリに対する手続き的インターフェースの1つで柔軟なプロッ トを可能とするコマンド matplotlib.pyplotの簡単な使い方を紹介する。名前が’ matplotlib.pyplot’と長い ので,短くpltとだけで使えるように、スクリプト冒頭で次のようにimportしておこう。 import numpy as np import matplotlib.pyplot as plt のようにインポートする。ここでは以下でもしばしば活用する数値計算ライブラリnumpy もnsとして利用 できるようにしている。2.1
原始的方法:与えた点列を
1
点ずつプロットする
体重[Kg]と身長[cm]が組になったx1, y′1とx2, y2およびx3, y3の3つのデータをxy-座標にプロットす るには、pltを3回繰り返して点(x1, y1),点(x2, y2)と点(x3, y3)と逐一プロットしていく次のスクリプト simple plot00.pyで達成できる。[注意1] 1行目はMacOX/Linux 系のshell で使うためのShebang表記だ。Windows環境
(win-dows10)でも近い将来に利用可能になると予告されているため、このように書くことを推奨する。 [注意2] 2行目は、文字コードUTF-8でスクリプトが書かれているという宣言で、日本語などの取り 扱いのためには必須(もちろん実際にUTF-8で保存されていなければならない)。 スクリプトとしては実質7行目から始まる。 simple plot00.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 # 日本語表示は .matplotlib/matplotlibrc に次の行を追加 4 # font.family : IPAexGothic 5 # ただし、要 IPAexフォント http://ipafont.ipa.go.jp 6 ’’’ 7 simple_plot00.py 8 1点ずつ3点をプロット 9 ’’’ 10 import matplotlib.pyplot as plt 11 12 plt.plot(62, 173, ’ro’) 13 plt.plot(53, 163, ’ro’) 14 plt.plot(72, 170, ’ro’) 15 plt.xlim(50, 80) 16 plt.ylim(150, 180) 17 plt.xlabel(u’体重 [Kg]’) 18 plt.ylabel(u’身長 [cm]’) 19 plt.title(u’体重と身長’) 20 #plt.savefig(’image/simple_plot00.png’) 21 plt.show() 12,13,14行目で、plt.plot(xk, yk, ’ro’)によって、x, y-成分がそれぞれxkとykである位置(xk, yk)に1
点ずつプロットする。’ro’ は色・マーカー指定で、ここではredとcircle(丸)で描くよう指定している。15 行目でx-軸の描画範囲、16行目でy-軸の描画範囲を指定している。
図示のセオリーを厳守しよう。ここでは17,18,19行目で、x-軸名(と単位)およびy-軸名(と単位)をそれ ぞれplt.xlabel( )およびplt.ylabel( )で、プロットタイトルをplt.title( )で与えている。プロッ ト結果を表示するために、21行目のplt.show()が必要だ。 コメントアウトしている20行目は、描かれる図を指定したファイル名でPNG形式で保存するためである。 ファイル拡張子.png(PNG), .pdf(PDF), .eps(EPS), .svg(SVG)など拡張子によって画像形式を指定できる (このままではJPEG形式で保存できない)。 演習2.1 スクリプトsimple plot00.pyを実行せよ。別ウィンドウに図1のようにプロット結果が表示さ れるはずだ(初回だけは暫く時間を要する)。このウィンドウを閉じることでスクリプトを終了できる。
図1 スクリプトsimple plot00.pyのプロット結果。ただし、軸ラベルの日本語化はIPAexフォントの インストールと環境設定ファイル.matplotlib/matplotlibrcへの設定が必要になる(英語表記で対応
すべし)
演習2.2 スクリプトsimple plot00.pyを実行せよ。15行目のplt.axisコメントアウトすると自動調整 されるが、どうなるか観察せよ。
2.2
一般的方法:プロット位置をリストで与える
simple plot00.pyのように、各点1つずつをplotするのはいかにも効率が悪い。
通常はn点のプロット位置(x1, y1), (x2, y2), (x3, y3), . . . , (xn, yn)に対して、x方向とy方向の成分として
次のように取り出した2つのリストxlist, ylistを用意しておいてプロットする。各リスト要素の順番は重 要で、十分注意しよう。
xlist = [x1, x2, x3, . . . , xn]
ylist = [y1, y2, y3, . . . , yn]
次のスクリプトsimple plot0.pyはsimple plot00.pyと等価なスクリプトである。2つのスクリプト を細かく比較検討して欲しい。 simple plot0.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 ’’’ 4 simple_plot0.py 5 3点のxy-座標をリストで与えてプロット 6 ’’’ 7 import matplotlib.pyplot as plt 8
9 xlist = [62, 53, 72] 10 ylist = [173, 163, 170] 11 plt.plot(xlist, ylist, ’ro’) 12 plt.xlim(50, 80) 13 plt.ylim(150, 180) 14 plt.xlabel(u’体重 [Kg]’) 15 plt.ylabel(u’身長 [cm]’) 16 plt.title(u’体重と身長’) 17 #plt.savefig(’image/simple_plot0.png’) 18 plt.show()
演習2.3 スクリプト simple plot0.pyを実行し、simple plot00.pyと同じ結果をもたらすことを確認 せよ。
2.3
関数のグラフプロット
—numpy
を利用しない非推奨のやり方
matplotlibのプロットでは、x-方向とy-方向のリストを与えてプロットするやり方が一般的だ。この方法 を再確認するために、与えられた関数f (x)のグラフを区間I = [xa, xb] 上でプロットすることを考えよう。 このためには、区間Iを細かく分割して、その分点を xa= x0< x1< x2< x3<· · · < xn−1< xn= xb とし、各分点xkでの関数値f (xk)で定まる点(xk, f (xk)), k = 0, . . . , nをプロットすればよい。たとえば、2 次関数f (x) = x2の場合、区間[−2, 2]を幅0.25で等分割したとき、図2.3のようにプロットされる。matplotlib以外のライブラリを使わない場合には、次のようなスクリプトfunc plot0.pyを考えることが
できる。Pythonのリスト生成関数rangeやxrangeでは引数は整数値である必要があり、浮動小数点を含む
関数区間の分点リストを生成できない。このため、9行目から15行目まで関数frange(startpt, endpt,
step)を定義した。この関数を使って17行目のように、関数区間の左端をstartpt、右端をendpt、区間分割
幅をstepとして区間の分点リストxlistを得る。次いで18行目から21行目で、分点に応じた2次関数値リ ストflistを求めている。 func plot0.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 ’’’ 4 func_plot0.py 5 numpy を「使わない」関数のグラフプロット 6 ’’’ 7 import matplotlib.pyplot as plt 8
9 def frange(startpt, endpt, step): 10 nlist = [startpt]
12 while next <= endpt: 13 nlist.append(next) 14 next += step 15 return(nlist) 16 17 xlist = frange(-2, 2, 0.25) 18 flist = [] 19 for x in xlist: 20 fx = x ** 2 21 flist.append(fx) 22
23 plt.plot(xlist, flist, ’ro’) 24 plt.xlim(-2,2) 25 plt.ylim(-0.5, 5) 26 plt.axhline(0, c=’b’, ls=’-’, lw=0.5)# x 軸(直線x=0) 27 plt.axvline(0, c=’b’, ls=’-’, lw=0.5)# y 軸(直線y=0) 28 plt.xlabel(’x’, fontsize=18) 29 plt.ylabel(’f(x)’, fontsize=18) 30 31 plt.title(’Graphs of f(x)=x ** 2’) 32 #plt.savefig(’image/func_plot0.png’) 33 plt.show() 演習2.4 スクリプトfunc plot0.pyを実行せよ。定義区間や文点数を変えて、他の関数のグラフプロット を描け。たとえば、区間[−4, 4]上の3次関数 1 2x 3+ x2− 3xや、ライブラリ mathをインポートして区間 [−π, π]上の三角関数sinや 区間(0, 20]上の対数関数logなどをグラフプロットする。関数のグラフの大域的 形が分かるようにx, y-軸のラベル範囲plt.xlim,plt.ylimも適宜変化させるか、コメントアウトする。
2.4
数論的関数の挙動のプロット
関数(写像)の反復で得られる点列をプロットしてみよう。 区間I = [0, 1)上の関数f : I → Iを考える。Iの点x0 ∈ Iを初期条件から関数f を反復適用して得られ るで定義される列O(f, x0)をx0を初期条件とする軌道という。 O(f, x0) ={x0, x1, x2, . . . , xn, . . .}, xk+1= f (xk). このとき、軌道から定まる2次元点列{(xk, xk+1)}k=0,...,∞は関数fのグラフ{(x, y) | y = f(x)}上にある。 具体例を考えてみよう。 区間[0, 1)上の関数 b(x) = 2x (mod 1) = 2x− a(x), a(x) =⌊2x⌋ ∈ {0, 1} は数x∈ [0, 1)]の2進展開 x = ∞ ∑ k=1 ak(x) 2k , ak(x) = a(b k(x)) を与える。 また、区間(0, 1]上の関数 g(x) = 1 x− c(x), c(x) = ⌊ 1 x ⌋ ∈ N は数x∈ [0, 1)]の単純連分数展開 x = 1 c1(x) + 1 c2(x) + 1 . .. + 1 ck(x) + 1 . .. , ck(x) = c(gk(x)).次のスクリプトは初期条件x0 ∈ (0, 10に対する軌道を求めながら、2次元点列{(xk, xk+1)}k=0,...,∞をプ ロットするプログラムである。 expansion.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 ’’’ 4 expansion.py
5 plotting orbit (x_i, x_{i+1}) of 1-dim expansion(binary and continued expansion) 6 ’’’ 7 import math 8 import matplotlib.pyplot as plt 9 10 def binary_expand(x): 11 return(2 * x - math.floor(2 * x)) 12 13 def cfraction_expand(x): 14 return(1/x - math.floor(1/x)) 15 16 N = 20000 17 x0 = math.sqrt(2)-1 18 19 xlist = [] 20 ylist = [] 21 22 for k in range(0,N): 23 x1 = binary_expand(x0) 24 # x1 = cfraction_expand(x0) 25 xlist.append(x0) 26 ylist.append(x1) 27 x0 = x1 28 29 plt.plot(xlist, ylist, ’r.’) 30 plt.show() 一般に写像f :D → Dnに関する軌道の研究を力学系(dynamical system)といい、物理学だけに留まらず 数論や確率論を含むエルゴード理論など数学における主要な研究テーマとなっている。 演習2.5 区間 (0, 0)上の数論的1 次元変換において初期条件を変えてその軌道ついての2 次元プロット expansion.pyを様々に試みなさい。
3
ライブラリ
numpy
を使う
節2.3でみたように、与えられた関数区間上の関数f (x)のグラフプロットを描画するためには、区間の分 点リストと関数f による関数値リストを求めることが煩雑だ*1。3.1
数値計算ライブラリ
numpy
numpyはpythonにおける数値計算を劇的に向上させる優れたライブラリで世界中に盛んに使われている が、Python標準出なくインストールが必要である(付録A)。その利用法について多くの書籍とテキストが配布されているが、マニュアNumpy User Guideが基本的だ。ここでは、関数グラフのプロットという極狭 い用途についてだけnumpyを紹介する。 ライブラリmatplotlibをインストールするために必要でもあるが、その利用に当たっては別途インポート しなければならない。ここでは、numpyをnpと略記できるように次のようにインポートしよう。 import numpy as np *1ただし、Python の基礎と matplotlib の簡単な使い方が身についている証として、それでも関数グラフのプロットが描けること は必要である
関数の定義域I = [a, b]を等分割して分点リストを得るには値のように2つの方法があり、どちらも様々な 場面で多用される。 1. numpy.arange関数を次のように使う。関数の定義域I = [a, b]を分割幅dxで等分割して分点リス トxlistを得るには xlist = np.arange(a, b, dx) とする。Python shellでこの事実を確かめてみよう。次は、区間[−2, 2]を幅0.5で分割した分点リス トxを生成する例である。 >>> import numpy >>> x = numpy.arange(-2, 2, 0.5) >>> x array([-2. , -1.5, -1. , -0.5, 0. , 0.5, 1. , 1.5]) 詳しく説明しないが、numpy.arangeはarrayオブジェクトで、その要素の型に制限があること以外は (ここせ説明する範囲では)リストと同じであると考えてよい。
2. numpy.linspace関数を次のように使う。関数の定義域I = [a, b]をn等分して分点リストxlistを 得るには xlist = np.linspace(a, b, n) とする。分割数nを省略して xlist = np.linspace(a, b) としたときは、システムによって適当な数に分割してくれる。 Python shellでこの事実を確かめてみよう。次は、区間[−2, 2]を20等分に分割した分点リストxを 生成する例である。 >>> x = numpy.linspace(-2, 2, 20) >>> x array([-2. , -1.78947368, -1.57894737, -1.36842105, -1.15789474, -0.94736842, -0.73684211, -0.52631579, -0.31578947, -0.10526316, 0.10526316, 0.31578947, 0.52631579, 0.73684211, 0.94736842, 1.15789474, 1.36842105, 1.57894737, 1.78947368, 2. ]) 次は、区間[−2, 2]をシステムに任せて適当な数に等分に分割した分点リストxを生成する例である。 >>> x = numpy.linspace(-2, 2) >>> x array([-2. , -1.91836735, -1.83673469, -1.75510204, -1.67346939, -1.59183673, -1.51020408, -1.42857143, -1.34693878, -1.26530612, -1.18367347, -1.10204082, -1.02040816, -0.93877551, -0.85714286, ... 省 略 ... 0.85714286, 0.93877551, 1.02040816, 1.10204082, 1.18367347, 1.26530612, 1.34693878, 1.42857143, 1.51020408, 1.59183673, 1.67346939, 1.75510204, 1.83673469, 1.91836735, 2. ])
演習3.1 Python shellで、区間I = [−π, π]を幅0.2で等分割した分点リストをnumpy.arangeで生成した リスト要素を確認しなさい。
演習3.2 Python shellで、区間I = [−π, π]をnumpy.linspaceを使い分点数を指定しないで生成したとき のリスト要素、および50分割したときのリスト要素を確認せよ。円周率πはnumpy.piで与えられる。
numpyによって任意区間の分点リストを簡単に生成できるわけだが、numpy利用が劇的なのは、分点リス
使わずに、単一の関数計算f(xlist)で生成できることである。次は、関数f (x)としてx2 の場合の関数値 リストの計算例である。 >>> x = numpy.linspace(-2, 2, 10) >>> x array([-2. , -1.55555556, -1.11111111, -0.66666667, -0.22222222, 0.22222222, 0.66666667, 1.11111111, 1.55555556, 2. ]) >>> x ** 2 array([ 4. , 2.41975309, 1.2345679 , 0.44444444, 0.04938272, 0.04938272, 0.44444444, 1.2345679 , 2.41975309, 4. ]) 演習3.3 Python shellで、上の事実を確かめよ。分点数も変更して実行してみよ。関数x3についても確か めてみよ。
以上のnumpy利用の理解を確認するためにfunc plot10.pyをnumpy.linspace(区間を8等分)を使っ て書き変えたスクリプトが次のfunc plot1.pyである。 func plot1.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 ’’’ 4 func_plot1.py 5 numpyを使う関数のグラフプロット 6 ’’’ 7 import numpy as np 8 import matplotlib.pyplot as plt 9 10 x = np.linspace(-2, 2, 8) 11 plt.plot(x, x ** 2, ’ro’) 12 #plt.plot(x, x ** 2, ’b-’) 13 plt.xlim(-2,2) 14 plt.ylim(-0.5, 5) 15 plt.axhline(0, color=’b’, ls=’-’, lw=0.5)# x 軸(直線x=0) 16 plt.axvline(0, color=’b’, ls=’-’, lw=0.5)# y 軸(直線y=0) 17 plt.xlabel(r’$x$’, fontsize=18) 18 plt.ylabel(r’$f(x)$’, fontsize=18) 19 20 plt.title(r’Graphs of $f(x)=x^2$’, fontsize=20) 21 #plt.savefig(’image/func_plot1.png’) 22 plt.show()
3.2
色とマーカー指定
plotのオプションの色・マーカー指定(’ro’のように使ってきた)で、前者が色指定、後者がマーカー指 定である。 色指定では表1のように指定できる。色 呼称 記号 赤 ’red’ ’r’ 青 ’blue’ ’b’ 緑 ’green’ ’g’ シアン ’cyan’ ’c’ マゼンタ ’magenta’ ’m’ 黄 ’yellow’ ’y’ 黒 ’black’ ’k’ 白 ’white’ ’w’ 表1 matplotlibの色指定(color)(一部) マーカー 記号 点 ’.’ ピクセル ’,’ 丸 ’o’ 下向き三角 ’v’ 上向き三角 ’^’ 左向き三角 ’<’ 右向き三角 ’>’ 四角 ’s’ 5角形 ’p’ 6角形 ’h’ 6角形2 ’H’ 8角形 ’8’ 星形 ’*’ ダイヤ ’D’ 細ダイヤ ’d’ 表2 matplotlibのマーカー指定(marker)(一部) 演習3.4 色部を変えてスクリプトを実行してみよ。 次のように、色・マーカー指定に加えてmarkersize値を指定するとマーカーの大きさを変更できる。 plt.plot(xlist, ylist, ’b+’, markersize=10)
演習3.5 マーカー部を変えてスクリプトを実行してみよ。
3.3
連続曲線を描く
演習3.6 func plot1.pyの12行目はコメントアウトされている。コメント記号#を取り除くと図2が得ら れることを確かめよ。 12行目はplt.plotのオプションとして色・線種指定をしている。’b-’で隣り合う点同士を青色で実線で 結んでいる。注目すべきことは、11行目(プロット)と12行目(線)で指定される描画が重なって得られて いることである。図2 関数プロットに加えて、隣り合うプロット点を直線で結んだ図。区間の分割数(この例では8)が小 さいと、描かれる関数グラフは粗くなる。
3.4
色、マーカー、線種の個別指定
plotのオプションの「色・マーカー指定」(’ro’など)や「色・線種指定」(’b-’など)では紛らわしいた め、これらを明示できるオプションcolor(色指定)、makrker(マーカー指定)、ls(線種指定linestyle)を 使うことにしよう。
次のfunc plot2.pyは区間[−π, π]上の三角関数cos, sin, tanのグラフを描画するスクリプトだ(図3)。 13行目で、マーカー指定をmarker=’s’とし、さらに線種指定をls=’None’として関数tan(x)をプロット していることに注意する。 また、11,12,13行目のplotのオプションにlabelで文字列が加えられていることに注意する。このラベ ル指定による凡例の追加を有効にするためには、18行目にあるようplt.legend()の行が併せて必要である。 func plot2.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 ’’’ 4 simple_plot2.py 5 関数グラフを重ねる 6 ’’’ 7 import numpy as np 8 import matplotlib.pyplot as plt 9 10 x = np.linspace(-np.pi, np.pi)
11 plt.plot(x, np.cos(x), color=’r’, ls=’-’, label=’cos’) 12 plt.plot(x, np.sin(x), color=’b’, ls=’-’, label=’sin’)
13 plt.plot(x, np.tan(x), color=’c’, marker=’s’, ls=’None’, label=’tan’) 14 plt.xlim(-np.pi, np.pi) 15 plt.ylim(-1.5,1.5) 16 plt.axhline(0, ls=’-’, c=’b’, lw=0.5)# x 軸(直線x=0) 17 plt.axvline(0, ls=’-’, c=’b’, lw=0.5)# y 軸(直線y=0) 18 plt.legend()# 凡例表示 19 plt.xlabel(’x’) 20 plt.ylabel(’y’) 21
22 plt.title(’Graphs of Trigonometric functions’) 23 #plt.savefig(’image/func_plot2.png’)
24 plt.show()
図3 区間[−π, π]で三角関数sin(x), cos(x)のグラフをそれぞれ青と赤の実線で、tan(x)描画は■のマー カーで描画。右上の凡例によって関数が識別できる。
3.5
線種指定
plotでlsによって指定できる線種は表3のようである。 種類 呼称 記号 実線 ’solid’ ’-’ 破線 ’dashed’ ’--’ 一点鎖線 ’dashdot’ ’-.’ 点線 ’dotted’ ’:’ 非表示 ’None’表3 matplotlibの線種(line style)
また、plotでは線の太さを調整するオプションlinewidth(略記lw)が使える。
次のfunc plot3.pyは区間[−π, π]で三角関数sin(x), sin(x + 1), sin(x + 2),sin(x + 3), sin(x + 4)を異な る線幅で描くスクリプトである(図4)。 func plot3.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 ’’’ 4 simple_plot3.py 5 線の幅 6 ’’’ 7 import numpy as np 8 import matplotlib.pyplot as plt 9 10 x = np.linspace(-np.pi, np.pi)
11 plt.plot(x, np.cos(x), color=’r’, ls=’-’, lw=1.0, label=’lw=1’) 12 plt.plot(x, np.cos(x+1), color=’b’, ls=’-’, lw=2.0, label=’lw=2’) 13 plt.plot(x, np.cos(x+2), color=’g’, ls=’-’, lw=3.0, label=’lw=3’) 14 plt.plot(x, np.cos(x+3), color=’c’, ls=’-’, lw=4.0, label=’lw=4’) 15 plt.plot(x, np.cos(x+4), color=’m’, ls=’-’, lw=5.0, label=’lw=5’) 16 plt.xlim(-np.pi, np.pi)
17 plt.ylim(-1.5,1.5)
18 plt.axhline(0, ls=’-’, c=’b’, lw=0.5)# x 軸(直線x=0) 19 plt.axvline(0, ls=’-’, c=’b’, lw=0.5)# y 軸(直線y=0) 20 plt.legend()# 凡例表示
21 plt.xlabel(’x’) 22 plt.ylabel(’y’) 23
24 plt.title(’Variation of Line widths’) 25 #plt.savefig(’image/func_plot3.png’) 26 plt.show() 演習3.8 func plot3.pyを実行してみよ。 図4 区間[−π, π]で三角関数sinのグラフを異なる線幅の実線で描画 リサージュ(Lissajous)曲線とは、xy-平面上の点(x, y)がtをパラメータとして x(t) = sin ωt, y(t) = cos t で表される曲線である。ω > 0は適当に指定する。ωが有理数(分数で表される)のときは閉曲線、無理数の ときは四角形領域を稠密に埋め尽くすことが知られている。次のスクリプトlissajous.pyはリサージュ曲 線を描画する。 lissajous.py 1 #!/usr/bin/env python 2 # coding: utf-8 -*-3 ’’’ 4 lissajous.py 5 リサージュ曲線(sin(omega * t), cos(t)) 6 ’’’ 7 import numpy as np 8 import matplotlib.pyplot as plt 9 10 omega = np.sqrt(3) 11 t = np.arange(0, 100, 0.1) 12 plt.plot(np.sin(omega * t), np.sin(t), ’b’) 13 14 plt.xlabel(’x’) 15 plt.ylabel(’y’)
16 plt.title(r’Lissajous curve: $\omega$= ’ + str(omega)) 17 #plt.savefig(’image/lissajous.png’)
図5 リサージュ曲線。ω =√3(無理数)とし、tを0から100まで変化させた連続曲線。t→ ∞で四 角形領域は曲線で稠密に埋め尽くされていく。
演習3.9 lissajous.pyを実行してみよ。10行目のomegaを0.8や1.5などの有理数やnp.sqrt(3)など の無理数(数値的には浮動小数点)に変えてどんな連続曲線になるかを確かめよ。