交互式图形#
在探索绘图时,交互性是无价的。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
。如果图形上当前没有 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 秒。 |
交互模式控制
是否自动显示创建的图形
对艺术家(artist)的更改是否自动触发重绘现有图形
当
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 工具包),但很可能导致图形无响应。
默认用户界面#
由 pyplot
创建的窗口具有一个交互式工具栏,其中包含导航按钮和光标指向的数据值的读数。
其他 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 的集成,请查阅其文档以获取配置详情。