Frage

Ich verwende matplotlib Zeit eine 3D-Streuung zu plotten und während es die Arbeit erledigt wird, kann ich nicht scheinen, einen Weg zu finden, um es zu drehen besser, meine Daten zu sehen.

Hier ist ein Beispiel:

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

würde ich eine Lösung mag, die mich während der Ausführungszeit tun es lässt aber solange ich es drehen kann, und es ist kurz / schnell es geht mir gut damit.

Hier ist ein Vergleich der Diagramme erzeugt, nachdem ein PCA auf die Iris-Datensatz anwenden:
1. MayaVi
alt text
2. matplotlib
alt text

MayaVi macht es einfacher, die Daten zu visualisieren, aber matplotlib sieht professioneller. Matplotlib ist auch leichter.

War es hilfreich?

Lösung

Mit MayaVi , können Sie erstellen eine solche Handlung mit

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

Die GUI ermöglicht eine Drehung über Klicken und Ziehen und Zoomen in / out über einen Rechtsklick und Ziehen.

alt text

Andere Tipps

Nun, zunächst müssen Sie festlegen, was Sie unter „meine Daten besser sehen“ ...

Sie können drehen und zoomen auf dem Grundstück mit der Maus, wenn Sie wollen, zu arbeiten interaktiv.

Wenn Sie gerade wollen, um die Achsen programmatisch drehen, dann ax.view_init(elev, azim) verwenden, wo elev und azim die Elevation und Azimut Winkel (in Grad), dass Sie Ihr Grundstück anzeigen möchten aus.

Alternativ können Sie die ax.elev, ax.azim und ax.dist Eigenschaften benutzen Sie / set die Höhe, Azimut und Abstand von der aktuellen Ansicht Punkt.

Ausleihe der Quelle von dieses Beispiel :

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

Wir haben eine schöne Scatterplot erhalten: alt text

Sie können die Achsen programmatisch drehen, wie gezeigt:

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

Ich hoffe, das hilft ein wenig!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top