我的numpy.ndarray
大小为200x200。我想将其绘制为3D表面,其中x和y是数组的索引,z是该数组元素的值。有没有简单的方法可以做到这一点,还是我必须将我的数组转换成一个长列表?
答案 0 :(得分:0)
例如使用matplotlib:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
#your index
x = np.linspace(1, 200, 200);
y = np.linspace(1, 200, 200)
X, Y = np.meshgrid(x, y); #making a grid from it
fig = plt.figure()
ax = fig.gca(projection='3d')
R = np.sqrt(X**2 + Y**2) #make some calculations on the grid
Z = np.sin(R) #some more calculations
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
ax.set_zlim(-5, 5)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
但是,由于您的数组已经很大,您可能需要考虑使用其他绘图工具,例如mayavi。 matplotlib通常会将完整数组的副本放入绘图中。在处理大数据时,这个内存要求很高。但我不确定mayavi
是否做同样的事。
答案 1 :(得分:0)
您还可以使用mayavi并将数组绘制为具有表示值的不同颜色的平面。它看起来像这样:
import numpy
from mayavi import mlab
mlab.imshow(yourarray)
mlab.show()
备选方案,您可以创建具有地平面高程的点,并获得穿过点的拟合平面。见here:http://docs.enthought.com/mayavi/mayavi/auto/example_surface_from_irregular_data.html#example-surface-from-irregular-data
最适合您的方法取决于数据的连续性。
答案 2 :(得分:0)
如果要在2D网格顶部绘制3D曲面,则可以执行以下操作:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
# create some fake data
array_distribution3d = np.ones((200, 200))
array_distribution3d[0:25, 0:25] = -1
# create the meshgrid to plot on
x = np.arange(0, array_distribution3d.shape[0])
y = np.arange(0, array_distribution3d.shape[1])
# here are the x,y and respective z values
X, Y = np.meshgrid(x, y)
z = []
for i in range(0, array_distribution3d.shape[0]):
z_y = []
for j in range(0, array_distribution3d.shape[1]):
z_y.append(array_distribution3d[i, j])
z.append(z_y)
Z = np.array(z)
# create the figure, add a 3d axis, set the viewing angle
fig = plt.figure(figsize=(12, 9))
ax = fig.add_subplot(111, projection='3d')
ax.view_init(45, 60)
# here we create the surface plot
ax.plot_surface(X, Y, Z)
但是,据我所知,此类数据可以绘制为色图。 可以绘制如下:
import numpy as np
import os.path
import matplotlib.pyplot as plt
array_distribution = np.ones((200, 200))
array_distribution[0:25, 0:25] = -1
fig = plt.imshow(array_distribution)
plt.colorbar(fraction=0.035, pad=0.035, ticks=[-1., 0., 1.])
axes = plt.gca()
axes.set_ylim([0, 200])
figure = plt.gcf()
file = os.path.join('demo1.png')
figure.savefig(file, dpi=250)
plt.close('all')
print('done')