matplotlib — трехмерная поверхность из прямоугольного массива высот

Я пытаюсь построить некоторые данные HDF в matplotlib. После их импорта с помощью h5py данные сохраняются в виде массива, например:

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

В этом случае значения x и y — это просто индексы полей массива, а значение z — это значение конкретного поля. В форме (x,y,z) это будет выглядеть так:

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

и так далее.

Есть ли простой способ сделать поверхностный график из таких данных? Я знаю, что могу изменить это на (x, y, z) кортежи, перебирая по всему массиву, но, может быть, это не нужно?


person Paweł Rumian    schedule 01.08.2012    source источник


Ответы (1)


Если вам нужен трехмерный график поверхности, вы должны сначала создать meshgrid. Можешь попробовать:

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

который сгенерирует введите здесь описание изображения

Однако, если единственная релевантная информация находится в z-значениях, вы можете просто использовать imshow. Здесь z-значения представлены своим цветом. Вы можете добиться этого:

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

Что даст,

введите здесь описание изображения

person imsc    schedule 02.08.2012
comment
imshow сделал свою работу, спасибо! Не могу проголосовать из-за низкой репутации, но буду помнить об этом :) - person Paweł Rumian; 02.08.2012
comment
Как оно отвечает на вопрос? - person Nd.; 27.10.2019