Построить идеальную сферу с равными осями по параметру c в Sympy - PullRequest
0 голосов
/ 21 февраля 2020

Я хотел бы знать, как с помощью plot3d_parametric_surface в Sympy мы можем построить идеальную сферу. Под идеальным я подразумеваю с равными осями. Результат с этой функцией имеет овальную форму!

from sympy import *
from sympy.plotting.plot import plot3d_parametric_surface
from sympy.abc import theta , phi
plot3d_parametric_surface(sin(phi)*cos(theta) , sin(phi)*sin(theta), cos(phi), (phi,0,pi),(theta,0,2*pi))

enter image description here

Я пытался реализовать ответы в matplotlib (одинаковая длина блока): с «равным» соотношением сторон z- ось не равна x- и y- , но у меня не было никакого успеха.

1 Ответ

1 голос
/ 21 февраля 2020

Одна из основных проблем состоит в том, что ax.set_aspect('equal') - это , но он не реализован в matplotlib. Текущие версии matplotlib (3.1) вызывают явную ошибку, как только вызывается set_aspect('equal'). Старые версии давали совершенно неверные прогнозы, хотя часто пользователь не знал об ошибке. Другие ответы StackOverflow об установке равного соотношения сторон в 3D просто устанавливают равные пределы xyz, что приближает вас к желаемому результату, но не является полностью равной проекцией.

Обходной путь - вручную установить ось фигуры пока сфера не имеет желаемого соотношения сторон. Это громоздко, потому что размеры графика включают пространство для меток осей и для заполнения.

Например, установка размера 6, 5.6 кажется go лункой

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))

resulting plot

Вставка невидимого поля (если вы не рисуете сферу), может быть достигнуто только с помощью диагональной линии:

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