交互式图形#

在探索绘图时,交互性是无价的。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。如果图形上当前没有 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 秒。

交互模式控制

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

  • 对艺术家(artist)的更改是否自动触发重绘现有图形

  • 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
Home(主页)、Forward(前进)和 Back(后退)按钮

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

../../../_images/move_large.png
Pan/Zoom(平移/缩放)按钮

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

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

../../../_images/zoom_to_rect_large.png
Zoom-to-Rectangle(矩形缩放)按钮

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

../../../_images/subplots_large.png
Subplot-configuration(子图配置)按钮

使用此按钮配置子图的外观。您可以拉伸或压缩子图的左、右、上、下边,或者行间距或列间距。

../../../_images/filesave_large.png
Save(保存)按钮

点击此按钮启动文件保存对话框。您可以保存以下扩展名的文件: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 会在单元格执行时渲染图形一次,并将静态图像插入到笔记本中。由于图像是静态的,因此它们无法进行平移/缩放、接收用户输入或从其他单元格更新。

GUIs + Jupyter#

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

PyCharm、Spyder 和 VSCode#

许多 IDE 都内置了与 Matplotlib 的集成,请查阅其文档以获取配置详情。