将NumPy ndarray绘制成3D表面

时间:2015-05-26 07:29:16

标签: python numpy matplotlib plot

我的numpy.ndarray大小为200x200。我想将其绘制为3D表面,其中x和y是数组的索引,z是该数组元素的值。有没有简单的方法可以做到这一点,还是我必须将我的数组转换成一个长列表?

3 个答案:

答案 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')