Я хотел бы создать трехмерный график поверхности (в идеале такой, как тот, который показан здесь https://matplotlib.org/stable/gallery/m ... r3d_3.html) из трехмерного массива.
Как мне взять один трехмерный массив и создать три необходимых двухмерных массива X,Y,Z?
Один из имеющихся у меня массивов имеет форму [4,3,6]. Так нужно ли мне создавать массивы x,y,z формы [4,3],[4,6] и [3,6]? Это делается с помощью сетки?
Ниже того, что я пробовал:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
example_data = np.array([[[ 0. , -0.17641481, -0.72472288, -1.634733 ,
-2.88745155, -4.45446602],
[-0.13739369, -0.31310624, -0.85886054, -1.76420826,
-3.01012461, -4.56879708],
[-0.35161935, -0.52612019, -1.06770701, -1.96573273,
-3.20127564, -4.74702167]],
[[-0.04258234, -0.21878815, -0.76633309, -1.67490601,
-2.92547351, -4.48988789],
[-0.19878962, -0.37417798, -0.91875395, -1.82200802,
-3.06494007, -4.61990366],
[-0.43114388, -0.60516764, -1.14515408, -2.04045165,
-3.27220115, -4.81316763]],
[[-0.10061408, -0.27653455, -0.82302458, -1.7296353 ,
-2.97729546, -4.53817427],
[-0.27544339, -0.4504148 , -0.99350961, -1.89414589,
-3.1333632 , -4.68370029],
[-0.52562477, -0.69907413, -1.23715577, -2.12921336,
-3.35644715, -4.89172916]],
[[-0.17403085, -0.34958509, -0.89471911, -1.79884052,
-3.04285776, -4.59927476],
[-0.36725838, -0.54171551, -1.08302212, -1.9805198 ,
-3.21529955, -4.76010013],
[-0.63493209, -0.80770802, -1.34358099, -2.23188968,
-3.45389109, -4.9825877 ]]])
'''The code from the link takes 3 2-D arrays as input:'''
X, Y, Z = axes3d.get_test_data(0.05)
'''X,Y,Z all have shape [120,120]. So I need to make 3 2D array
from my example data. I don't know how to do this! I can't do it with
slicing. '''
ax = plt.figure().add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, edgecolor='royalblue', lw=0.5, rstride=8, cstride=8,
alpha=0.3)
'''I can do it like this, with contour plots when I have X,Y,Z as coordinates
and can then add in "data", one axis at a time. But how to I put this into a surface plot instead?
Is my question clearer now?'''
Nx, Ny, Nz = 3, 4, 6
X, Y, Z = np.meshgrid(np.arange(Nx), np.arange(Ny), -np.arange(Nz))
data = example_data
kw = {'vmin': data.min(),'vmax': data.max(),'levels': np.linspace(data.min(), data.max(), 10),}
# Create a figure with 3D ax
fig = plt.figure(figsize=(5, 4))
ax = fig.add_subplot(111, projection='3d')
# Plot contour surfaces
_ = ax.contourf(X[:, :, 0], Y[:, :, 0], data[:, :, 0],zdir='z', offset=0, **kw)
_ = ax.contourf(X[0, :, :], data[0, :, :], Z[0, :, :],zdir='y', offset=0, **kw)
C = ax.contourf(data[:, -1, :], Y[:, -1, :], Z[:, -1, :],zdir='x', offset=X.max(), **kw)