您要做的最关键的一点是了解 Matplotlib 要求数据以 2D 网格组织,因此您可以方便地利用 Numpy 对多维数据结构进行操作的能力来计算数据。
- 使用网格坐标计算两个一维数组 - 在示例中,网格点等距分布,但网格也可以是不规则的,
- 从两个一维数组中,使用
numpy.meshgrid,计算两个二维数组,其中第一个是所有网格点的x₀坐标,第二个是x₁坐标在所有网格点中。
- 使用启用矢量的 Numpy 的数学函数,一次计算网格上 y 的值,使用 2D 数组作为 x₀ 和 x₁,
- 用黑色绘制等高线,使用相对较少的层数来避免图形拥挤,
- 绘制y的颜色映射表示,这一次我们可以使用更多的层数来产生连续的效果,
- 在等高线上添加标签(注意我们使用
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),因此如果您遵循上一个示例,则该示例很简单,但它使用了一些技巧
- 当您在计算机上绘制曲面时,您可以随意旋转图形以从不同的角度查看数据,当您以传统方式(例如,在 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]: