Un modo semplice per tracciare una dispersione 3d in Python che posso ruotare attorno?
-
12-10-2019 - |
Domanda
Al momento sto usando matplotlib per tracciare una dispersione 3d e mentre ottiene il lavoro fatto, non riesco a trovare un modo per ruotarlo per vedere i miei dati migliori.
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()
Mi piacerebbe 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 delle trame prodotte dopo l'applicazione di un APC per l'iride set di dati:
1. Mayavi
2. matplotlib
Mayavi rende più facile visualizzare i dati, ma matplotlib sembra più professionale. Matplotlib è anche più leggero.
Soluzione
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 clic e trascinando, e lo zoom in / out attraverso il tasto destro del mouse e trascinando.
Altri suggerimenti
Bene, in primo luogo è necessario definire cosa si intende per "vedere i miei dati meglio" ...
È possibile ruotare e ingrandire il grafico usando il mouse, se hai intenzione di 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 l'elevazione e azimut angoli (in gradi) che si desidera visualizzare il plot da.
In alternativa, è possibile utilizzare i ax.elev
, ax.azim
e proprietà ax.dist
per ottenere / impostare l'elevazione, azimuth e la distanza del punto di vista corrente.
Prendendo in prestito il fonte da questo esempio :
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()
ottenere una bella grafico a dispersione:
È possibile ruotare gli assi programmaticamente come indicato:
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()
La speranza che aiuta un po '!