【问题标题】:Is there a way in Matplotlib to plot a function of two variables, y = y(x₀, x₁)? [duplicate]Matplotlib 中有没有办法绘制两个变量 y = y(x₀, x₁) 的函数? [复制]
【发布时间】:2021-03-04 08:57:44
【问题描述】:

我有一个函数,它接受两个输入作为参数,并根据两个输入返回一个输出。

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

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

我使用 matplotlib 来绘制输入 x 和输出 y,但我想不出一种方法来绘制输出相等地取决于两个输入的函数。

【问题讨论】:

  • 在网站上搜索 plt.contourplt.contourf

标签: python matplotlib plot graphing


【解决方案1】:

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

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

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

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]:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    相关资源
    最近更新 更多