交互式图形#
在处理数据时,交互性非常宝贵。内置于 Matplotlib GUI 窗口中的平移/缩放和鼠标位置工具通常就足够了,但你还可以使用事件系统来构建自定义数据探索工具。
另请参阅
图形简介.
Matplotlib 附带 后端,绑定到多个 GUI 工具包(Qt、Tk、Wx、GTK、macOS、JavaScript),第三方包提供绑定到 kivy 和 Jupyter Lab。为了让图形响应鼠标、键盘和绘制事件,GUI 事件循环需要与交互式提示符集成。我们建议使用 IPython(请参阅 以下)。
pyplot
模块提供用于显式创建包含交互式工具、工具栏、工具提示和 按键绑定 的图形的函数
pyplot.figure
创建一个新的空
Figure
或选择一个现有的图形pyplot.subplots
pyplot.gcf
获取当前
Figure
。如果 pyplot 图形堆栈上当前没有图形,则创建一个新图形pyplot.gca
获取当前
Axes
。如果 Figure 上当前没有 Axes,则创建一个新的
pyplot
中几乎所有函数都通过当前 Figure
/ Axes
(或根据需要创建一个)
Matplotlib 会保留通过 pyplot.figure
或 pyplot.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()
在 Matplotlib
和 IPython
的最新版本中,导入 matplotlib.pyplot
并调用 pyplot.ion
就足够了。使用 %
魔术保证在所有版本的 Matplotlib 和 IPython 中都能正常工作。
交互模式#
启用交互模式。 |
|
禁用交互模式。 |
|
返回是否在每个绘图命令后更新绘图。 |
显示所有打开的图形。 |
|
运行 GUI 事件循环,持续 interval 秒。 |
交互模式控件
是否自动显示创建的图形
对艺术家进行更改是否自动触发重新绘制现有图形
当
pyplot.show()
在未提供任何参数的情况下返回时:立即返回,或在所有图形关闭后返回
如果处于交互模式
新创建的图形将立即显示
当元素发生更改时,图形将自动重新绘制
pyplot.show()
显示图形并立即返回
如果未处于交互模式
新创建的图形和对图形的更改将不会显示,直到
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
创建的窗口具有交互式工具栏,其中包含导航按钮和光标指向的数据值的读数。
其他 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 的集成,请查阅其文档以了解配置详细信息。