Построение эллипсоида с Matplotlib - PullRequest
10 голосов
/ 19 октября 2011

У кого-нибудь есть пример кода для построения эллипсоидов? На сайте matplotlib есть один для сферы, но для эллипсоидов - ничего. Я пытаюсь построить сюжет

x**2 + 2*y**2 + 2*z**2 = c

где c - это константа (например, 10), которая определяет эллипсоид. Я попробовал маршрут meshgrid(x,y), переделал уравнение так, чтобы z было с одной стороны, но проблема sqrt - это проблема. Пример сферы matplotlib работает с углами u,v, но я не уверен, как это сделать для эллипсоида.

Ответы [ 2 ]

18 голосов
/ 19 октября 2011

Вот как вы можете сделать это через сферические координаты:

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

fig = plt.figure(figsize=plt.figaspect(1))  # Square figure
ax = fig.add_subplot(111, projection='3d')

coefs = (1, 2, 2)  # Coefficients in a0/c x**2 + a1/c y**2 + a2/c z**2 = 1 
# Radii corresponding to the coefficients:
rx, ry, rz = 1/np.sqrt(coefs)

# Set of all spherical angles:
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)

# Cartesian coordinates that correspond to the spherical angles:
# (this is the equation of an ellipsoid):
x = rx * np.outer(np.cos(u), np.sin(v))
y = ry * np.outer(np.sin(u), np.sin(v))
z = rz * np.outer(np.ones_like(u), np.cos(v))

# Plot:
ax.plot_surface(x, y, z,  rstride=4, cstride=4, color='b')

# Adjustment of the axes, so that they all have the same span:
max_radius = max(rx, ry, rz)
for axis in 'xyz':
    getattr(ax, 'set_{}lim'.format(axis))((-max_radius, max_radius))

plt.show()

Полученный график похож на

enter image description here

Приведенная выше программа на самом деле производит более приятную на вид "квадратную" графику.

Это решение основано на примере в галерее Matplotlib .

9 голосов
/ 19 февраля 2013

Опираясь на ответ EOL. Иногда у вас есть эллипсоид в матричном формате:

A и c Где A - матрица эллипсоида, а c - вектор, представляющий центр эллипсоида.

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

# your ellispsoid and center in matrix form
A = np.array([[1,0,0],[0,2,0],[0,0,2]])
center = [0,0,0]

# find the rotation matrix and radii of the axes
U, s, rotation = linalg.svd(A)
radii = 1.0/np.sqrt(s)

# now carry on with EOL's answer
u = np.linspace(0.0, 2.0 * np.pi, 100)
v = np.linspace(0.0, np.pi, 100)
x = radii[0] * np.outer(np.cos(u), np.sin(v))
y = radii[1] * np.outer(np.sin(u), np.sin(v))
z = radii[2] * np.outer(np.ones_like(u), np.cos(v))
for i in range(len(x)):
    for j in range(len(x)):
        [x[i,j],y[i,j],z[i,j]] = np.dot([x[i,j],y[i,j],z[i,j]], rotation) + center

# plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z,  rstride=4, cstride=4, color='b', alpha=0.2)
plt.show()
plt.close(fig)
del fig

Так что, здесь не так уж много нового, но полезно, если у вас есть эллипсоид в матричной форме, который повернут и, возможно, не центрирован в 0,0,0 и хотите построить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...