2012-08-01 17 views
10

Próbuję wykreślić niektóre dane HDF w matplotlib. Po importowaniu je za pomocą h5py dane są przechowywane w postaci macierzy, w następujący sposób:matplotlib - 3d powierzchnia z prostokątnego zbioru wysokości

array([[151, 176, 178], 
     [121, 137, 130], 
     [120, 125, 126]) 

W tym przypadku X i Y wartości tylko indeksy pól tablicowych, podczas gdy z jest wartością z określone pole. W postaci (x, y, z) będzie wyglądać następująco:

(1,1,151) 
(2,1,176) 
(3,1,178) 
(1,2,121) 
... 

i tak dalej.

Czy istnieje prosty sposób na wykonanie powierzchni z tego rodzaju danych? Wiem, że mogę zmienić to na krotki (x, y, z) przez iterowanie po całej tablicy, ale może to nie jest potrzebne?

Odpowiedz

28

Aby uzyskać trójwymiarowy wykres powierzchni, należy najpierw utworzyć meshgrid. Można spróbować:

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

X = np.arange(1, 10) 
Y = np.arange(1, 10) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='hot', linewidth=0, antialiased=False) 
ax.set_zlim(-1.01, 1.01) 

fig.colorbar(surf, shrink=0.5, aspect=5) 
plt.show() 

które przyniosą, enter image description here

Jednakże, jeśli tylko odpowiednie informacje w Z-wartości, można po prostu użyć imshow. Tutaj wartości z są reprezentowane przez ich kolor. Można to osiągnąć poprzez:

im = plt.imshow(Z, cmap='hot') 
plt.colorbar(im, orientation='horizontal') 
plt.show() 

które dadzą,

enter image description here

+3

imshow spełnił swoje zadanie, dziękuję! Nie mogę głosować z powodu niskiej reputacji, ale będę o tym pamiętać :) –

Powiązane problemy