绘制3D Meshgrid:

时间:2017-06-27 17:16:15

标签: python-2.7 numpy matplotlib spyder

我正在使用Spyder Interface(Python 2.7)来数字解决PDE问题。我将代码设置为关于位置和时间计算U的位置。 U是我代码中的[nxm]矩阵,其中n是位置,m是时间。因此,在每个U [n,m]处,代码在第m次给出第n个位置。有没有办法可以利用这样的矩阵在python中制作网格图。我搜索过,但是例如numpy的网格只处理数组。谢谢。

[[ 1.20643447  1.20520185  1.20397894 ...,  1.04589795  1.04587534 1.04585286]
[ 1.40901699  1.40658211  1.4041664  ...,  1.09172525  1.09168043 1.09163586]
[ 1.6039905   1.6004133   1.59686428 ...,  1.13741248  1.13734625 1.1372804 ]..., 
[ 2.3960095   2.3995867   2.40313572 ...,  2.54969453  2.55003659 2.55037764]
[ 2.59098301  2.59341789  2.57981471 ...,  2.59750546  2.59785406 2.59820163]
[ 2.79356553  2.74473913  2.71231633 ...,  2.64640578  2.64675767 2.64710852]]

这些是你对我吐的外壳的许多价值。正如您所看到的,我将处理600个不同的阵列,因为矩阵设置为在特定时间和位置找到U.共计600个时间步。 This is a example of a type of graph that I am trying to reproduce.

1 个答案:

答案 0 :(得分:4)

请尝试使用搜索功能;您可以在Overflow上绘制曲面上的许多其他线程中找到工作代码here

我想你可能会在这里混淆一​​些术语。您有一个值矩阵,它对应于二维函数的值;这不是网格。在matplotlib中,您可以通过多种方式可视化三维矩阵,通常为surfacewireframeimage(作为热图)。< / p>

函数np.meshgrid()为您提供N - 维度索引。对于nm向量而不是矩阵U,您需要将其转换为与矩阵形状相同的多维数组。幸运的是,matplotlib并不关心U是矩阵还是向量。

例如np.meshgrid()

>>> t = np.linspace(0,60,6000)
>>> x = np.linspace(0,2*np.pi,3600)
>>> T, X = np.meshgrid(t, x)
>>> t.shape
(6000,)
>>> x.shape
(3600,)
>>> T.shape
(3600, 6000)
>>> X.shape
(3600, 6000)

现在要创建一个函数U(x,t)

>>> U = np.matrix(x[:, np.newaxis] * t) # broadcast
>>> U.shape
(3600, 6000)

要绘制曲面,您可以使用surf Axes3D中的matplotlib函数,但您也可以使用上面链接的线框或图像方法。

>>> import matplotlib.pyplot as plt
>>> import pylab
>>> from mpl_toolkits.mplot3d import Axes3D

>>> fig = plt.figure()
>>> ax = fig.gca(projection='3d')
>>> surf = ax.plot_surface(X,T,U)
>>> plt.show()

Surface plot