Python
sympy
数学

sympy.plottingでaspect_ratioが変えられない? 件について

More than 1 year has passed since last update.

sympy.plottingでaspect_ratioが変えられない? 件について

私の勘違いだったらすいません.
私の知識不足でした.@SaitoTsutomu 様にコメントをいただき解決しました.

jupyter notebookを起動します.まずは下準備.

from sympy.plotting import plot, plot_implicit, plot_parametric
from sympy import symbols, sin, cos, pi
x, y, t = symbols('x y t')

plot

plot(x**2, (x, -2, 2))

とすれば, $-2\leqq x\leqq 2$ の範囲における $y=x^2$ が描写されます.

Unknown.png

複数の関数のグラフを同時に表示することも可能です.$y=x^2$ と $y=x$ を同じ座標空間に描写します.

plot(x**2, x, (x, -2, 2))

Unknown2.png

plot_implicit

$f(x, y)=0$ の形の図形(いわゆる陰関数)も描写できます.次は $x^2+y^2-1=0$ すなわち原点を中心とする半径 $1$ の円です.

plot_implicit(x**2+y**2-1)

Unknown3.png

縦横のアスペクト比が気になりますが,一応円です.plot_implicit は二つ以上の式を設定して,複数の曲線を描くことができないみたいです.陰関数はそれだけプロットが面倒だということでしょうか.

plot_parametric

これが本命.$y=f(x)$ だとどうしても表現が制限されます.そこで媒介変数表示で表される図形の描写です.例えば
$$
x = \cos t,\ y = \sin t\quad (0\leqq t\leqq 2\pi)
$$
は同じく原点を中心とする半径 $1$ の円ですが,これをプロットするには次のようにします.

plot_parametric(cos(t), sin(t), (t, 0, 2*pi))

Unknown-2.png

複数の曲線も同時に描写できます.

plot_parametric((cos(t), sin(t)), (cos(t)+1, sin(t)+1), (t, 0, 2*pi))

Unknown-3.png

個別にパラメータの範囲を設定することも可能.

plot_parametric((cos(t), sin(t), (t, 0, 2*pi)), (cos(t)+1, sin(t)+1, (t, 0, pi)))

Unknown-5.png

ところで,さっきからずっと気になっている方がいらっしゃると思いますが,円をプロットしているはずなのに楕円が映っています.公式ドキュメントによれば

aspect_ratio : tuple of two floats or {‘auto’}

とあるんですが,これを設定しても何も変わらず……

plot_parametric((cos(t), sin(t)), (cos(t)+1, sin(t)+1), (t, 0, 2*pi), axis=False, aspect_ratio=(1, 1))

Unknown-4.png

axisオプションは適用されているのは確認できますが,aspect_ratioは応答なし.Googleで検索してみたんですが,英語サイトばかりで,一応,少し目を通してみましたが,すっきりした解答は得られず.

そもそもsympyのplotはmatplotlibを仲介しているらしく,matplotlibの設定を無理矢理変更する? みたいな解答があったんですが,それをやるなら最初からmatplotlibで図示した方がよいのではないかと思う始末でした.

**kwargsって……

プログラマでもなんでもない素人の私の意見なんですが,**kwargsって想定していないキーワードを突っ込んでも特にエラーが出ないんですね.結構危ない仕様なのではないだろうか……aspect_ratioのスペルミスなども考えたんですが,うんともすんとも言わないから,aspect_ratioというオプションを認識しているかどうかすらよく分かりませんでした.

解決

aspect_ratioと画面サイズは違うとのこと.

from sympy.plotting import plot_parametric
from sympy import symbols, sin, cos, pi
t = symbols('t')

import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8,8)

plot_parametric(cos(t), sin(t), (t, 0, 2*pi))

Unknown6.png

無事 $1:1$ で表示されました.@SaitoTsutomu 様,ありがとうございました.