交互式图形#
在探索绘图时,交互性可能非常宝贵.内置于 Matplotlib GUI 窗口中的平移/缩放和鼠标位置工具通常就足够了,但您也可以使用事件系统来构建自定义的数据探索工具.
参见
Figure简介 .
Matplotlib 附带 backends 绑定到多个 GUI 工具包(Qt,Tk,Wx,GTK,macOS,JavaScript),第三方软件包提供到 kivy 和 Jupyter 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.figure 或 pyplot.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()
在最新版本的 Matplotlib 和 IPython 中,导入 matplotlib.pyplot 并调用 pyplot.ion 就足够了.使用 % 魔法命令保证在所有版本的 Matplotlib 和 IPython 中都能工作.
交互模式#
|
启用交互模式. |
|
禁用交互模式. |
|
返回是否在每个绘图命令后更新绘图. |
|
显示所有打开的图形. |
|
运行 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 创建的窗口具有一个交互式工具栏,其中包含导航按钮和光标指向的数据值的读数.
其他 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 的集成,请查阅它们的文档以获取配置详细信息.