Matplotlib教程(Python绘图)

本文概述

  • Matplotlib Python图是什么样的?
  • Matplotlib, pyplot和pylab:它们之间有什么关系?
  • Matplotlib图的数据
  • 创建情节
  • 如何更改图形大小
  • 使用Pyplot:绘制例程
  • 自定义你的PyPlot
  • 显示, 保存和关闭情节
  • 自定义Matplotlib
  • 继续学习
人类是非常视觉化的生物:当我们看到视觉化的事物时, 我们会更好地理解事物。但是, 呈现分析, 结果或见解的步骤可能会成为瓶颈:你甚至可能不知道从哪里开始, 或者脑中已经有了正确的格式, 然后提出了诸如” 这是使见解可视化的正确方法吗?我想带给观众吗?” 肯定会引起你的注意。
当你使用Python绘图库Matplotlib时, 回答上述问题的第一步是通过建立有关以下主题的知识:
  • Matplotlib图的剖析:什么是子图?什么是轴?一个数字到底是什么?
  • 绘图创建, 这可能引发以下问题:你究竟需要导入哪个模块(pylab或pyplot?), 如何初始化图形和绘图轴, 如何在Jupyter笔记本中使用matplotlib等问题。
  • 绘制例程, 从简单的数据绘制方式到更高级的可视化数据方式。
  • 基本的绘图自定义, 重点放在绘图图例和文本, 标题, 轴标签和绘图布局。
  • 保存, 显示, 清除, ……绘图:显示绘图, 将一个或多个图形保存到例如pdf文件, 清除轴, 清除图形或关闭绘图等。
  • 最后, 你将简要介绍两种自定义Matplotlib的方法:使用样式表和rc设置。
(要以交互方式练习matplotlib, 请在本中级Python课程开始时尝试免费的Matplotlib章节, 或参阅srcmini的” 使用Matplotlib查看3D体积数据” 教程, 了解如何使用matplotlib的事件处理程序API。)
Matplotlib Python图是什么样的? 乍看起来, 当你开始使用此Python数据可视化库进行绘图时, 似乎要考虑很多组件。你可能会同意我的看法, 这令人困惑, 有时甚至沮丧, 因为看到一些绘图所需的代码量, 却不知道从哪里开始以及应该使用哪些组件。
幸运的是, 该库非常灵活, 并且具有许多方便的内置默认值, 可以极大地帮助你。因此, 你不需要太多的入门知识:你需要进行必要的导入, 准备一些数据, 然后可以借助plot()函数开始进行绘图!准备就绪后, 请不要忘记使用show()函数显示绘图。
看这个例子, 看看它到底有多简单:
请注意, 你在别名plt下导入了matplotlib库的pyplot模块。
恭喜, 你现在已经成功创建了第一个情节!现在, 让我们更详细地看一下结果图:
Matplotlib教程(Python绘图)

文章图片
很好, 不是吗?
从表面上看不到的是-你可能(不自觉地)使用了内置默认值, 这些默认值负责创建基础组件(例如, 图形和轴)。你将在处理pylab和pyplot之间的差异的部分中详细了解这些默认设置。
现在, 你将了解, 当你了解如何实例化基础组件时, 使用matplotlib将会变得更加容易。换句话说, matplotlib图的解剖结构如下所示:
Matplotlib教程(Python绘图)

文章图片
本质上, 你需要考虑两个大组件:
  • 该图是绘制所有内容的整体窗口或页面。在以下几点中, 它是所有组件中的顶级组件。你可以创建多个独立的图形。图形可以包含其他一些内容, 例如字幕, 它是图形的居中标题。你还会发现可以在图上添加图例和颜色栏。
  • 在该图上添加轴。轴是使用诸如plot()和scatter()之类的函数在其上绘制数据的区域, 并且可以将刻度, 标签等与之关联。这解释了为什么图形可以包含多个轴。
提示:例如, 看到plt.xlim时, 你会在幕后调用ax.set_xlim()。轴对象的所有方法都作为函数存在于pyplot模块中, 反之亦然。请注意, 大多数情况下, 你将使用pyplot模块的功能, 因为它们更简洁, 至少对于简单绘图而言更是如此!
查看以下代码段, 你将明白” 干净” 的含义。比较下面这段代码:
使用下面的代码:
第二个代码块肯定更干净, 不是吗?
请注意, 以上代码示例来自Benjamin Root撰写的《 Matplotlib教程解剖》。
但是, 如果你有多个轴, 则最好使用第一个代码块, 因为最好还是使用显式代码而不是隐式代码!在这种情况下, 你想使用Axes对象ax。
除了这两个组件之外, 你还需要记住其他几个方面:
每个轴都有一个x轴和一个y轴, 其中包含刻度线, 这些刻度线具有主要和次要的刻度线和刻度线标签。当你要自定义轴时, 还需要考虑轴标签, 标题和图例, 但还要考虑到轴比例和网格线可能会派上用场。
脊线是连接轴刻度线并指定数据区域边界的线。换句话说, 它们是简单的黑色正方形, 当你根本不绘制任何数据时, 而是在初始化轴之后, 你会看到它们, 如下图所示:
Matplotlib教程(Python绘图)

文章图片
你会看到右侧和顶部的棘刺设置为不可见。
请注意, 有时你还会读到Artist对象, 这些对象实际上是软件包必须提供给像你这样的用户的所有对象。使用Matplotlib绘制的所有内容都是Artist模块的一部分。用于绘制数据的容器(例如Axis, Axes和Figure)以及其他图形对象(例如文本, 补丁等)是Artists类型。
对于那些已经有一定编码经验的人, 最好检查一下并学习在Matplotlib库中找到的代码示例。
Matplotlib, pyplot和pylab:它们之间有什么关系? 首先, 你现在已经了解Matplotlib。当你谈论” Matplotlib” 时, 你会谈论整个Python数据可视化软件包。这不应该给你带来很大的惊喜:)
其次, pyplot是matplotlib软件包中的一个模块。这就是为什么你经常在代码中看到matplotlib.pyplot的原因。该模块提供了一个界面, 使你可以隐式自动创建图形和轴以获取所需的图。
如本教程第一部分中的示例所示, 当你想快速绘制某些东西而无需实例化任何图形或轴时, 这特别方便。你会看到, 你尚未明确指定这些组件, 但仍可以输出甚至定制的图!默认值已初始化, 你所做的任何自定义都将牢记当前的图形和轴。
最后, pylab是另一个模块, 但是它与matplotlib软件包一起安装。它批量导入pyplot和numpy库, 通常在使用数组, 以交互方式进行数学运算并希望访问绘图功能时建议使用。
你可能仍会在较早的教程和matplotlib示例中看到此弹出窗口, 但不再建议使用它, 尤其是当你在Jupyter笔记本中使用IPython内核时, 尤其如此。你可以在此处了解更多信息。
作为解决方案, 你最好将%matplotlib magic与正确的后端(例如inline, qt等)结合使用。在大多数情况下, 你将希望使用inline, 因为这将确保将图块嵌入到内部。笔记本。在srcmini的Jupyter Notebook最终指南中了解有关此内容的更多信息。
请注意, 即使你不在使用Jupyter笔记本电脑时, 仍然需要根据使用情况选择其他后端。换句话说, 如果你不想将图形嵌入到笔记本中, 而是希望将其嵌入图形用户界面, 批处理脚本或Web应用程序服务器等中, 则需要指定所需的后端使用。但是, 本主题不在本教程的讨论范围内。相反, 本教程假定你将使用Matplotlib将图像保存到本地文件系统。
Matplotlib图的数据 正如你在上一节中所读的一样, Matplotlib通常用于可视化分析或计算。因此, 要开始在Python中自己进行绘图, 必须要做的第一步就是考虑修改NumPy(用于科学计算的Python库)。
科学计算似乎并没有太大的意义, 但是当你进行数据科学时, 你会发现自己需要处理数组中存储的数据。你需要对它们执行操作, 检查数组并对其进行操作, 以使你能够处理对分析很有用且格式正确的数据(子集)等。
简而言之, 使用此数据可视化库时, 你会发现NumPy非常方便。如果你有兴趣参加NumPy入门教程的准备工作, 请继续阅读srcmini的教程, 并确保关闭我们的NumPy备忘单副本!
当然, 数组不是传递给绘图函数的唯一内容;例如, 还可以传递Python列表。如果你想了解有关Python列表的更多信息, 请考虑查看我们的Python列表教程或免费的Python数据科学课程简介。
创建情节 好了, 你准备使用Python自己创建第一个绘图!正如你在前面的部分中已读到的那样, 该图是第一步, 也是释放此程序包功能的关键。接下来, 你将看到在上面的代码块中使用fig.add_axes()初始化了Figure的轴:
很简单, 不是吗?
什么是子图?
你已经看到了绘图的所有组成部分, 并且已经初始化了第一个图形和轴, 但是为了使事情变得更加复杂, 有时会在代码中弹出子图。
现在, 不要气disc!
你可以使用子图来设置轴并将其放置在常规网格上。因此, 这意味着在大多数情况下, 轴和子图是同义词, 它们将指定相同的内容。当你调用子图将轴添加到图形时, 请使用add_subplots()函数。但是, add_axes()和add_subplots()函数之间是有区别的, 但是你将在本教程的后面部分中详细了解此内容。
考虑以下示例:
你会发现itsef中的add_subplot()函数也给你带来了挑战, 因为你在上述代码块中看到了add_subplots(111)。
111是什么意思?
好吧, 111等于1, 1, 1, 这意味着你实际上为add_subplot()提供了三个参数。这三个参数指定行数(1), 列数(1)和图号(1)。因此, 你实际上制作了一个子图。
请注意, 使用此功能时, 你确实可以使用此功能, 尤其是在刚开始使用该库而忘记了三个数字的含义时。
考虑以下命令, 并尝试设想该图的外观以及你的图形将具有多少个轴:ax = fig.add_subplot(2, 2, 1)。
得到它了?
没错, 你的图形总共有四个轴, 排列成具有两行两列的结构。在你考虑的代码行中, 你说变量ax是要开始绘制的四个轴中的第一个。在这种情况下, “ 第一个” 意味着它将是你初始化的2× 2结构左侧的第一个轴。
add_axes()和add_subplot()有什么区别?
fig.add_axes()和fig.add_subplot()之间的区别不在于结果:它们都返回一个Axes对象。但是, 它们在添加轴的机制上确实有所不同:你将列表传递给add_axes(), 该列表是左下角, 宽度和高度。这意味着轴对象位于绝对坐标中。
相反, add_subplot()函数不提供将轴放置在特定位置的选项:但是, 它确实允许根据子图网格对轴进行定位, 如你在上一节中所看到的。
在大多数情况下, 你将使用add_subplot()创建轴;仅在定位很重要的情况下, 你才可以使用add_axes()。另外, 如果你想同时获得一个或多个子图, 也可以使用subplots()。在下一部分中, 你将看到一个有关其工作原理的示例。
如何更改图形大小 既然你已经了解了如何从头开始初始化图形和轴, 那么你还将想知道如何更改包装为你设置的某些小细节, 例如图形尺寸。
假设你没有足够的默认值, 并且想要更改此设置。你如何手动设置数字的大小?
像该软件包中的所有内容一样, 它非常简单, 但是你首先需要知道要进行哪些更改。
在pyplot模块的plt.figure()函数中添加一个参数figsize;你只需指定一个图元, 图元的宽度和高度(以英寸为单位)就可以了, 就像plt.figure(figsize =(3, 4))一样。
注意, 你也可以将figsize传递给同一模块的plt.subplots()函数。内部工作原理与你刚刚看到的fig()函数相同。
【Matplotlib教程(Python绘图)】在此处查看如何运行的示例:
使用Pyplot:绘制例程 现在你已经准备好开始绘制数据, 下面是时候仔细研究一些绘制例程了。你经常会遇到诸如plot()和scatter()之类的函数, 这些函数要么用线或连接它们的标记绘制点, 要么绘制未连接的点(已缩放或着色)。
但是, 正如你在第一部分的示例中已经看到的那样, 你不应忘记传递希望这些功能使用的数据!
这些功能仅仅是基础知识。你将需要其他一些功能来确保你的绘图看起来很棒:
ax.bar() 垂直矩形
ax.barh() 水平矩形
ax.axhline() 跨轴水平线
ax.vline() 跨轴垂直线
ax.fill() 填充多边形
ax.fill_between() 在y值和0之间填充
ax.stackplot() 堆栈图
如果你想知道如何使用这些功能来绘制数据, 请考虑以下示例。请注意, 已经为你加载了x和y变量:
大多数功能都可以说明问题, 因为名称很清楚。但这并不意味着你需要限制自己:例如, fill_between()函数非常适合希望创建面积图的用户, 但是它们也可以用于创建堆积的折线图;只需几次使用绘图功能, 即可确保区域重叠并产生被堆叠的错觉。
请注意, 当然, 仅传递数据不足以创建漂亮的图。确保以可视化方式有意义的方式操作数据:不要害怕更改数组形状, 合并数组等。
当继续前进并开始使用向量字段或数据分布时, 你可能需要检查以下功能:
ax.arrow() 箭头
ax.quiver() 二维箭头区域
ax.streamplot() 2D矢量场
ax.hist() 直方图
ax.boxplot() 箱形图
ax.violinplot() 小提琴图
当然, 请注意, 你可能不会使用这些表中列出的所有功能;这实际上取决于你的数据和用例。如果你是数据科学的新手, 则可能需要先查看统计绘图例程!
另一方面, 当你处理2D或n-D数据时, 你可能还会发现自己需要一些更高级的绘图例程, 例如:
ax.pcolor() 伪色图
ax.pcolormesh() 伪色图
ax.contour() 等高线图
ax.contourf() 填充轮廓图
ax.clabel() 标记轮廓图
请注意, 等高线图用于探索三个变量之间的潜在关系。就像轮廓图一样, 伪彩色图也可以用于此目的, 因为它们是从上方看的表面图。当然, 这并不是你可以用来绘制数据的几乎所有功能。
例如, 如果你使用的是图像或2D数据, 则可能还需要签出imshow()以在子图中显示图像。有关如何使用imshow()函数的实际示例, 请访问srcmini的scikit-learn教程。
本教程中的示例还清楚地表明, 此数据可视化库确实是数据科学工作流中的佼佼者:你必须精通一般的Python概念, 例如列表和控制流, 这些尤其可能出现如果要自动执行大量子图的绘制, 则非常方便。如果你想修改这些概念, 请考虑免费学习Python的数据科学课程。
自定义你的PyPlot 关于此程序包的许多问题来自以下事实:你可以做很多事情来个性化你的绘图并确保它们是唯一的:除了调整颜色之外, 你还可以选择更改标记, 线型和线宽, 添加文本, 图例和注释, 以及更改图的限制和布局。
事实恰恰是这些图有无穷的可能性, 这使得在开始研究该主题时很难阐明一些你需要知道的事情。
你应该牢记的重要技巧不仅是画廊, 它包含许多已经为你编码和可以使用的真实示例, 还包括文档, 可以使你更多地了解参数。你可以通过某些功能来调整视觉功能。
另外请记住, 针对一个问题有多种解决方案, 当你弄脏了包装本身或遇到麻烦时, 你会学到很多东西。你将在本节中看到一些最常见的问题和解决方案。
删除轴
如果要从绘图中删除轴, 则可以使用delaxes()来删除和更新当前轴:
请注意, 你可以通过在fig.delaxes(ax3)之后添加fig.add_axes(ax)来恢复已删除的轴。
如何将图例排除在外
有很多方法可以解决此问题, 但是大多数方法都可以回到你可以提供给legend()的参数上:
  • 你可以将loc或location参数指定为左中或右上角之类的参数, 以确保图例不会落在” 轴” 或子图区域中。
  • 另外, 你也可以将bbox_to_anchor参数添加到函数中, 并传递一个元组以及要在其中放置图例的坐标。在这种情况下, 该框位于绘图区域的右上角:ax.legend(bbox_to_anchor =(1.1, 1.05))。
如何设置绘图标题和轴标签
要更改打印标题和坐标轴标签, 可以根据你要使用的容器使用以下方法之一:
  • 正确设置这些东西的最简单方法是使用ax.set(title =” A title” , xlabel =” x” , ylabel =” y” )或ax.set_xlim(), ax.set_ylim()或ax.set_title ()。
  • 如果要使用该图, 则还可以使用fig.suptitle()将标题添加到绘图中。
  • 如果你使用软件包必须提供的默认设置, 则可能要使用plt.title(), plt.xlabel()和plt.ylabel()。
  • 定义自己的样式表或更改默认的matplotlibrc设置。在此处了解更多信息。
如何修复绘图布局
当你使用子图构建图时, 需要考虑的一件事情是tight_layout函数, 该函数将帮助你确保这些图很好地适合你的图形。理想情况下, 在绘制数据并自定义绘制后即可调用它。因此, 在调用plt.show()之前, 你应该使用plt.tight_layout()。
此外, 你可能还想使用subplots_adjust(), 它允许你手动设置为子图之间的空白保留的宽度和高度, 并固定子图的左侧和右侧以及顶部和底部。
显示, 保存和关闭情节 完成所有必要的自定义之后, 你将需要显示自己的图, 因为正如你在终端上工作所注意到的那样, 你只是看到一个对象已制成, 但是每次都看不到漂亮的图进行调整。
在本教程的第一个示例中, 这是隐式完成的。
你还记得吗?这是这段代码:
行plt.show()确实表示你想查看该图。如果执行此行, 则会弹出一个窗口。然后你会发现它看起来像你的想法!
但这是你的问题开始的地方。如何保存该图片, 如果你不喜欢它, 可以清除该图片以重新开始吗?以下几节将介绍这些问题。
如何将绘图保存到图像文件
你可以通过使用plt.savefig()轻松地将图形保存到例如png文件中。你需要传递给此函数的唯一参数是文件名, 如以下示例所示:
# Save Figure plt.savefig("foo.png")# Save Transparent Figure plt.savefig("foo.png", transparent=True)

只要执行这行代码, 就可以将绘制的图保存到图像文件中, 而不是显示它。
如何将绘图保存到Pdf文件
如果要将多个图保存到pdf文件, 则要利用pdf后端, 可以轻松导入该后端:
# Import PdfPages from matplotlib.backends.backend_pdf import PdfPages# Initialize the pdf file pp = PdfPages('multipage.pdf')# Save the figure to the file pp.savefig()# Close the file pp.close()

什么时候使用cla(), clf()或close()?
当你终于准备好检查自己的地块时, 就该继续进行其他操作(也许是另一个地块!)。首次使用此数据可视化库时, 一开始可能会很奇怪, 因为你当然可以关闭显示的GUI窗口, 但这通常不是你要处理的方式, 因为它当你一次同时处理几件事时, 效果并不总是很好。
你必须明确告诉Matplotlib关闭正在处理的绘图, 以便继续进行。现在, 你将可以使用以下三种功能:
  • 使用plt.cla()清除轴,
  • plt.clf()清除整个图形, 然后
  • plt.close()关闭一个弹出窗口, 以向你显示绘图。
自定义Matplotlib 到目前为止, 你已经熟悉一些自定义绘图的基本选项。但是, 如果你要进行的自定义更多地位于库级别而不是绘图级别, 该怎么办?在这种情况下, 你也不必惊慌:Matplotlib为你提供了一些选项来调整某些内部工作原理。本节仅介绍两个选项, 即样式表和rc设置。
如果你想了解更多, 请务必查看此页面。
如何使用ggplot2样式
对于其中的R爱好者, Matplotlib还为你提供了将绘图样式设置为ggplot的选项。你可以通过运行以下代码轻松地做到这一点:
# Import `pyplot` import matplotlib.pyplot as plt# Set the style to `ggplot` plt.style.use("ggplot")

rc设置
” rc” 在配置文件中很常见:它们通常以rc结尾。它来自将配置作为可执行文件的实践:例如, 它们会自动运行并配置设置。你可以在这里读更多关于它的内容。 Matplotlib有一个rc文件, 你可以对其进行动态和静态调整。
要动态更改默认的rc设置, 可以使用rcParams变量:
你只是在上面的示例中调整了线宽, 但是还可以更改图形大小和dpi, 线宽, 颜色和样式, 轴, 轴和网格属性, 文本和字体属性, …
如果你想更静态地工作, 你可能还应该知道你有一个matplotlibrc配置文件, 可用于自定义所有类型的属性(就像上面使用line width参数所做的一样)。如果要查找此特定文件, 则可以运行以下命令:
import matplotlibmatplotlib.matplotlib_fname()

接下来, 你可以拉起文件并开始播放设置!
继续学习 恭喜你!你已经成功完成了今天的Matplotlib教程!还有很多东西要学习, 但是你肯定已经准备好独自走出去, 创建自己的惊人地块。不要错过srcmini的Matplotlib备忘单, 它可以帮助你立即逐步进行绘图。
如果你想从Matplotlib中发现更多内容, 请考虑查看srcmini的” 使用Matplotlib查看3D体积数据” 教程, 以了解如何使用matplotlib的事件处理程序API或本教程, 在该教程中, 你将学到有关使绘图动画化的全部知识。
如果你准备开始使用Python探索交互式数据可视化, 请考虑参加srcmini的Bokeh课程, 不要错过我们的Bokeh备忘单。

    推荐阅读