表面绘制二维数组

Surface plot a 2d array

我正在尝试从表面示例开始工作:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-1, 20, 0.25)
Y = np.arange(0, 5, 0.25)

X, Y = np.meshgrid(X, Y)


R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
        linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

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

plt.show()

我有以下二维数组:

[[29607.0], [23774.0, 52621.0], [71861.0], [9540.0, 12.9], []]

每个数组对应于 Y 中的一个位置,每个值对应于 X 中的一个位置及其对应的 Z 中的值。例如:

对于 Y= 0,我将 X=1 且 Z=29607.0 对于 Y= 1,我会有 X=1 和 Z=23774.0,X=2 和 Z=52621.0

我已经尝试了几种方法,但我得到的都是错误。

我不确定这是否有助于解决您遇到的任何问题,但您可以使用类似这样的方式将您的值转换为更正常的格式[[x1,y1,z1],[x2,y2,z2]...

arr = [[29607.0], [23774.0, 52621.0], [71861.0], [9540.0, 12.9]]
new_arr = []
for i, sub_arr in enumerate(arr):
  for j, z in enumerate(sub_arr):
    new_arr.append([i+1, j, z])

并从 numpy 版本中获取 X、Y、Z 作为 axis=1 中的切片,即

new_arr = np.array(new_arr)
X = new_arr[:,0]

PS 如果 arr 已经是一个 ndarray 你可以这样做:

new_arr = np.array([[j+1, i, z] for (i, j), z in np.ndenumerate(arr)])