¿Alguna forma fácil de trazar una dispersión 3D en Python que pueda girar?

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

Aquí hay 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 permita hacerlo durante el tiempo de ejecución, pero siempre que pueda rotarla y sea breve / rápida, estoy de acuerdo.

Aquí hay una comparación de los gráficos producidos después de aplicar una PCA al conjunto de datos del iris:
1. mayavi
texto alternativo
2. matplotlib
texto alternativo

Mayavi facilita la visualización de los datos, pero MatPlotLib parece más profesional. Matplotlib también es más ligero.

Usando mayavi , puedes crear una ttwig 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 haciendo clic y arrastrando, y el acercamiento / alejamiento haciendo clic con el botón derecho y arrastrando.

texto alternativo

Bueno, primero debe definir lo que quiere decir con “ver mejor mis datos” …

Puede rotar y ampliar la gráfica con el mouse, si desea trabajar de forma interactiva.

Si solo desea rotar los ejes de forma programática, use ax.view_init(elev, azim) donde azim y azim son los angularjs de elevación y acimut (en grados) desde los que desea ver su gráfico.

Alternativamente, puede usar las ax.elev , ax.azim y ax.dist para obtener / configurar la elevación, el acimut y la distancia del punto de vista actual.

Tomando prestada la 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() 

Obtenemos un buen diagtwig de dispersión: texto alternativo

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

texto alternativo

¡Espero que esto ayude un poco!