购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 曲面图和等高线图

Matplotlib还可以以多种方式绘制三维数据。在显示此类数据时,两种常见的选择是曲面图和等高线图(类似于地图上的等高线)。在接下来的示例中,我们将看到绘制三维数据曲面图,以及三维数据等高线图的方法。

2.6.1 准备工作

要绘制三维数据,需要将 x y z 三个分量排列成二维数组。其中, x y 分量的维度必须与 z 分量相同。为了演示,我们将绘制以下函数对应的曲面图:

f ( x , y ) = exp(-(( x -2) 2 +( y -3) 2 )/4)-exp(-(( x +3) 2 +( y +2) 2 )/3)

对于三维数据,我们不能只使用pyplot接口中的例程进行绘图,需要从Matplotlib导入另外一些函数。我们看看接下来该怎么做。

2.6.2 实现方法

我们想在-5≤ x ≤5和-5≤ y ≤5范围内绘制函数 f x , y )。第一个任务就是要创建合适的网格来表示( x , y )数据对,以此来计算函数值。

1.我们首先使用np.linspace在这些范围内生成合理数量的点:

2.现在,我们需要创建一个网格来生成 z 值。为此,我们使用np.meshgrid例程:

3.现在,我们可以创建要绘制的 z 值,这些值包含每个网格点处对应的函数值:

4.为了绘制三维曲面图,我们需要加载Matplotlib中的mplot3d工具包,它包含在Matplotlib包中。虽然我们在代码中不会显式地使用它,但它在后台帮助Matplotlib使用三维绘图工具:

5.接下来,我们创建一个新图形和一组三维坐标轴对象:

6.现在,我们可以在这些坐标轴上调用plot_surface方法来绘制数据(将颜色图设置为灰色,以便在输出时有更好的显示效果。请参阅2.6.4节以获取更详细的解析):

7.在三维图形中添加坐标轴标签非常重要,可以避免读图的人在显示的图形中分不清各轴。我们还为图形设置了标题:

你可以使用plt.show例程在新窗口中显示图形(如果你在交互式环境中使用Python,而不是在Jupyter notebook或IPython控制台上使用),或者使用plt.savefig保存图形到文件中。上述操作的结果如图2.6所示。

图2.6 由Matplotlib生成的三维曲面图

8.等高线图的绘制不需要mplot3d工具包,pyplot接口中有一个contour例程用于生成等高线图。然而,与通常的二维绘图例程不同,contour例程需要与plot_surface方法相同的参数。我们使用以下程序生成图形:

结果如图2.7所示。

这里用同心圆环清楚地显示了函数的峰值和“盆地”。在图形的右上角,阴影较亮,表示函数值递增;在左下角,阴影变暗,表示函数值递减。在它们之间显示了分隔函数值增加和减少区域的曲线。

图2.7 使用Matplotlib按默认设置绘制的等高线图

2.6.3 原理解析

在Matplotlib中,mplot3d工具包提供了Axes3D对象,这是Matplotlib包中Axes对象的三维版本。通过在Figure对象的axes方法中使用projection="3d"关键字参数,可以将Axes3D对象添加到图形中。曲面图是通过在三维投影中绘制相邻点之间的四边形来实现的,就像通过连接相邻点的直线来近似二维曲线一样。

plot_surface方法需要以二维数组的形式提供 z 值,该数组在( x , y )坐标对的网格上进行赋值编码。我们创建了 x y 的取值范围,但如果只是在这些数组对应的点上计算函数值,那么将沿着一条直线得到函数值,而不是在整个网格上获得值。相反,我们使用meshgrid例程,该例程接受两个数组X和Y,并从中创建一个网格,其中包含X和Y中所有可能的值的组合。网格化操作的输出是一对二维数组,我们可以在这些数组上计算函数值。然后,我们将这三个二维数组都提供给plot_surface方法。

2.6.4 更多内容

在上文中描述的contour和plot_surface例程,仅适用于高度结构化的数据,其中 x y z 分量都被排列成网格。不幸的是,真实生活中的数据很少是如此结构化的。在这种情况下,你需要在已知点之间执行某种插值,以获得均匀网格上的近似值,然后才能绘制该网格。执行此插值的常见方法是通过在( x , y )对的集合上进行三角剖分,然后使用每个三角形的顶点上的函数值来估计网格点上的值。幸运的是,Matplotlib有一种方法可以执行所有这些步骤,然后绘制结果,即plot_trisurf例程。我们在这里简要解释一下如何使用它。

1.为了说明使用plot_trisurf的方法,我们将绘制以下数据的曲面图和等高线图:

2.这次,我们将在同一个图上用两个单独的子图分别绘制曲面和等高线(近似值)。为此,我们向包含曲面的子图提供projection="3d"关键字参数。我们使用plot_trisurf方法在三维坐标轴上绘制近似的曲面,在二维坐标轴上使用tricontour方法绘制近似的等高线:

3.现在,我们可以使用以下命令绘制三角形曲面的等高线:

我们在figure对象中包含了tight_layout=True的关键字参数,以保存后续对plt.tight_layout例程的调用。结果如图2.8所示。

图2.8 使用三角剖分法用非结构化数据生成近似曲面图和等高线图

除了曲面绘图例程之外,Axes3D对象还具有用于简单三维绘图的plot(或plot3D)例程,除了在三维坐标轴对象上执行之外,其工作方式与通常的plot例程相同。此方法也可用于在其中一个坐标轴上绘制二维数据。

2.6.5 另请参阅

Matplotlib是Python的首选绘图库,但也存在其他选择。我们将在第6章中介绍Bokeh库。还有其他库,如Plotly(https://plotly.com/python/),简化了创建某些类型的图形和添加更多功能(如交互式图形)的过程。 EgBEyG2UzC50UL+MqGLBDZr4v39u8BDPuv4Ox3MyW6tXSzkg3KiN2PSQzZ9U4+Zp

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开