Pregunta

Actualmente estoy usando matplotlib para trazar una dispersión 3D y mientras se hace el trabajo, me parece que no puede encontrar una manera de hacerlo girar para ver mejor mis datos.

Este es 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
texto alternativo ??
2. matplotlib
text alt

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.

¿Fue útil?

Solución

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 el zoom de entrada / salida a través de un clic derecho y arrastrando.

text alt

Otros consejos

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 usted está 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 propiedades ax.dist para obtener / establecer la elevación, acimut y distancia del punto de vista actual.

Tomando prestado el fuente de este ejemplo :

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()

conseguir un buen diagrama de dispersión: text alt

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()

text alt

Espero que ayude un poco!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top