主要问题之一是 ax.set_aspect('equal') 在 matplotlib 中是 not implemented。一旦调用 set_aspect('equal'),当前版本的 matplotlib (3.1) 就会引发显式错误。旧版本给出了一个非常错误的投影,尽管用户通常没有意识到这个错误。其他有关在 3D 中设置相等纵横比的 StackOverflow 答案只是将 xyz 限制设置为相等,这使您更接近所需的结果,但不是完全相等的投影。
一种解决方法是手动设置图形轴,直到球体具有所需的纵横比。这很麻烦,因为绘图尺寸包括轴标签和填充的空间。
例如,将 figsize 设置为 6, 5.6 似乎很顺利
from sympy import sin, cos, pi
from sympy.plotting.plot import plot3d_parametric_surface
from sympy.abc import theta, phi
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = 6, 5.6
plot3d_parametric_surface(sin(phi) * cos(theta), sin(phi) * sin(theta), cos(phi),
(phi, 0, pi), (theta, 0, 2 * pi))
插入一个不可见的盒子(如果你没有画一个球体),可以只用一条对角线来实现:
from sympy import sin, cos, pi
from sympy.plotting.plot import plot3d_parametric_surface, plot3d_parametric_line
from sympy.abc import theta, phi, t
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = 6, 5.6
p1 = plot3d_parametric_surface(sin(phi) * cos(theta), sin(phi) * sin(theta), cos(phi),
(phi, 0, pi), (theta, 0, 2 * pi), show=False)
p2 = plot3d_parametric_line(t, t, t, (t, -1, 1), line_color='none', show=False)
p1.append(p2[0])
#p1.backend(p1).ax[0].set_aspect('equal') # this raises a NotImplementedError
p1.show()