有人能解释matplotlib中的contourf是如何工作的吗?

2024-05-16 11:13:42 发布

您现在位置:Python中文网/ 问答频道 /正文

所以基本上,我需要做一个曲面的等高线图-我知道如果我有一个函数,我可以做这样的事情:

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值需要是一个2-D数组,以及在里面放什么吗。你知道吗

谢谢!你知道吗


Tags: 函数npfigplt数组事情func曲面
1条回答
网友
1楼 · 发布于 2024-05-16 11:13:42

假设你想画一个三维图形。有一组x点和一组y点。目标是为每对xy生成一个值z,或者换句话说,您需要一个函数f,这样它就生成了一个z的值,这样z = f(x, y)。你知道吗

下面是一个很好的例子(摘自MathWorks):

surf

xy坐标分别位于右下角和左下角。您将拥有一个函数f,这样对于每一对xy,我们生成一个z值。因此,在您提供的代码中,numpy.meshgrid调用将生成两个二维数组,这样对于每个唯一的空间位置,我们将观察该位置唯一的xy值。你知道吗

例如,让我们用一个非常小的例子:

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给出了xy对,这是在特定坐标下生成z值所必需的。为了方便起见,它被分成两个二维阵列。你知道吗

现在,最后要放入z变量的是,它应该使用函数f,并处理x中每个值的输出及其对应的y。你知道吗

显式地,您需要建立一个z数组,它是2D的,这样:

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项的空间排列。我们为每对xy值生成9个唯一值。x值的范围从-1到1,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()

我们得到:

Contour

相关问题 更多 >