Я хотел бы нарисовать поверхность и некоторые из ее контуров 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 года, это считается ограничением возможностей нанесения матполиба? И есть ли альтернативный способ, используя какую-то другую графическую библиотеку?