交互式图形¶
在处理数据时,交互性是非常宝贵的。Matplotlib GUI窗口中内置的平移/缩放和鼠标定位工具通常就足够了,但是您也可以使用事件系统来构建定制的数据探索工具。
Matplotlib附带 backends 绑定到多个GUI工具包(Qt、Tk、Wx、GTK、macOS、JavaScript)和第三方包提供了到的绑定 kivy 和 Jupyter 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.figure
或 pyplot.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()
在最新版本的 Matplotlib
和 IPython
,导入就足够了 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.show
在屏幕上显示窗口。如果您只想在固定的时间内运行GUI事件循环,那么可以使用 pyplot.pause
. 这将阻止代码的进度,就像您调用了 time.sleep
,确保显示当前窗口并在需要时重新绘制,然后在指定的时间段内运行GUI事件循环。
与命令提示符集成的GUI事件循环和处于交互模式的图形是相互独立的。如果你使用 pyplot.ion
但是没有安排事件循环集成,当提示等待输入时,您的图形将出现但不会交互。您将无法平移/缩放,图形甚至可能无法渲染(窗口可能显示为黑色、透明或作为其下桌面的快照)。相反,如果您配置事件循环集成,则无论pyplot的“交互模式”如何,在等待提示输入时,所显示的图形都会有响应。
无论交互模式设置和事件循环集成的组合如何,如果您使用 pyplot.show(block=True)
, pyplot.pause
,或以其他方式运行GUI主循环。
警告
使用 figure.Figure.show
可以在屏幕上显示图形,而无需启动事件循环,也无需处于交互模式。这可能会起作用(取决于GUI工具箱),但可能会导致一个无响应的图形。
其他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的集成,有关配置的详细信息,请参阅它们的文档。