python - 有人可以解释 matplotlib 中的 contourf 是如何工作的吗?
问题描述
所以基本上,我需要制作一个表面的等高线图 - 我知道如果我有一个函数,我可以做这样的事情:
x = np.linspace(0, 2, 101)
y = np.linspace(0, 2, 101)
x, y = np.meshgrid(x, y)
fig,ax2 = plt.subplots(1)
ax2.contourf(x,y,q_func(x,y))
但是如果我有一组 x 点、一组 y 点和一组 z 点呢?我不确定为什么 z 点需要是一个二维数组,就像我在数组中放什么一样?
有人可以解释为什么 z 值需要是二维数组以及在其中放入什么。
谢谢!
解决方案
想象一下,您要绘制一个三维图形。你有一组x
点和一组y
点。目标是z
为每对x
and生成一个值y
,或者换句话说,您需要一个函数f
,以便它生成一个值z
so that z = f(x, y)
。
这是一个很好的例子(取自 MathWorks):
和坐标分别位于右下角和左下角x
。y
您将拥有一个函数f
,以便为每一对x
andy
生成一个z
值。因此,在您提供的代码中,numpy.meshgrid
调用将生成两个 2D 数组,这样对于每个唯一的空间位置,我们将观察到该位置唯一的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 btw 开始索引)。这意味着在这个空间位置,我们将有坐标x = 0.
和y = 1
。 numpy.meshgrid
为我们提供了在该特定坐标处生成 的值所需的x
and对。为了方便起见,它只是分成两个二维数组。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
和值生成 9 个唯一y
值。值范围从 -1 到 1 ,x
对于y
. 为 生成此二维数组z
后,您可以使用contourf
绘制水平集,以便每条等高线将为您提供所有可能的x
值y
和等于 的相同值的值的集合z
。此外,在每对相邻的不同线条之间,我们用相同的颜色填充中间的区域。
让我们用一个实际的例子来结束这个。假设我们有函数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()
我们得到:
推荐阅读
- fortran - gfortran中的并行编程,奇怪吗?结果是 hello 程序
- pandas - 如何打印所有列的列表?
- javascript - 我可以使用 2D 数组在 JS 中创建井字游戏 AI 吗?
- html - 如何使非空白选择器更具选择性
- javascript - 如何防止图像在移动应用中滚动时移动
- google-cloud-platform - 存储桶未显示在 Google 存储列表中,并且每个命令都拒绝访问
- r - 如何根据字符串而不是值更改闪亮仪表板中信息框的颜色?
- spartacus-storefront - 如何根据 Spartacus 中的用户配置文件自动更改站点之间的货币
- c++ - 如何在c ++中使用kill函数杀死进程?
- typescript - 在 TypeScript 中按类型排除函数参数