交互式图形#
在探索绘图时,交互性可能非常宝贵。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
。如果图形上当前没有坐标轴,则会创建一个新的坐标轴
pyplot
中的几乎所有函数都适当地传递到当前的 Figure
/ Axes
(或创建一个)
Matplotlib 保留对通过 pyplot.figure
或 pyplot.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()
在最近版本的 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 工具包),但很可能会导致图形无响应。
默认用户界面#
由 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
会在单元格执行时渲染一次图形,并将静态图像插入到笔记本中。由于图像是静态的,因此它们无法进行平移/缩放、接受用户输入或从其他单元格更新。
GUI + Jupyter#
您还可以在 Jupyter Notebook 中使用非 ipympl
的 GUI 后端。如果您在本地运行 Jupyter 内核,GUI 窗口将在您的桌面上的 Web 浏览器旁边生成。如果您在远程服务器上运行笔记本,内核将尝试在远程计算机上打开 GUI 窗口。除非您已安排将 xserver 转发回您的桌面,否则您将无法看到该窗口或与之交互。它也可能会引发异常。
PyCharm、Spyder 和 VSCode#
许多 IDE 都内置了与 Matplotlib 的集成,请查阅它们的文档以了解配置详细信息。