【问题标题】:Can someone explain how contourf in matplotlib works? [duplicate]有人可以解释 matplotlib 中的 contourf 是如何工作的吗? [复制]
【发布时间】:2019-06-11 04:40:02
【问题描述】:

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

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 值需要是一个二维数组以及在其中放入什么。

谢谢!

【问题讨论】:

    标签: python arrays matplotlib contour contourf


    【解决方案1】:

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

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

    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 开始索引)。这意味着在这个空间位置,我们将拥有坐标x = 0.y = 1numpy.meshgrid 为我们提供了 xy 对,这是在该特定坐标处生成 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)]
    

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

    让我们用一个实际的例子来结束这个。假设我们有函数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()
    

    我们得到:

    【讨论】:

    • 您花了很多精力解释事情,所以也许考虑在此处删除此答案并将其发布在副本中?
    • @ImportanceOfBeingErnest 谢谢。不知道重复。
    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2021-05-11
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多