Matplotib 3D рисунок, показывающий поверхность плюс контуры с частями, скрытыми правильно? - PullRequest
1 голос
/ 08 февраля 2020

Я хотел бы нарисовать поверхность и некоторые из ее контуров iso-z, используя функции plot_surface и contour3D из mplot3D. Вот пример (я хотел бы использовать его для иллюстрации точек Лагранжа в физике):

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

epsilon, r1 = 0.3, 1
r2 = epsilon*r1
Omega2 = 1/(r1*pow(r1+r2, 2))

u = np.linspace(-2, 2, 100)
x , y = np.meshgrid(u, u)
z = -epsilon/np.sqrt(np.power(x-r1, 2)+ np.power(y, 2)) - 1/np.sqrt(np.power(x+r2, 2)+ np.power(y, 2)) - 0.5*Omega2*(np.power(x, 2) + np.power(y, 2))
z = np.clip(z, -3, 0)

ax.plot_surface(x, y, z, rstride=1, cstride=1, antialiased=True, color="whitesmoke")
ax.contour3D(x, y, z+0.01, levels=np.arange(-2, -1, 0.1))
plt.show()

На полученном графике контуры не отображаются должным образом:

Изображение получается с помощью кода

и, когда фигура вращается в интерактивном режиме, они случайным образом появляются и исчезают с неправильной оценкой того, какая часть должна быть скрыта поверхностью:

Пример рисунка, полученного интерактивным вращением

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

...