Matplotlib 中有没有办法绘制两个变量的函数 y = y(x₀, x₁)?
Is there a way in Matplotlib to plot a function of two variables, y = y(x₀, x₁)?
我有一个函数,它接受两个输入作为参数,returns一个基于两个输入的输出。
两个输入,r 和 E 的范围分别在 3-14 和 0.05-0.75 之间,将用于创建一些值对于基于某些间隔的输入。
每组两个输入(r 和 E)将生成一个输出。我想使用 Python 的 Matplotlib 库根据该数据绘制函数。
我已经使用 matplotlib 绘制输入 x 和输出 y 的图形,但我想不出一种方法来绘制其输出同样取决于两个输入的函数。
你想要做的最关键的一点是理解 Matplotlib 要求数据组织在二维网格中,因此你可以方便地利用 Numpy 对多维数据结构进行操作的能力来计算数据。
- 用网格的坐标计算两个一维数组——在这个例子中,网格点是等距的,但网格也可以是不规则的,
- 从两个一维数组中,使用
numpy.meshgrid
,计算两个包含的二维数组,第一个是所有网格点中的 x₀ 坐标,第二个是 x₁ 所有网格点的坐标。
- 使用启用矢量的 Numpy 的数学函数,一次计算网格上 y 的值,使用二维数组作为 x₀ 和 x₁,
- 绘制等高线,黑色,使用相对较少的级别以避免拥挤的图形,
- 绘制y的颜色映射表示,这次我们可以使用更多的级别来产生连续效果,
- 在等高线上添加标签(注意我们使用
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)
,如果您遵循上一个示例,那么该示例因此很简单,但它使用了几个技巧
- 当您在计算机上绘制曲面时,您可以随意旋转图形以从不同的角度查看数据,当您以传统方式(例如,在 Stack Overflow 上)发布图形时,您会丢失这种互动。 This answer 向我介绍了一种可以缓解该问题的技术。
- 如果您想将颜色图放置在多个子图的旁边,可能很难正确放置它,除非您找到 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]:
我有一个函数,它接受两个输入作为参数,returns一个基于两个输入的输出。
两个输入,r 和 E 的范围分别在 3-14 和 0.05-0.75 之间,将用于创建一些值对于基于某些间隔的输入。
每组两个输入(r 和 E)将生成一个输出。我想使用 Python 的 Matplotlib 库根据该数据绘制函数。
我已经使用 matplotlib 绘制输入 x 和输出 y 的图形,但我想不出一种方法来绘制其输出同样取决于两个输入的函数。
你想要做的最关键的一点是理解 Matplotlib 要求数据组织在二维网格中,因此你可以方便地利用 Numpy 对多维数据结构进行操作的能力来计算数据。
- 用网格的坐标计算两个一维数组——在这个例子中,网格点是等距的,但网格也可以是不规则的,
- 从两个一维数组中,使用
numpy.meshgrid
,计算两个包含的二维数组,第一个是所有网格点中的 x₀ 坐标,第二个是 x₁ 所有网格点的坐标。 - 使用启用矢量的 Numpy 的数学函数,一次计算网格上 y 的值,使用二维数组作为 x₀ 和 x₁,
- 绘制等高线,黑色,使用相对较少的级别以避免拥挤的图形,
- 绘制y的颜色映射表示,这次我们可以使用更多的级别来产生连续效果,
- 在等高线上添加标签(注意我们使用
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)
,如果您遵循上一个示例,那么该示例因此很简单,但它使用了几个技巧
- 当您在计算机上绘制曲面时,您可以随意旋转图形以从不同的角度查看数据,当您以传统方式(例如,在 Stack Overflow 上)发布图形时,您会丢失这种互动。 This answer 向我介绍了一种可以缓解该问题的技术。
- 如果您想将颜色图放置在多个子图的旁边,可能很难正确放置它,除非您找到 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]: