首页 > 解决方案 > 有人可以解释 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 值需要是二维数组以及在其中放入什么。

谢谢!

标签: pythonarraysmatplotlibcontourcontourf

解决方案


想象一下,您要绘制一个三维图形。你有一组x点和一组y点。目标是z为每对xand生成一个值y,或者换句话说,您需要一个函数f,以便它生成一个值zso that z = f(x, y)

这是一个很好的例子(取自 MathWorks):

冲浪

和坐标分别位于右下角和左下角xy您将拥有一个函数f,以便为每一对xandy生成一个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 = 1numpy.meshgrid为我们提供了在该特定坐标处生成 的值所需的xand对。为了方便起见,它只是分成两个二维数组。yz

现在最终放入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)]

非常仔细地查看xy术语的空间排列。我们为每对x和值生成 9 个唯一y值。值范围从 -1 到 1 ,x对于y. 为 生成此二维数组z后,您可以使用contourf绘制水平集,以便每条等高线将为您提供所有可能的xy和等于 的相同值的值的集合z。此外,在每对相邻的不同线条之间,我们用相同的颜色填充中间的区域。

让我们用一个实际的例子来结束这个。假设我们有函数f(x, y) = exp(-(x**2 + y**2) / 10)。这是一个标准差为 的二维高斯分布sqrt(5)

因此,让我们生成一个xy值的网格,使用它来生成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()

我们得到:

轮廓


推荐阅读