2011-01-19 18 views
16

Attualmente sto usando matplotlib per tracciare una dispersione 3d e, mentre il lavoro viene svolto, non riesco a trovare un modo per ruotarlo per vedere meglio i miei dati.Un modo semplice per tracciare una dispersione 3d in Python che posso ruotare intorno?

Ecco un esempio:

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

Vorrei una soluzione che mi permette di farlo durante il tempo di esecuzione, ma il tempo che posso ruotare ed è a breve/veloce sto bene con esso.

Ecco un confronto tra i lotti prodotti dopo l'applicazione di un PCA per l'iride set di dati:
1. Mayavi
alt text
2. matplotlib
alt text

Mayavi rende più facile visualizzare i dati, ma MatPlotLib sembra più professionale. Matplotlib è anche più leggero.

risposta

11

Utilizzando mayavi, è possibile creare una trama 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() 

L'interfaccia grafica permette la rotazione tramite cliccando e trascinando, e lo zoom in/out attraverso il tasto destro del mouse e trascinando.

alt text

+0

zoom in questo è migliore perché i punti aumentano di dimensioni come lo zoom (matplotlib aumenta solo la distanza che rende lo zoom non utile) e anche matplotlib disegna il riquadro dell'asse che non tiene il passo con lo zoom. anche se questo è molto più pesante/lento, quindi probabilmente è meglio usarlo solo quando devi zoomare. – pnodbnda

+0

Questa riga ('import enthought.mayavi.mlab as mybab') non ha funzionato per me. apparentemente "enthought" non era un modulo. – Richard

+0

@Richard: hai installato 'mayavi'? L'installazione dovrebbe venire con le istruzioni su come importare il modulo mayavi. – unutbu

24

Beh, in primo luogo è necessario definire cosa si intende per "vedere i miei dati meglio" ...

È possibile ruotare e ingrandire il grafico usando il mouse, se siete voler lavorare in modo interattivo.

Se siete semplicemente desideroso di ruotare gli assi programatically, quindi utilizzare ax.view_init(elev, azim) dove elev e azim sono gli angoli di elevazione e azimut (in gradi) che si desidera visualizzare il plot da.

In alternativa, è possibile utilizzare le ax.elev, ax.azim e ax.dist proprietà per ottenere/impostare l'elevazione, azimuth e la distanza del punto di vista corrente.

Prendendo in prestito il source da 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() 

Abbiamo un bel grafico a dispersione: alt text

È possibile ruotare gli assi programmaticamente come mostrato:

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

Spero che questo aiuti un po '!

+0

divertente, non riuscivo a farlo ruotare prima ma ora funziona. vai a capire. sto usando Ubuntu 10.10 con Python 2.6 se fa alcuna differenza. – pnodbnda

+0

mplot3d è molto conveniente e più leggero di mayava. Nota che se hai bisogno di scene 3D complesse, mplot3d ti consiglia di usare MayaVi. Per esempio. vedere la risposta sopra da unutbu. – nealmcb

+0

mplot3d è semplicemente ORRIBILE! non ha nemmeno una funzione per spostare il centro di rotazione della trama che è una cosa fondamentale nei grafici 3D. – Mehdi

Problemi correlati