互动人物#

在处理数据时,交互性是无价的。Matplotlib GUI 窗口中内置的平移/缩放和鼠标定位工具通常就足够了,但您也可以使用事件系统来构建自定义的数据探索工具。

Matplotlib 附带与多个 GUI 工具包(Qt、Tk、Wx、GTK、macOS、JavaScript)的后端绑定,第三方包提供与kivyJupyter Lab的绑定。为了使图形响应鼠标、键盘和绘制事件,GUI 事件循环需要与交互式提示集成。我们推荐使用 IPython(见下文)。

pyplot模块提供用于显式创建图形的功能,包括交互式工具、工具栏、工具提示和 键绑定

pyplot.figure

创建新的空Figure图或选择现有图窗

pyplot.subplots

创建一个新的Figure并用网格填充它Axes

pyplot有一个可以通过 访问的“当前图形”pyplot.gcf的概念和一个通过 访问的“当前轴”的概念pyplot.gca。几乎所有的函数都pyplot通过当前的Figure/ Axes(或创建一个)适当地传递。

Matplotlib 保留对通过pyplot.figureor创建的所有打开图形的引用,pyplot.subplots这样图形就不会被垃圾收集。Figures 可以通过单独关闭和pyplot注销 pyplot.close;所有 openFigure都可以通过plt.close('all').

有关 Matplotlib 的事件系统和集成事件循环的更多讨论,请阅读:

IPython 集成#

我们建议将 IPython 用于交互式 shell。除了其所有功能(改进的制表符补全、魔术、多行编辑等)之外,它还确保 GUI 工具包事件循环与命令行正确集成(请参阅命令提示符集成)。

在此示例中,我们通过 IPython 提示创建和修改图形。该图显示在 QtAgg GUI 窗口中。要配置集成并启用交互模式,请使用以下 %matplotlib魔法:

In [1]: %matplotlib
Using matplotlib backend: QtAgg

In [2]: import matplotlib.pyplot as plt

创建一个新的图形窗口:

In [3]: fig, ax = plt.subplots()

将数据的线图添加到窗口:

In [4]: ln, = ax.plot(range(5))

将线的颜色从蓝色更改为橙​​色:

In [5]: ln.set_color('orange')

如果您希望禁用绘图的自动重绘:

In [6]: plt.ioff()

如果您希望重新启用绘图的自动重绘:

In [7]: plt.ion()

在最新版本的Matplotliband中,导入和调用IPython就足够了。保证在所有版本的 Matplotlib 和 IPython 中都可以使用魔法。matplotlib.pyplotpyplot.ion%

交互模式#

pyplot.ion

启用交互模式。

pyplot.ioff

禁用交互模式。

pyplot.isinteractive

返回是否在每个绘图命令后更新绘图。

pyplot.show

显示所有打开的数字。

pyplot.pause

为间隔秒运行 GUI 事件循环。

交互模式控制:

  • 是否自动显示创建的图形

  • 对艺术家的更改是否会自动触发重新绘制现有人物

  • pyplot.show()不给定参数时返回:立即,或在所有图形都已关闭之后

如果处于交互模式:

  • 新创建的数字将立即显示

  • 当元素改变时,图形会自动重绘

  • pyplot.show()显示数字并立即返回

如果不在交互模式下:

如果您处于非交互模式(或在非交互模式下创建图形),您可能需要显式调用pyplot.show 以在屏幕上显示窗口。如果您只想在固定时间内运行 GUI 事件循环,则可以使用pyplot.pause. 这将阻止您的代码进度,就像您调用了 一样 time.sleep,确保显示当前窗口并在需要时重新绘制,并在指定的时间段内运行 GUI 事件循环。

与命令提示符集成的 GUI 事件循环和处于交互模式的图形是相互独立的。如果您使用pyplot.ion但未安排事件循环集成,则在提示等待输入时,您的图形将出现但不会交互。您将无法平移/缩放,甚至可能无法渲染图形(窗口可能显示为黑色、透明或作为其下方桌面的快照)。相反,如果您配置事件循环集成,则无论 pyplot 的“交互模式”如何,显示的图形都会在等待提示输入时做出响应。

无论交互模式设置和事件循环集成如何组合,如果您使用 、 或以其他方式运行 GUI 主循环,图形都会pyplot.show(block=True)响应pyplot.pause

警告

使用Figure.show它可以在屏幕上显示图形而无需启动事件循环且无需处于交互模式。这可能有效(取决于 GUI 工具包),但可能会导致图形无响应。

默认用户界面#

创建的窗口pyplot有一个带有导航按钮的交互式工具栏和光标指向的数据值的读数。默认情况下注册了许多有用的键绑定。

其他 Python 提示#

交互模式在默认的 Python 提示符下工作:

>>> import matplotlib.pyplot as plt
>>> plt.ion()
>>>

但是,这并不能确保事件挂钩已正确安装,并且您的图形可能没有响应。有关详细信息,请参阅您的 GUI 工具包的文档。

Jupyter 笔记本/JupyterLab #

笔记

要获得此处描述的交互式功能,您必须使用交互式后端。笔记本中的默认后端,即内联后端,不是。backend_inline 渲染一次图形并在执行单元格时将静态图像插入笔记本中。因为图像是静态的,它们不能被平移/缩放、接受用户输入或从其他单元格更新。

要在“经典”笔记本或 Jupyter 实验室中获得交互式图形,请使用使用ipywidget框架的ipympl后端(必须单独安装)。如果安装使用魔法:ipympl

%matplotlib widget

选择并启用它。

如果只需要使用经典笔记本,可以使用

%matplotlib notebook

它使用backend_nbaggMatplotlib 提供的后端;但是,nbagg 在 Jupyter Lab 中不起作用。

图形用户界面 + Jupyter #

您还可以ipympl在 Jupyter Notebook 中使用非 GUI 后端之一。如果您在本地运行 Jupyter 内核,GUI 窗口将在您的桌面上与您的 Web 浏览器相邻生成。如果您在远程服务器上运行笔记本,内核将尝试在远程计算机上打开 GUI 窗口。除非您已安排将 xserver 转发回您的桌面,否则您将无法看到该窗口或与该窗口进行交互。它也可能引发异常。

PyCharm、Spyder 和 VSCode #

许多 IDE 都内置了与 Matplotlib 的集成,请查阅他们的文档以获取配置详细信息。