Python Matplotlib で描く各種プロットmizutani/python/print/matplotlib/...Python Matplotlib...

Post on 25-Jul-2019

267 views 0 download

Transcript of Python Matplotlib で描く各種プロットmizutani/python/print/matplotlib/...Python Matplotlib...

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のインストール 13

1

1 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.py1 #!/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-軸の描画範囲を指定している。

2

図示のセオリーを厳守しよう。ここでは 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.py1 #!/usr/bin/env python

2 # -*- coding: utf-8 -*-

3 ’’’

4 simple_plot0.py

5 3点の xy-座標をリストで与えてプロット6 ’’’

7 import matplotlib.pyplot as plt

8

3

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.py1 #!/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]

11 next = startpt + step

4

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 次関数 12x

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(bk(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)).

5

次のスクリプトは初期条件 x0 ∈ (0, 10に対する軌道を求めながら、2次元点列 {(xk, xk+1)}k=0,...,∞ をプ

ロットするプログラムである。

expansion.py1 #!/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 の簡単な使い方が身についている証として、それでも関数グラフのプロットが描けることは必要である

6

関数の定義域 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利用が劇的なのは、分点リス

ト xlist=[x0, x1, . . . , xn]に対応した関数値リスト flist=[f(x0), f(x1), . . . , f(xn)]が、次のように for文を

7

使わずに、単一の関数計算 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.py1 #!/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のように指定できる。

8

色 呼称 記号

赤 ’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行目(線)で指定される描画が重なって得られて

いることである。

9

図 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.py1 #!/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.7 func plot2.pyを実行してみよ。

10

図 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.py1 #!/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()# 凡例表示

11

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.py1 #!/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’)

18 plt.show()

12

図 5 リサージュ曲線。ω =√3(無理数)とし、tを 0から 100まで変化させた連続曲線。t → ∞で四

角形領域は曲線で稠密に埋め尽くされていく。

演習 3.9 lissajous.pyを実行してみよ。10行目の omegaを 0.8や 1.5などの有理数や np.sqrt(3)など

の無理数(数値的には浮動小数点)に変えてどんな連続曲線になるかを確かめよ。

付録 A matplotlibのインストール

13