Matplotlib 中有没有办法绘制两个变量的函数 y = y(x₀, x₁)?

Is there a way in Matplotlib to plot a function of two variables, y = y(x₀, x₁)?

我有一个函数,它接受两个输入作为参数,returns一个基于两个输入的输出。

两个输入,rE 的范围分别在 3-14 和 0.05-0.75 之间,将用于创建一些值对于基于某些间隔的输入。

每组两个输入(rE)将生成一个输出。我想使用 Python 的 Matplotlib 库根据该数据绘制函数。

我已经使用 matplotlib 绘制输入 x 和输出 y 的图形,但我想不出一种方法来绘制其输出同样取决于两个输入的函数。

你想要做的最关键的一点是理解 Matplotlib 要求数据组织在二维网格中,因此你可以方便地利用 Numpy 对多维数据结构进行操作的能力来计算数据。

  1. 用网格的坐标计算两个一维数组——在这个例子中,网格点是等距的,但网格也可以是不规则的,
  2. 从两个一维数组中,使用 numpy.meshgrid,计算两个包含的二维数组,第一个是所有网格点中的 x₀ 坐标,第二个是 x₁ 所有网格点的坐标。
  3. 使用启用矢量的 Numpy 的数学函数,一次计算网格上 y 的值,使用二维数组作为 x₀x₁,
  4. 绘制等高线,黑色,使用相对较少的级别以避免拥挤的图形,
  5. 绘制y的颜色映射表示,这次我们可以使用更多的级别来产生连续效果,
  6. 在等高线上添加标签(注意我们使用contour返回的对象)并添加颜色条来解释图中的值(注意我们使用[=14]返回的对象=]):

这是实现上面冗长解释的简单代码:

In [35]: import numpy as np
    ...: import matplotlib.pyplot as plt
    ...: 
    ...: X0 = np.linspace(3, 14, 111)
    ...: X1 = np.linspace(0.05, 0.75, 71)
    ...: x0, x1 = np.meshgrid(X0, X1)
    ...: y = np.cos(x0-10*x1)*(x0-40*(x1-0.2)**2)
    ...: 
    ...: ctr = plt.contour( x0, x1, y, levels=4, colors='k')
    ...: fil = plt.contourf(x0, x1, y, levels=60)
    ...: plt.clabel(ctr)
    ...: plt.colorbar(fil)
    ...: plt.show()


另一种可能性是使用 plot_surface 方法制作 3D 图。 plot_surface 方法仅适用于使用关键字参数 projection='3d' 实例化的 Axes,因此我们不能像前面的示例那样使用便利的 plt 命名空间……

我们讨论的关于网格的所有内容仍然有效,请求参数的签名是相同的,…(x0, x1, y, **kwd_args),如果您遵循上一个示例,那么该示例因此很简单,但它使用了几个技巧

  1. 当您在计算机上绘制曲面时,您可以随意旋转图形以从不同的角度查看数据,当您以传统方式(例如,在 Stack Overflow 上)发布图形时,您会丢失这种互动。 This answer 向我介绍了一种可以缓解该问题的技术。
  2. 如果您想将颜色图放置在多个子图的旁边,可能很难正确放置它,除非您找到 this answer

同样,代码及其乘积

In [41]: fig, axes = plt.subplots(2,2,figsize=(8,6),
    ...:                          constrained_layout=True,
    ...:                          subplot_kw=dict(projection='3d'))
    ...: surfs = [ax.view_init(elev=10.+i*10, azim=25+i*25) or
    ...:          ax.plot_surface(x0, x1, y, cmap='viridis')
    ...:              for i, ax in enumerate(axes.flat)]
    ...: fig.colorbar(surfs[0], ax=axes.flat, aspect=50);

In [42]: