つれづれなる備忘録

日々の発見をあるがままに綴る

SymPyの使い方21 ~ plottingモジュール2

 前回はSymPyのplottingモジュールを用いては簡単な2次元のプロットについて紹介したが、今回は3次元プロットとパラメトリックプロットについて紹介する。

atatat.hatenablog.com

1. 3次元プロット

SymPyのplottingモジュールを用いて3dプロットを行うにはsympy.plottingplot3dを用いる。

from sympy import *
from sympy.plotting import plot3d

基本的にはplot3d内にプロットする3次元関数のシンボリック表現を記述すればよい。例えばガウシアン

\displaystyle \exp (-( x^{2}+y^{2} ) )

x,y=symbols('x y')
plot3d(exp(-(x**2+y**2)),(x,-2,2),(y,-2,2))

実行すると以下のような3次元プロットが得られる。なお(x,-2,2),(y,-2,2)はx,yの描画範囲を-2~2に指定している。

"plot3dによるガウシアン関数の3次元プロット"
plot3dによるガウシアン関数の3次元プロット

また、複数の3次元プロットを描画するには、関数をコンマ区切りで記述する。例えば上記のガウシアンとx*y/10は

plot3d(exp(-(x**2+y**2)),x*y/10,(x,-2,2),(y,-2,2))

"複数の3次元関数の3次元プロット"
複数の3次元関数の3次元プロット

なお、プロットの色変更については、surface_colorというオプションがあって以下のように設定できるが

plot3d(exp(-(x**2+y**2)),(x,-2,2),(y,-2,2),surface_color="red")

グリッドの線色が変更するのみ。表面のテクスチャ、カラーマップは直接変更できるオプションがない。

2. パラメトリックプロット

 次にパラメトリックプロットの方法について紹介する。まず2次元のパラメトリックプロットはplot_parametricを使用する。 基本的にはxのパラメトリック表現:x(u),yのパラメトリック表現:y(u)を記述する。例えば半径1の円:x=cos(u),y=sin(u)は

from sympy.plotting import plot_parametric
u=symbols('u')
plot_parametric(cos(u),sin(u),(u,0,7),size=(4,4))

なおデフォルトのアスペクト比だと楕円に見えるため出力サイズをsize=(4,4)として指定することで正円に見える。

"2次元パラメトリックプロット"
2次元パラメトリックプロット

3次元のパラメトリックプロットはplot3d_parametric_lineを使用する。2次元と同じようにxのパラメトリック表現:x(u),yのパラメトリック表現:y(u),zのパラメトリック表現:z(u),を記述する。 プロットする線色を変更するにはline_colorを用いて指定する。以下はline_color="red"として赤に変更、またサイズもx,y,zのサイズが同じになるようにsize=(5,5,5)とした。

from sympy.plotting import plot3d_parametric_line
plot3d_parametric_line(cos(u),sin(u),u,(u,-5,5),line_color="red",size=(5,5,5))

"3次元パラメトリックプロット"
3次元パラメトリックプロット

パラメトリックプロットで複数の関数を表示するには(x1(u),y1(u),z1(u), (u,min2,max2)),(x2(u),y2(u),z2(u), (u,min2,max2))といった方法で記述する。

plot3d_parametric_line((cos(u),sin(u),u,(u,-5,5)),(0.5*sin(u),0.5*cos(u),0.5*u,(u,-5,5)),size=(5,5,5))

"複数の3次元パラメトリックプロット"
複数の3次元パラメトリックプロット

3. まとめ

 SymPyのplottingモジュールを用いたプロット方法について紹介してきた。シンボリックな関数表現から直接プロットを作成できるとい利便性の一方で、プロットの体裁を整えるには機能が限定されているため、例えば事前確認はSymPyのplottingを使い、レポート用はmatplotを使うなどの使い分けするというのがよさそうだ。