交互式图形#
在探索图表时,互动性可能是无价的。Matplotlib GUI 窗口内置的平移/缩放和鼠标位置工具通常已经足够,但你也可以使用事件系统来构建自定义的数据探索工具。
参见
图表介绍.
Matplotlib 附带了与多个 GUI 工具包(Qt、Tk、Wx、GTK、macOS、JavaScript)绑定的 后端,第三方包提供了与 kivy 和 Jupyter Lab 的绑定。为了让图形对鼠标、键盘和绘图事件做出响应,GUI 事件循环需要与交互式提示集成。我们推荐使用 IPython(参见 下方)。
pyplot 模块提供了显式创建包含交互工具、工具栏、工具提示和 按键绑定 的图形的函数:
pyplot.figure创建一个新的空
Figure或选择一个现有的图pyplot.subplotspyplot.gcf获取当前的
Figure。如果 pyplot 图形堆栈上没有当前图形,则会创建一个新的图形。pyplot.gca获取当前的
Axes。如果图上没有当前的 Axes,则创建一个新的。
.pyplot 中的几乎所有函数都会根据需要通过当前的 .Figure / `~.axes.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 笔记本 / JupyterLab#
要在'经典'笔记本或Jupyter实验室中获得交互式图形,请使用 ipympl 后端(必须单独安装),该后端使用 ipywidget 框架。如果安装了 ipympl ,请使用以下魔法:
%matplotlib widget
选择并启用它。
如果你只需要使用经典笔记本(即 notebook<7),你可以使用
%matplotlib notebook
它使用了 Matplotlib 提供的 backend_nbagg 后端;然而,nbagg 在 Jupyter Lab 中无法工作。
备注
要获得此处描述的交互功能,您必须使用交互式后端。笔记本中的默认后端,即内联后端,则不是。backend_inline 在单元格执行时渲染一次图形,并将静态图像插入到笔记本中。由于图像是静态的,因此无法进行平移/缩放、接受用户输入或从其他单元格更新。
图形用户界面 + Jupyter#
你也可以在 Jupyter Notebook 中使用非 ipympl 的 GUI 后端。如果你在本地运行 Jupyter 内核,GUI 窗口将会在你的桌面生成,紧邻你的网络浏览器。如果你在远程服务器上运行笔记本,内核将尝试在远程计算机上打开 GUI 窗口。除非你已经安排将 xserver 转发回你的桌面,否则你将无法看到或与该窗口交互。它也可能引发异常。
PyCharm、Spyder 和 VSCode#
许多IDE都内置了与Matplotlib的集成,请查阅它们的文档以获取配置细节。