2011-01-19 2 views
16

Actuellement, j'utilise matplotlib pour tracer une dispersion 3d et, même si le travail est fait, je n'arrive pas à trouver un moyen de le faire pivoter pour mieux voir mes données.Un moyen facile de tracer une dispersion 3D en Python que je peux faire pivoter?

Voici un exemple:

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

Je voudrais une solution qui me permet de le faire pendant le temps d'exécution, mais aussi longtemps que je peux le faire pivoter et je suis est courte/rapide bien avec elle.

Voici une comparaison des parcelles produites après l'application d'un PCA à l'ensemble de données de l'iris:
1. mayavi
alt text
2. matplotlib
alt text

mâyâvi facilite la visualisation des données, mais MatPlotLib semble plus professionnel. Le matplotlib est également plus léger.

Répondre

11

En utilisant mayavi, vous pouvez créer un tel complot avec

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

L'interface graphique permet une rotation via cliquant-glisser, et le zoom avant/arrière via un clic droit-glisser.

alt text

+0

zoom dans celui-ci est meilleur car les points augmentent en taille que vous zoomez (matplotlib augmente juste la distance qui rend le zoom pas aussi utile) et aussi matplotlib dessine la boîte d'axe qui ne suit pas le zoom. Bien que celui-ci soit beaucoup plus lourd/plus lent, il est probablement préférable de ne l'utiliser que lorsque vous devez zoomer. – pnodbnda

+0

Cette ligne ('import enthought.mayavi.mlab as mylab') ne fonctionnait pas pour moi. "enthought" n'était apparemment pas un module. – Richard

+0

@Richard: Avez-vous installé 'mayavi'? L'installation devrait être accompagnée d'instructions sur la façon d'importer le module mayavi. – unutbu

24

Eh bien, vous devez d'abord définir ce que vous entendez par « voir mes données mieux » ...

Vous pouvez faire pivoter et zoomer sur le terrain à l'aide de la souris, si vous êtes vouloir travailler de manière interactive.

Si vous êtes juste vouloir faire tourner les axes programatically, puis utilisez ax.view_init(elev, azim)elev et azim sont les angles d'élévation et d'azimut (en degrés) que vous souhaitez voir votre parcelle de.

Vous pouvez également utiliser les ax.elev, ax.azim et ax.dist propriétés pour obtenir/régler l'altitude, l'azimut et la distance du point de vue actuel.

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

Nous obtenons une belle scatterplot: alt text

Vous pouvez faire pivoter les axes programatically comme le montre:

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

Espérons que ça aide un peu!

+0

drôle, je ne pouvais pas le faire tourner avant mais maintenant ça marche. allez comprendre. J'utilise ubuntu 10.10 avec python 2.6 si cela fait une différence. – pnodbnda

+0

mplot3d est très pratique et plus léger que mayava. Mais notez que si vous avez besoin de scènes 3D complexes, mplot3d recommande d'utiliser MayaVi. Par exemple. voir la réponse ci-dessus par unutbu. – nealmcb

+0

mplot3d est juste HORRIBLE! il n'a même pas de fonction pour déplacer le centre de rotation de l'intrigue qui est une chose critique dans les tracés 3d. – Mehdi

Questions connexes