Matplotlib - 3d-поверхность из прямоугольного массива высот

Я пытаюсь построить некоторые данные 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), итерируя по всему массиву, но, возможно, он не нужен?

Ответ 1

Если вам нужен 3-й поверхностный график, сначала нужно создать 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()

который будет генерировать, enter image description here

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

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

Что даст,

enter image description here