matplotlib 如何在SymPy中更改图形的纵横比

wsewodh2  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图绘制一个简单的环面与sympy。我想使用的数字作为一个图像。不幸的是,纵横比的轴使图像看起来拉长。
在代码中,我尝试将aspect_ratio更改为equal,如下所示:

from sympy import *
from sympy.plotting import *
u,v = symbols("u, v")

r = 1
R = 2
p = plot3d_parametric_surface(cos(u)*(r*cos(v)+R), sin(u)*(r*cos(v)+R), r*sin(v), (u, 0, 2*pi), (v, 0, 2*pi), show = False)
p.aspect_ratio = "equal"
p.show()

但随后发生了这个错误:

ValueError: could not convert string to float: 'q'

这个错误导致了第1296行的plot.py,这里有一个if语句:

if aspect != 'auto':
   aspect = float(aspect[1]) / aspect[0]

所以我试着注解掉它,然后代码运行,结果略有变化。
此外,根据这个错误(在将值设置为“aa”之后),这些选项应该默认工作:

ValueError: 'aa' is not a valid value for aspect; supported values are 'auto', 'equal', 'equalxy', 'equalyz', 'equalxz'
5hcedyr0

5hcedyr01#

达到你想要的结果的最好方法是使用Sympy Plotting Backends Module,其中的bug已经被修复了:

from spb import *
plot3d_parametric_surface(cos(u)*(r*cos(v)+R), sin(u)*(r*cos(v)+R), r*sin(v), (u, 0, 2*pi), (v, 0, 2*pi), aspect="equal")

如果你安装了完整的软件包,你可以很容易地创建更多的花式图。例如,使用Plotly:

plot3d_parametric_surface(
    cos(u)*(r*cos(v)+R), sin(u)*(r*cos(v)+R), r*sin(v), (u, 0, 2*pi), (v, 0, 2*pi), "u",
    aspect="equal", backend=PB,
    wireframe=True, wf_n1=30, wf_n2=20,
    use_cm=True, color_func=lambda uu, vv: uu
)

相关问题