交互式图形#

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

参见

Figure简介 .

Matplotlib 附带 backends 绑定到多个 GUI 工具包(Qt,Tk,Wx,GTK,macOS,JavaScript),第三方软件包提供到 kivyJupyter Lab 的绑定.为了使图形能够响应鼠标,键盘和绘制事件,GUI 事件循环需要与交互式提示符集成.我们建议使用 IPython(参见 below ).

pyplot 模块提供了显式创建包含交互式工具,工具栏,工具提示和 key bindings 的图形的函数:

pyplot.figure

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

pyplot.subplots

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

pyplot.gcf

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

pyplot.gca

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

pyplot 中的几乎所有函数都会适当地通过当前的 Figure / Axes (或创建一个).

Matplotlib 保留对通过 pyplot.figurepyplot.subplots 创建的所有打开的图形的引用,以便图形不会被垃圾回收.可以通过 pyplot.close 单独关闭 Figure s 并从 pyplot 注销;可以通过 plt.close('all') 关闭所有打开的 Figure s.

参见

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

IPython 集成#

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

在此示例中,我们通过 IPython 提示符创建和修改图形.该图形显示在 QtAgg GUI 窗口中.要配置集成并启用 interactive mode ,请使用 %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() 被调用

    • pyplot.pause() 被调用

    • FigureCanvasBase.flush_events() 被调用

  • pyplot.show() 运行 GUI 事件循环,并且在所有绘图窗口关闭之前不会返回

如果您处于非交互模式(或在非交互模式下创建了图形),则可能需要显式调用 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
Home , ForwardBack 按钮

这些类似于 Web 浏览器的"主页","前进"和"后退"控件. ForwardBack 用于在先前定义的视图之间来回导航. 除非您已经使用平移和缩放按钮导航到其他位置,否则它们没有意义. 这类似于尝试在访问新页面之前单击 Web 浏览器上的"后退"或在返回页面之前单击"前进"--什么也不会发生. 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
子图配置 按钮

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

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

单击此按钮启动文件保存对话框.您可以保存具有以下扩展名的文件: png , ps , eps , svgpdf .

其他 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 中不起作用.

备注

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

GUIs + Jupyter#

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

PyCharm,Spyder 和 VSCode#

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