2011-01-19 42 views
16

Actualmente estoy usando matplotlib para trazar una dispersión en 3D y mientras hace el trabajo, parece que no puedo encontrar una manera de rotarlo para ver mejor mis datos.¿Alguna manera fácil de trazar una dispersión en 3D en Python que pueda rotar?

He aquí un ejemplo:

import pylab as p 
import mpl_toolkits.mplot3d.axes3d as p3 

#data is an ndarray with the necessary data and colors is an ndarray with 
#'b', 'g' and 'r' to paint each point according to its class 

... 

fig=p.figure() 
ax = p3.Axes3D(fig) 
ax.scatter(data[:,0], data[:,2], data[:,3], c=colors) 
ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 
fig.add_axes(ax) 
p.show() 

me gustaría una solución que me permite hacerlo durante el tiempo de ejecución, pero siempre que puedo girarlo y es corta/rápida, estoy bien con ella.

He aquí una comparación de los registros efectuados después de aplicar un PCA para el conjunto de datos del iris:
1. Mayavi
alt text
2. matplotlib
alt text

Mayavi hace que sea más fácil visualizar los datos, pero MatPlotLib se ve más profesional. Matplotlib también es más ligero.

Respuesta

11

Usando mayavi, puede crear un gráfico de este tipo con

import enthought.mayavi.mlab as mylab 
import numpy as np 
x, y, z, value = np.random.random((4, 40)) 
mylab.points3d(x, y, z, value) 
mylab.show() 

La GUI permite la rotación a través de hacer clic y arrastrar y hacer zoom in/out a través de clic con el botón derecho y arrastrar.

alt text

+0

ampliar este es mejor porque los puntos aumentan de tamaño a medida que acercas el zoom (matplotlib aumenta solo la distancia que hace que el zoom no sea tan útil) y matplotlib dibuja el cuadro del eje que no sigue el zoom. aunque este es mucho más pesado/más lento, así que probablemente sea mejor usarlo solo cuando tenga que acercarse. – pnodbnda

+0

Esta línea ('import enthought.mayavi.mlab as mylab') no funcionó para mí. 'enthought' aparentemente no era un módulo. – Richard

+0

@Richard: ¿Tiene 'mayavi' instalado? La instalación debe venir con instrucciones sobre cómo importar el módulo mayavi. – unutbu

24

Bueno, primero que hay que definir lo que entendemos por "ver mejor mis datos" ...

Puede rotar y hacer zoom en la trama con el ratón, si estás queriendo trabajar de forma interactiva

Si acaba de querer girar los ejes mediante programación, a continuación, utilizar ax.view_init(elev, azim) donde elev y azim son los ángulos de elevación y azimut (en grados) que desee para ver su parcela de.

Como alternativa, puede utilizar los ax.elev, ax.azim y ax.dist propiedades para obtener/establecer la elevación, acimut y distancia del punto de vista actual.

Tomando prestado el source de this example:

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

def randrange(n, vmin, vmax): 
    return (vmax-vmin)*np.random.rand(n) + vmin 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
n = 100 
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: 
    xs = randrange(n, 23, 32) 
    ys = randrange(n, 0, 100) 
    zs = randrange(n, zl, zh) 
    ax.scatter(xs, ys, zs, c=c, marker=m) 

ax.set_xlabel('X Label') 
ax.set_ylabel('Y Label') 
ax.set_zlabel('Z Label') 

plt.show() 

, obtener una buena dispersión: alt text

Puede girar los ejes programáticamente como se muestra:

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

def randrange(n, vmin, vmax): 
    return (vmax-vmin)*np.random.rand(n) + vmin 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
n = 100 
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: 
    xs = randrange(n, 23, 32) 
    ys = randrange(n, 0, 100) 
    zs = randrange(n, zl, zh) 
    ax.scatter(xs, ys, zs, c=c, marker=m) 

ax.set_xlabel('X Label') 
ax.set_ylabel('Y Label') 
ax.set_zlabel('Z Label') 

ax.azim = 200 
ax.elev = -45 

plt.show() 

alt text

Espero que ayude un poco!

+0

gracioso, no pude hacer que rotar antes, pero ahora funciona. Imagínate. Estoy usando Ubuntu 10.10 con Python 2.6 si hace alguna diferencia. – pnodbnda

+0

mplot3d es muy conveniente y más ligero que el mayava. Pero tenga en cuenta que si necesita escenas 3D complejas, mplot3d recomienda usar MayaVi. P.ej. ver la respuesta anterior por unutbu. – nealmcb

+0

mplot3d es simplemente HORRIBLE! ni siquiera tiene una función para mover el centro de rotación de la trama, que es algo crítico en los trazados en 3D. – Mehdi

Cuestiones relacionadas