2016-05-16 21 views
-1

Ich habe ein 2d numpy Array in Python visualisieren müssen. Kein Konturplot, kein Oberflächenplot. Zeichnen Sie für jedes (x, y) -Element im 3D-Array einen Punkt auf einer Z-Achse. Meine Daten sind ein 1024 x 1024 Array, aber ich denke, ich könnte es dezimieren, wenn ich müsste. Ich muss in der Lage sein, das Diagramm mit Mausbewegungen zu drehen, um es aus verschiedenen Perspektiven zu sehen."Schnelles" interaktives Diagramm eines 2d numpy Arrays in Python

Matplotlib kann dies nicht, sogar für ein 100 x 100-Array. Es ist viel viel zu langsam. Ein 100 x 100-Array dauert zwei oder drei Sekunden, um nach dem Ziehen neu gezeichnet zu werden. 1024 x 1024 kommt nicht in Frage.

mlab von Mayavi scheint diese Fähigkeit zu haben, aber der einfachste Versuch stürzt auf meinem System mit wx Fehlern ab. Soweit ich das beurteilen kann, sind Pakete, die schnelle interaktive Rotation (z. B. VTK) bieten, auf das Rendern komplexer 3D-Formen fokussiert und bieten keine einfache API zum Zeichnen von Daten.

Können Sie Optionen vorschlagen?

Meine aktuelle Setup:
OS X 10.11.4
Python 1.7.11
numpy 1.11.0
matplotlib 1.5.1
MayaVi 4.4.0
wx 3.0.0.0

+0

Down-Stimmen ohne Kommentar sind nicht sehr nützlich. – garyp

+0

Sie sagen, was Sie nicht wollen, aber nicht, was Sie eigentlich wollen. –

+0

@ Han-KwangNienhuys Ich denke, mein erster Absatz ist nicht klar. Ich habe ein 2D-Array, ich möchte es in 3D visualisieren, wobei die Z-Achse den Wert des Arrays an jedem Punkt darstellt. Ich möchte es mit Mauszerren drehen können. – garyp

Antwort

0

Diese ist ein xyz-Diagramm mit 20x20 Dezimierung, das ist ungefähr das höchste, das mein Laptop bequem machen wird. Mehr Punkte als das machen sowieso keinen Sinn, da man die einzelnen Punkte nicht mehr auseinander halten kann.

from mpl_toolkits.mplot3d.axes3d import Axes3D 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
X = np.linspace(-3,3,1024) 
Y = np.linspace(-3,3,1024) 
X, Y = np.meshgrid(X, Y) 
Z = np.exp(-(X**2+Y**2)) 
ax = fig.add_subplot(1, 1, 1, projection='3d') 
ax.plot_wireframe(X, Y, Z, rstride=20, cstride=20) 

plt.show(block=False) 
raw_input('Press ENTER') 

Sie könnten über Gnuplot planen. Es wird die interaktive Rotation viel schneller als Matplotlib behandeln. Beispiel:

set isosamp 50 
set xrange [-3:3] 
set yrange [-3:3] 
splot exp(-x**2-y**2) 

Es ist ein Python-Modul Gnuplot.py die es erlauben, sollten Sie es von Python direkt zu verwenden.