交互式图形#

在探索图表时,互动性可能是无价的。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.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
HomeForwardBack 按钮

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

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

此按钮有两种模式:平移和缩放。点击 平移/缩放 按钮以激活平移和缩放功能,然后将鼠标放在某个坐标轴上。按下鼠标左键并保持以平移图形,将其拖动到新位置。当你松开时,你按下鼠标时所在点的数据将被移动到你松开鼠标时的位置。如果在平移时按下 'x' 或 'y',则运动将被分别限制在 x 轴或 y 轴上。按下鼠标右键进行缩放,将其拖动到新位置。x 轴将根据向右移动的比例进行缩放,根据向左移动的比例进行缩小。y 轴和上下移动也是如此(向上缩放,向下缩小)。当你开始缩放时,鼠标下的点保持静止,允许你围绕该点进行缩放。你可以使用修饰键 'x'、'y' 或 'CONTROL' 分别将缩放限制在 x 轴、y 轴或保持宽高比。

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

../../../_images/zoom_to_rect_large.png
Zoom-to-Rectangle 按钮

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

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

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

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

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

其他Python提示#

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

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

然而,这并不能确保事件钩子被正确安装,您的图形可能不会响应。请查阅您的GUI工具包的文档以获取详细信息。

Jupyter 笔记本 / JupyterLab#

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

%matplotlib widget

选择并启用它。

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

%matplotlib notebook

它使用了 Matplotlib 提供的 backend_nbagg 后端;然而,nbagg 在 Jupyter Lab 中无法工作。

备注

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

图形用户界面 + Jupyter#

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

PyCharm、Spyder 和 VSCode#

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