2012-06-21 107 views
51

Busco cómo trazar algo con menos instrucciones como sea posible con matplotlib pero no encuentro ayuda para esto en la documentación.Python/matplotlib: trazado de un cubo 3d, una esfera y un vector?

I desea trazar las siguientes cosas:

  • un cubo de alambre centrada en 0 con una longitud lateral de 2
  • una esfera "alambre" centrada en 0 con un radio de 1
  • una punto en las coordenadas [0, 0, 0]
  • un vector que se inicia en este punto y se va a [1, 1, 1]

Cómo hacer eso?

+3

También echa un vistazo a [mayavi2] (http://docs.enthought.com/mayavi/mayavi/auto/examples.html). Es un poco pesado de dependencia, pero tiene algunos comandos de alto nivel realmente impresionantes. Puedo armar una respuesta más detallada basada en ese paquete si lo desea. . . – meawoppl

Respuesta

134

que es un poco complicado, pero se puede dibujar todos los objetos mediante el siguiente código:

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 
from itertools import product, combinations 


fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.set_aspect("equal") 

# draw cube 
r = [-1, 1] 
for s, e in combinations(np.array(list(product(r, r, r))), 2): 
    if np.sum(np.abs(s-e)) == r[1]-r[0]: 
     ax.plot3D(*zip(s, e), color="b") 

# draw sphere 
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j] 
x = np.cos(u)*np.sin(v) 
y = np.sin(u)*np.sin(v) 
z = np.cos(v) 
ax.plot_wireframe(x, y, z, color="r") 

# draw a point 
ax.scatter([0], [0], [0], color="g", s=100) 

# draw a vector 
from matplotlib.patches import FancyArrowPatch 
from mpl_toolkits.mplot3d import proj3d 


class Arrow3D(FancyArrowPatch): 

    def __init__(self, xs, ys, zs, *args, **kwargs): 
     FancyArrowPatch.__init__(self, (0, 0), (0, 0), *args, **kwargs) 
     self._verts3d = xs, ys, zs 

    def draw(self, renderer): 
     xs3d, ys3d, zs3d = self._verts3d 
     xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) 
     self.set_positions((xs[0], ys[0]), (xs[1], ys[1])) 
     FancyArrowPatch.draw(self, renderer) 

a = Arrow3D([0, 1], [0, 1], [0, 1], mutation_scale=20, 
      lw=1, arrowstyle="-|>", color="k") 
ax.add_artist(a) 
plt.show() 

output_figure

5

Para dibujar sólo la flecha, existe un método más fácil: -

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.set_aspect("equal") 

#draw the arrow 
ax.quiver(0,0,0,1,1,1,length=1.0) 

plt.show() 

carcaj se puede utilizar para trazar múltiples vectores de una vez. El uso es el siguiente: - [de http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html?highlight=quiver#mpl_toolkits.mplot3d.Axes3D.quiver]

aljaba (X, Y, Z, U, V, W, ** kwargs)

Argumentos:

X, Y, Z : El x, y, z las coordenadas de los lugares de flecha

U, V, W: componentes El x, y y z de los vectores de flecha

Los argumentos pueden ser de tipo array o escalares.

argumentos de palabra clave:

longitud: [1,0 | flotador] La longitud de cada carcaj, por defecto a 1,0, la unidad es la misma con los ejes

arrow_length_ratio: [0,3 | flotar] La relación de la punta de la flecha con respecto a la aljaba, por defecto a 0,3

pivote: ['cola' | 'Medio' | 'Consejo'] La parte de la flecha que está en el punto de la cuadrícula; la flecha gira alrededor de este punto, de ahí el nombre pivote. El valor predeterminado es 'cola'

normalizar: [False | Verdadero] Cuando es verdadero, todas las flechas tendrán la misma longitud. Por defecto, es False, donde las flechas tendrán diferentes longitudes dependiendo de los valores de u, v, w.

Cuestiones relacionadas