假设您要绘制一个三维图形。您有一组x 点和一组y 点。目标是为每对x 和y 生成一个值z,或者换句话说,您需要一个函数f,以便它生成一个值z,以便z = f(x, y)。
这是一个很好的例子(取自 MathWorks):
x 和 y 坐标分别位于右下角和左下角。您将拥有一个函数f,这样对于每对x 和y,我们生成一个z 值。因此,在您提供的代码中,numpy.meshgrid 调用将生成两个二维数组,这样对于每个唯一的空间位置,我们将观察到该位置唯一的 x 和 y 值。
举个例子,我们举一个很小的例子:
In [1]: import numpy as np
In [2]: x, y = np.meshgrid(np.linspace(-1, 1, 3), np.linspace(-1, 1, 3))
In [3]: x
Out[3]:
array([[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]])
In [4]: y
Out[4]:
array([[-1., -1., -1.],
[ 0., 0., 0.],
[ 1., 1., 1.]])
以第 2 行和第 1 列为例(我从 0 开始索引)。这意味着在这个空间位置,我们将拥有坐标x = 0. 和y = 1。 numpy.meshgrid 为我们提供了 x 和 y 对,这是在该特定坐标处生成 z 的值所需的。为了方便,它只是分成了两个二维数组。
现在最后放入您的z 变量的是它应该使用函数f 并处理x 及其对应的y 中每个值的输出。
明确地,您需要制定一个二维的z 数组,这样:
z = [f(-1, -1) f(0, -1) f(1, -1)]
[f(-1, 0) f(0, 0) f(1, 0)]
[f(-1, 1) f(0, 1) f(1, 1)]
非常仔细地查看x 和y 术语的空间排列。我们为每对 x 和 y 值生成 9 个唯一值。 x 的值从 -1 到 1,y 的值相同。为z 生成此二维数组后,您可以使用contourf 绘制水平集,这样每条等高线将为您提供所有可能的x 和y 值的集合,它们等于@ 的相同值987654364@。此外,在每对相邻的不同线条之间,我们用相同的颜色填充中间的区域。
让我们用一个实际的例子来结束这个。假设我们有函数f(x, y) = exp(-(x**2 + y**2) / 10)。这是一个标准差为sqrt(5) 的二维高斯。
因此,让我们生成x 和y 值的网格,使用它来生成z 值并绘制contourf 图:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 101)
y = x
x, y = np.meshgrid(x, y)
z = np.exp(-(x**2 + y**2) / 10)
fig,ax2 = plt.subplots(1)
ax2.contourf(x,y,z)
plt.show()
我们得到: