交互式图形

在处理数据时,交互性是非常宝贵的。Matplotlib GUI窗口中内置的平移/缩放和鼠标定位工具通常就足够了,但是您也可以使用事件系统来构建定制的数据探索工具。

Matplotlib附带 backends 绑定到多个GUI工具包(Qt、Tk、Wx、GTK、macOS、JavaScript)和第三方包提供了到的绑定 kivyJupyter Lab . 为了使图形能够响应鼠标、键盘和绘画事件,GUI事件循环需要与交互式提示集成。我们建议使用IPython(请参阅 below

这个 pyplot 模块提供显式创建图形的功能,其中包括交互式工具、工具栏、工具提示和 key bindings

pyplot.figure
创建新的空 figure.Figure 或选择现有地物
pyplot.subplots
创建新的 figure.Figure 用一个网格填充它 axes.Axes

pyplot 有“当前图形”的概念,可以通过 pyplot.gcf 以及“电流轴”的概念 pyplot.gca . 几乎所有的函数 pyplot 穿过水流 Figure / axes.Axes (视情况而定)创造一个。

Matplotlib保留对通过创建的所有开放图形的引用 pyplot.figurepyplot.subplots 这样数字就不会被垃圾收集。 Figure 可以关闭和注销 pyplot 单独通过 pyplot.close ;全部打开 Figure 可以通过关闭 plt.close('all') .

有关Matplotlib事件系统和集成事件循环的更多讨论,请阅读:

IPython集成

我们建议将IPython用于交互式shell。除了它的所有特性(改进的选项卡完成、magics、多行编辑等),它还确保GUI工具箱事件循环与命令行正确集成(请参见 命令提示集成

在本例中,我们通过IPython提示符创建和修改地物。该图显示在Qt5Agg GUI窗口中。配置集成并启用 interactive mode 使用 %matplotlib 魔术:

::

在 [1] 用法:%matplotlib使用matplotlib后端:Qt5Agg

在 [2] :导入matplotlib.pyplot文件作为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()

在最新版本的 MatplotlibIPython ,导入就足够了 matplotlib.pyplot 并打电话 pyplot.ion . 使用 % magic保证在Matplotlib和IPython的所有版本中都能工作。

交互模式

pyplot.ion 打开交互模式。
pyplot.ioff 关闭交互模式。
pyplot.isinteractive 返回pyplot是否处于“交互模式”。
pyplot.show 显示所有打开的图形。
pyplot.pause 运行GUI事件循环 间隔 秒。

交互模式控件:

  • 是否自动显示创建的图形
  • 对艺术家的更改是否会自动触发重新绘制现有图形
  • 什么时候? pyplot.show() 如果未给定参数,则返回:立即返回,或在关闭所有图形后返回

如果处于交互模式:

  • 新创建的图形将立即显示
  • 当元素更改时,图形将自动重画
  • pyplot.show() 显示数字并立即返回

在交互模式下:

如果您处于非交互模式(或在非交互模式下创建图形),则可能需要显式调用 pyplot.show 在屏幕上显示窗口。如果您只想在固定的时间内运行GUI事件循环,那么可以使用 pyplot.pause . 这将阻止代码的进度,就像您调用了 time.sleep ,确保显示当前窗口并在需要时重新绘制,然后在指定的时间段内运行GUI事件循环。

与命令提示符集成的GUI事件循环和处于交互模式的图形是相互独立的。如果你使用 pyplot.ion 但是没有安排事件循环集成,当提示等待输入时,您的图形将出现但不会交互。您将无法平移/缩放,图形甚至可能无法渲染(窗口可能显示为黑色、透明或作为其下桌面的快照)。相反,如果您配置事件循环集成,则无论pyplot的“交互模式”如何,在等待提示输入时,所显示的图形都会有响应。

无论交互模式设置和事件循环集成的组合如何,如果您使用 pyplot.show(block=True)pyplot.pause ,或以其他方式运行GUI主循环。

警告

使用 figure.Figure.show 可以在屏幕上显示图形,而无需启动事件循环,也无需处于交互模式。这可能会起作用(取决于GUI工具箱),但可能会导致一个无响应的图形。

默认用户界面

创建的窗口 pyplot 有一个带有导航按钮的交互式工具栏,以及光标指向的数据值的读数。默认情况下会注册许多有用的keybinding。

其他Python提示

交互模式在默认的Python提示符下工作:

>>> import matplotlib.pyplot as plt
>>> plt.ion()
>>>

但是,这并不能确保事件挂钩已正确安装,并且您的数字可能没有响应。有关详细信息,请参阅GUI工具箱的文档。

Jupyter笔记本/实验室

注解

要获得此处描述的交互式功能,必须使用交互式后端。笔记本中的默认后端(内联后端)不是。 backend_inline 渲染图形一次,并在执行单元格时将静态图像插入笔记本。由于图像是静态的,因此无法平移/缩放、获取用户输入或从其他单元格更新图像。

要在“classic”笔记本或Jupyter lab中获取交互式图形,请使用 ipympl 使用 我的Widget 框架。如果 ipympl 使用魔法安装:

%matplotlib widget

选择并启用它。

如果你只需要使用经典笔记本,你可以使用

%matplotlib notebook

其中使用 backend_nbagg Matplotlib提供的后端;但是,nbagg不能在Jupyter实验室中工作。

GUIs+Jupyter公司

您还可以使用Jupyter笔记本中的一个非``ipympl``GUI后端。如果您在本地运行Jupyter内核,GUI窗口将出现在您的桌面上,与您的web浏览器相邻。如果在远程服务器上运行笔记本,内核将尝试打开远程计算机上的GUI窗口。除非您已安排将xserver转发回桌面,否则您将无法看到该窗口或与之交互。它也可能引发一个例外。

PyCharm、Spyder和VSCode

许多ide都内置了与Matplotlib的集成,有关配置的详细信息,请参阅它们的文档。