交互式图形#

在探索绘图时,交互性可能非常宝贵。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。如果图形上当前没有坐标轴,则会创建一个新的坐标轴

pyplot 中的几乎所有函数都适当地传递到当前的 Figure / Axes(或创建一个)

Matplotlib 保留对通过 pyplot.figurepyplot.subplots 创建的所有打开图形的引用,以便这些图形不会被垃圾回收。Figure 可以通过 pyplot.close 单独关闭并从 pyplot 注销;所有打开的 Figure 可以通过 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()

在最近版本的 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 工具包),但很可能会导致图形无响应。

默认用户界面#

pyplot 创建的窗口具有交互式工具栏,带有导航按钮和光标所指数据值的读数。

交互式导航#

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

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

../../../_images/home_large.png ../../../_images/back_large.png ../../../_images/forward_large.png
主页前进后退 按钮

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

../../../_images/move_large.png
平移/缩放 按钮

此按钮具有两种模式:平移和缩放。单击 平移/缩放 按钮以激活平移和缩放,然后将鼠标放在轴上方的某个位置。按住鼠标左键并将其拖动到新位置以平移图形。当您释放它时,您按下时鼠标下的数据将移动到您释放时的位置。如果在平移时按下 '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 Lab 中获得交互式图形,请使用 ipympl 后端(必须单独安装),该后端使用 ipywidget 框架。如果安装了 ipympl,请使用魔法命令

%matplotlib widget

选择并启用它。

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

%matplotlib notebook

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

注意

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

GUI + Jupyter#

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

PyCharm、Spyder 和 VSCode#

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