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

2.2 使用Matplotlib进行基本绘图

图形是理解行为的重要组成部分。通过简单地绘制函数或数据,我们可以学到很多原本可能隐藏的信息。在本节中,我们将介绍如何使用Matplotlib绘制简单函数或数据,设置图形样式,并为图形添加标签。

Matplotlib是一个非常强大的绘图库,这意味着使用它执行简单任务可能会让人望而生畏。对于那些习惯于使用MATLAB和其他数学软件包的用户来说,Matplotlib提供了一种基于状态的接口,称为pyplot。此外,还有一种 面向对象的接口 (OOI),它可能更适合更复杂的绘图。在任一情况下,pyplot接口都是创建基本对象的便捷方式。

2.2.1 准备工作

通常,你想要绘制的数据将存储在两个独立的NumPy数组中,为了清晰起见,我们将它们分别标记为x和y(在实践中数据的命名方式并不重要)。我们将演示函数图形的绘制过程,因此我们将生成一个数组x,并使用该函数生成相应的y值。我们将在相同的坐标轴上绘制3个不同的函数,范围为-0.5≤ x ≤3:

让我们使用Matplotlib在Python中绘制这3个函数。

2.2.2 实现方法

在绘制函数之前,我们必须生成要绘制的x和y数据。如果要绘制已经存在的数据,可以跳过这些命令。我们需要创建一组覆盖所需范围的x值,然后使用函数创建相应的y值:

1.NumPy中的linspace例程非常适合创建用于绘图的数字数组。默认情况下,它会在指定的参数之间创建50个等间距的点。点的数量可以通过提供额外的参数来定制,但在大多数情况下,50个点已经足够了:

2.一旦我们创建了x值,就可以生成相应的y值:

3.要绘制数据,首先需要创建一个新的图形并附加坐标轴对象,可以通过不提供任何参数地调用plt.subplots例程来实现:

4.现在,我们在ax对象上使用plot方法绘制第一个函数。前两个参数是要绘制的 x y 坐标,第三个(可选)参数指定线的颜色为黑色:

5.为了帮助区分其他函数的图形,我们使用虚线和点画线绘制这些函数:

6.每个图形都应该有标题和坐标轴标签。在本例中,没有什么有趣的内容可以用来标记坐标轴,因此我们只是用x和y来标记它们:

7.还可以添加图例,以帮助你在不必查看其他地方的情况下区分不同函数的图形:

8.最后,让我们对图形进行注释,如使用文本标记函数 g h 之间的交点:

这将在一个新图形上绘制y值相对x值的关系图。如果你正在使用IPython控制台或Jupyter notebook,图形应该会自动显示;否则,你可能需要调用plt.show函数来使图形显示出来:

如果使用plt.show,该图形应该会出现在新窗口中。在本章的后续示例中,我们不会再添加这个命令,但你应该知道,如果你不是在自动渲染图形的环境(比如IPython控制台或Jupyter notebook)中工作,你就需要使用它。生成的图形应类似于图2.1中的图形。

图2.1 同一个坐标系上的3个函数,每个函数都有不同的样式,图中带有标签、图例和注释

注意

如果你是在Jupyter notebook中使用的subplots命令,必须将对subplots例程的调用和其他绘图命令放在同一个单元格中,否则图形将无法生成。

2.2.3 原理解析

这里,我们使用了面向对象的接口(OOI),因为它允许我们精确地跟踪绘图的图形(figure)对象和轴域(axes)对象。在只有一个图形和轴域的情况下,这并不重要,但我们可以很容易地想象到可能同时有两个或更多图形和轴域的情况。遵循这种模式的另一个原因是在添加多个子图时保持一致,详见2.3节。

你可以使用以下命令序列,在基于状态的接口中生成与上述示例相同的图形:

如果当前没有Figure或Axes对象,plt.plot例程将创建一个新的Figure对象,向该图形添加一个新的Axes对象,并使用绘制的数据填充这个Axes对象。返回一个包含所画线条的句柄列表,其中每个句柄都是Lines2D对象。在这种情况下,此列表将包含一个单独的Lines2D对象。我们可以稍后使用这个Lines2D对象来进一步自定义线条的外观。

请注意,在前面的代码中,我们将所有对plot函数的调用组合在了一起。如果你使用的是OOI,这样组合也是可行的。基于状态的接口将参数传递给Axes方法,用于给检索或创建的Axes对象设置属性。

Matplotlib的对象层与一个底层的后端进行交互,后者负责生成图形。plt.show函数向后端发出指令以渲染并呈现当前图形。有许多后端可与Matplotlib一起使用,可以通过设置MPLBACKEND环境变量、修改matplotlibrc文件或在Python中调用matplotlib.use并提供备用后端的名称来自定义。默认情况下,Matplotlib会基于可用的后端,选择适合平台(Windows、macOS、Linux)和符合目的(交互或非交互)的后端。例如,在作者的系统上,默认使用QtAgg后端,这是一个基于 Anti-Grain Geometry (AGG)库的交互式后端。或者,也可以使用QtCairo后端,该后端使用Cairo库进行渲染。

注意

plt.show函数的作用不仅仅是在图形上调用show方法,它还会连接到一个事件循环中以正确显示图形。因此应该使用plt.show例程来显示图形,而不是在Figure对象上使用show方法。

用于快速指定线条样式的 格式字符串 由三个可选部分组成,每个部分都包含一个或多个字符。第一部分控制标记样式(即在每个数据点处输出的符号);第二部分控制连接数据点的线条样式;第三部分控制图形的颜色。在这个例子中,我们只指定了线条样式。然而,可以同时指定线条样式和标记样式,或者只指定标记样式。如果只提供标记样式,则在数据点之间不绘制连接线。这对绘制不需要在数据点之间进行插值的离散数据非常有用。

有四种线条样式参数可用:实线(-)、虚线(--)、点画线(-.)和点线(:)。在格式字符串中只能指定有限数量的颜色,它们是红色、绿色、蓝色、青色、黄色、洋红色、黑色和白色。格式字符串中表示颜色的字符是每种颜色对应英文单词的第一个字母(黑色除外),因此这些颜色对应的字符分别是r、g、b、c、y、m、k和w。

在上述例子中,我们看到了这些格式字符串的三个示例:单一的k格式字符串只改变了线条的颜色,并保持其他设置为默认值(小的点标记和不间断的线);k--和k.-格式字符串同时改变了颜色和线条样式。有关更改点样式的示例,请参见2.2.4节和图2.2。

图2.2 三组数据的散点图,每组数据使用不同的标记样式进行绘制

set_title、set_xlabel和set_ylabel方法简单地将文本参数添加到Axes对象的相应位置。前面代码中调用的legend方法,按照图形顺序给数据集添加相应的标签,在本例中依次为y1、y2和y3。

可以向set_title、set_xlabel和set_ylabel例程提供许多关键字参数,以控制文本的样式。例如,fontsize关键字可用于指定标签字体的大小,通常以pt(磅)为单位。

Axes对象上的annotate方法可以将任意文本添加到图的特定位置。此例程接受两个参数:要显示的字符串形式的文本和应该放置注释的点的坐标。此例程还接受其他关键字参数,可用于自定义注释的样式。

2.2.4 更多内容

plt.plot例程接受可变数量的位置输入。在前面的代码中,我们提供了两个位置参数,它们被解释为x值和y值(按照顺序)。如果我们只提供了一个数组,那么plot例程将会根据数据在数组中的位置进行绘制。也就是说,x的值取为0、1、2,以此类推。

plot方法还接受许多关键字参数,这些参数也可以用于控制图形的样式。如果同时存在关键字参数和格式字符串参数,关键字参数优先,并且它们适用于调用此绘制命令的所有数据集。控制标记样式的关键字是marker,控制线条样式的关键字为linestyle,控制颜色的关键字为color。color关键字参数接受许多不同的格式来指定颜色,包括(r, g, b)元组确定的RGB值(其中每个字符都是0到1之间的浮点数或十六进制字符串)。可以使用linewidth关键字参数来控制绘制的线条宽度,该参数应提供一个float数值。还有许多其他关键字参数可以传递给plot,Matplotlib文档中给出了这样的参数列表。许多关键字参数都有简写的版本,例如c表示color,lw表示linewidth。

在这个示例中,我们绘制了大量的坐标点,这些坐标点是根据选定的 x 值用求值函数生成的。在其他应用中,人们可能有来自真实世界的采样数据(而不是生成的数据)。在这种情况下,最好去掉连接线,只在点上绘制标记。以下是如何实现这一点的示例:

这些命令的结果显示在图2.2中。Matplotlib有一种专门用于生成散点图的方法,称为scatter。

可以使用Axes对象上的方法来自定义图形的其他方面。可以使用Axes对象上的set_xticks和set_yticks方法修改坐标轴刻度,使用grid方法配置网格的外观。在pyplot接口中还有一些便捷的方法,它们可以将这些修改应用于当前的Axes对象(如果存在)。

例如,我们通过使用以下命令修改坐标轴的范围,分别在 x y 坐标轴上每隔0.5的倍数设置一个坐标轴刻度,并在图中添加网格:

请注意,我们将坐标轴的范围设置得稍微大于绘图范围,这是为了避免在绘图窗口的边界上放置标记。

除了这里描述的plot例程之外,Matplotlib还有许多其他绘图例程。例如,有些绘图方法使用不同的坐标轴比例,包括在 x 轴和 y 轴单独使用对数坐标轴(semilogx或semilogy)或同时使用对数坐标轴(loglog)。这些在Matplotlib文档中有详细说明。如果想在Axes对象上绘制离散数据而不连接点,则scatter绘图例程可能很有用,它还允许对标记的样式进行更多的控制。例如,可以根据一些额外信息来调整标记的大小。

我们可以使用fontfamily关键字设置不同的字体,其值可以是字体的名称,或者是serif、sans-serif、monospace,它们将选择适当的内置字体。Matplotlib文档中的matplotlib.text.Text类包含了完整的修饰符列表。

在例程中提供usetex=True参数,即可以使用TeX来呈现文本参数以进行额外的格式化。我们将在2.3节的例子中演示标签的TeX格式化方法,如图2.3所示。如果标题或轴标签包含数学公式,这一功能特别有用。不幸的是,如果系统上没有安装TeX,则无法使用usetex关键字参数——在这种情况下,它会导致错误。然而,仍然可以使用TeX语法来格式化标签中的数学文本,但这将由Matplotlib进行排版,而不是由Te X进行排版。 EgBEyG2UzC50UL+MqGLBDZr4v39u8BDPuv4Ox3MyW6tXSzkg3KiN2PSQzZ9U4+Zp

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

打开