交互式图形#

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

另请参阅

图形简介.

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

pyplot 模块提供用于显式创建包含交互式工具、工具栏、工具提示和 按键绑定 的图形的函数

pyplot.figure

创建一个新的空 Figure 或选择一个现有的图形

pyplot.subplots

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

pyplot.gcf

获取当前 Figure。如果 pyplot 图形堆栈上当前没有图形,则创建一个新图形

pyplot.gca

获取当前 Axes。如果 Figure 上当前没有 Axes,则创建一个新的

pyplot 中几乎所有函数都通过当前 Figure / Axes(或根据需要创建一个)

Matplotlib 会保留通过 pyplot.figurepyplot.subplots 创建的所有开放图形的引用,以便不会对图形进行垃圾回收。 Figure 可以通过 pyplot.close 分别从 pyplot 中关闭和取消注册;所有开放的 Figure 都可以通过 plt.close('all') 关闭。

另请参阅

有关 Matplotlib 事件系统和集成事件循环的更多讨论:- 交互式图形和异步编程 - 事件处理和拾取

IPython 集成#

我们建议使用 IPython 作为交互式 shell。除了其所有功能(改进的 tab 补全、魔术、多行编辑等)之外,它还确保了 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()

MatplotlibIPython 的最新版本中,导入 matplotlib.pyplot 并调用 pyplot.ion 就足够了。使用 % 魔术保证在所有版本的 Matplotlib 和 IPython 中都能正常工作。

交互模式#

pyplot.ion

启用交互模式。

pyplot.ioff

禁用交互模式。

pyplot.isinteractive

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

pyplot.show

显示所有打开的图形。

pyplot.pause

运行 GUI 事件循环,持续 interval 秒。

交互模式控件

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

  • 对艺术家进行更改是否自动触发重新绘制现有图形

  • pyplot.show() 在未提供任何参数的情况下返回时:立即返回,或在所有图形关闭后返回

如果处于交互模式

  • 新创建的图形将立即显示

  • 当元素发生更改时,图形将自动重新绘制

  • pyplot.show() 显示图形并立即返回

如果未处于交互模式

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

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

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

警告

使用 Figure.show,可以在不启动事件循环且不处于交互模式的情况下在屏幕上显示图形。这可能会起作用(取决于 GUI 工具包),但可能会导致图形无响应。

默认 UI#

pyplot 创建的窗口具有交互式工具栏,其中包含导航按钮和光标指向的数据值的读数。

交互式导航#

../../../_images/toolbar.png

所有图形窗口都带有导航工具栏,可用于浏览数据集。

../../../_images/home_large.png ../../../_images/back_large.png ../../../_images/forward_large.png
HomeForwardBack 按钮

这些按钮类似于 Web 浏览器的 Home、Forward 和 Back 控件。ForwardBack 用于在先前定义的视图之间来回导航。除非您已使用平移和缩放按钮导航到其他位置,否则它们没有任何意义。这类似于在访问新页面之前尝试单击 Web 浏览器上的 Back 或在返回页面之前尝试单击 Forward,什么也不会发生。Home 带您回到数据的第一个默认视图。

../../../_images/move_large.png
Pan/Zoom 按钮

此按钮具有两种模式:平移和缩放。单击 平移/缩放 按钮以激活平移和缩放,然后将鼠标放在某条轴线上。按住鼠标左键以平移图形,将其拖动到新位置。释放鼠标后,按下点的数据将移动到释放点。在平移时按“x”或“y”,运动将分别限制在 x 轴或 y 轴。按住鼠标右键以缩放,将其拖动到新位置。x 轴将按向右运动的比例放大,按向左运动的比例缩小。y 轴和向上/向下运动也是如此(向上放大,向下缩小)。缩放开始时鼠标下的点保持静止,允许您围绕该点任意放大或缩小。可以使用修饰键“x”、“y”或“CONTROL”将缩放分别限制在 x 轴、y 轴或保持纵横比。

对于极坐标图,平移和缩放功能的行为不同。可以使用鼠标左键拖动半径轴标签。可以使用鼠标右键放大和缩小半径刻度。

../../../_images/zoom_to_rect_large.png
缩放至矩形 按钮

将鼠标放在某条轴线上并按住鼠标按钮。通过按住按钮将鼠标拖动到新位置来定义一个矩形区域。使用鼠标左键时,轴视图限制将缩放至已定义区域。使用鼠标右键时,轴视图限制将缩小,将原始轴置于已定义区域中。

../../../_images/subplots_large.png
子图配置 按钮

使用此按钮配置子图的外观。您可以拉伸或压缩子图的左侧、右侧、顶部或底部,或行间距或列间距。

../../../_images/filesave_large.png
保存 按钮

单击此按钮以启动文件保存对话框。您可以使用以下扩展名保存文件:pngpsepssvgpdf

其他 Python 提示#

交互模式在默认 Python 提示中运行

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

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

Jupyter Notebooks / JupyterLab#

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

%matplotlib widget

选择并启用它。

如果您只需要使用经典笔记本(即 notebook<7),则可以使用

%matplotlib notebook

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

注意

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

GUI + Jupyter#

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

PyCharm、Spyder 和 VSCode#

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