
开发工具CLI【免费下载链接】ipythonOfficial repository for IPython itself. Other repos in the IPython organization contain things like the website, documentation builds, etc.项目地址https://gitcode.com/gh_mirrors/ip/ipython点击查看免费下载在 IPython 作为内核运行时display()函数与%matplotlib魔法命令是让单元格输出呈现图片、动画等丰富媒体Rich Output并让 matplotlib 绘图无缝嵌入 Notebook 等前端的两大核心设施。本文以 docs/source/interactive/plotting.rst 为骨架结合 IPython/core/display_functions.py、IPython/core/magics/pylab.py、IPython/core/pylabtools.py 等源码实现系统讲解富输出的使用方式、%matplotlib的完整参数语义以及 inline、nbagg、ipympl 三类 Jupyter 后端的选择与调优。读完本文你将能在终端与 Notebook 环境下正确配置 matplotlib 后端并写出可复现、可维护的绘图与富媒体展示代码。富输出机制用 display() 替代 print()IPython 作为内核最突出的特性之一就是富输出Rich Output凡是能够以图片、声音、动画等形式表达的对象只要前端支持就能以更丰富的形态展示出来而不仅仅是文本。实现这一切的入口是display()函数from IPython.display import display display(你的对象) # 而不是 print(你的对象)在纯文本终端中display()与print()的输出差别不大——对象大多以文本形式呈现但在 Notebook 及其类似界面中你能得到明显更丰富的输出。其底层原理在 IPython/core/display_functions.py 中有完整实现display()会调用InteractiveShell的显示格式化器display_formatter.format计算对象的所有 MIME 表示再通过publish_display_data()把数据广播给所有已连接的前端由前端自行选择使用哪种表示。对象如何声明多种表示Python 对象通常只声明__repr__文本表示IPython 扩展了这一机制允许对象声明多种富表示。从 display() 的文档字符串 可以看到只需在类中实现对应的特殊方法即可特殊方法返回内容_repr_html_原始 HTML 字符串_repr_json_可 JSON 化的字典_repr_jpeg_原始 JPEG 数据_repr_png_原始 PNG 数据_repr_svg_原始 SVG 字符串_repr_latex_以$包裹的 LaTeX 命令字符串_repr_mimebundle_完整的 mimebundle任意 MIME 类型的映射用于上述未列出的类型以上方法也可以返回(数据, 元数据)二元组以便附带与特定表示相关的元数据。对于无法修改源码的既有类还可以通过注册格式化器的方式接入显示系统相关说明见文档 docs/source/config/integrating.rst仓库中对应 IPython/core/formatters.py。display() 的关键参数结合 display() 的函数签名 与源码实现常用参数如下rawFalse对象是否已是按 MIME 类型键组织的原始显示数据而非需要格式化的 Python 对象include/exclude只计算 / 排除指定 MIME 类型的表示metadata与输出关联的元数据字典其中与数据键同名的 MIME 键会作用于对应表示transient瞬态数据字典不会被持久化到 Notebook 文件中display_id为输出指定 ID配合update_display()可原地更新已有输出传入True时自动生成新 ID此时display()会返回一个 DisplayHandle可用其.update(obj)更新、.display(obj)追加显示clear显示前是否清空输出区为True时会等待新输出到达后再清除。配套函数clear_output(waitFalse)用于清空当前单元格输出update_display 的定义 要求必须传入display_id。另外源码注释 明确指出自 IPython 5.4 与 6.1 起display无需导入即可直接使用但若代码可能在纯 Python 环境或旧版 IPython 中运行仍建议显式from IPython.display import display。%matplotlib让绘图与 IPython 无缝协作IPython 内核的另一大特性是直接展示代码单元产出的图形。内核与 matplotlib 库深度集成来实现这一点其开关就是%matplotlib魔法命令它属于 IPython/core/magics/pylab.py 中PylabMagics类提供的 line magic完整 magic 清单见 docs/source/interactive/magics.rst。必须在导入 matplotlib 之前执行文档强调在导入 matplotlib 或执行任何绘图代码之前应执行%matplotlib。它负责完成 IPython 与 matplotlib 协作所需的幕后设置但不会真正执行任何 Pythonimport——也就是说不会向命名空间添加任何名字。这一点与%pylab形成鲜明对比见下文。背后的完整步骤从 InteractiveShell.enable_matplotlib 的实现 可以看到%matplotlib实际完成四件事选择合适的 GUI 事件循环与 matplotlib 后端pylabtools.find_gui_and_backend以该后端启用 matplotlib 交互模式pylabtools.activate_matplotlib会调用matplotlib.interactive(True)并切换后端配置 inline 图形显示的格式化器configure_inline_support启用所选 GUI 事件循环并把ExecutionMagics的default_runner替换为 mpl_runner使%run执行脚本后也能正确刷新图形。%matplotlib 参数语义与后端选择不带参数使用默认后端如果不使用%matplotlib或调用时不带任何参数绘图命令将使用 matplotlib 的默认后端输出——该默认值因操作系统及是否运行在 Jupyter 内而异。无参调用时IPython 会读取 matplotlib 原始配置matplotlib.rcParamsOrig[backend]而非已被修改的rcParams并打印出所选后端例如In [2]: %matplotlib Using matplotlib backend: TkAgg这一行为由 _show_matplotlib_backend 实现只有当gui为空或为auto时才打印提示显式指定后端时则静默启用tests/test_magics_pylab.py 中的 test_matplotlib_no_arg_prints_backend 对此有专门断言。显式指定后端或 GUI 事件循环可以显式请求后端例如%matplotlib qt传入%matplotlib的参数可以是 matplotlib 认识的任一后端名也可以是qt、osx这类GUI 事件循环名——后者会自动选择支持该 GUI 循环的合适后端。参数与后端的映射关系见 pylabtools.py 中的后端映射表这是为 matplotlib 3.9 保留的降级路径当前主要由 matplotlib 自身的后端注册表负责解析传入参数解析后的 matplotlib 后端tkTkAggqt/qt5/qt6QtAggosxMacOSXwxWXAgggtk3/gtk4GTK3Agg/GTK4Aggnbagg/notebooknbAgginlinemodule://matplotlib_inline.backend_inlineipympl/widgetmodule://ipympl.backend_nbagg注意从源码看qt4/qt5这类旧参数依然保留而agg、svg、pdf、ps等纯文件型后端也在此表中——它们不涉及 GUI 事件循环。列出所有可用后端要获取 matplotlib 认识的全部后端与 GUI 循环清单使用%matplotlib --list该选项在 matplotlib magic 的参数定义 中通过-l/--list声明实际列出逻辑见 pylabtools._list_matplotlib_backends_and_gui_loops它会合并 matplotlib 后端注册表中的全部后端与全部 GUI 框架名并加上auto后排序输出。典型输出形如Available matplotlib backends: [agg, auto, gtk, gtk3, gtk4, inline, nbagg, notebook, osx, qt, qt4, qt5, tk, webagg, widget, wx]测试 test_matplotlib_list 也验证了输出以Available matplotlib backends: [开头且包含agg与auto。不依赖 magic 的替代方案如果你希望代码在 IPython 之外也能运行可以绕开 IPython 专属魔法改用 matplotlib 自身的交互开关import matplotlib.pyplot as plt plt.ion() # 打开交互模式 plt.ioff() # 关闭交互模式这是原文档特别提示的、可移植性更强的方案。Jupyter 生态中的三种专用后端在 Jupyter 生态中有几个需要特别区分的后端inlineIPython 提供Jupyter 默认由IPython 提供实际实现位于独立的matplotlib_inline包后端模块名为module://matplotlib_inline.backend_inline适用于 Jupyter Lab、Notebook 与 QtConsole是使用 Jupyter 时的默认后端绘图命令的输出会内联显示在产生它的代码单元正下方并且结果图会保存在 Notebook 文档中随文件一起持久化。notebook / nbaggmatplotlib 内置交互式由matplotlib 内置解析为nbAgg适用于 Jupyternotebook 7与nbclassic图形是交互式的支持缩放与平移。ipympl / widgetJupyter Lab 专用需单独安装面向 Jupyterlab与notebook 7实现位于独立的ipympl模块需按常规方式用pip或conda额外安装图形同样是交互式的可缩放与平移。从 pylabtools.py 的映射表 可见ipympl与widget两个名字都指向module://ipympl.backend_nbagg。三种后端的对比如下后端提供方适用环境交互能力安装要求inlineIPythonmatplotlib_inlineJupyter Lab / Notebook / QtConsole静态内联图随 IPython 提供notebook/nbaggmatplotlib 内置notebook 7、nbclassic可缩放、平移无ipympl/widgetipympl 模块Jupyter Lab、notebook 7可缩放、平移需 pip/conda 安装 ipympl选择逻辑归纳为Notebook 场景通常直接用默认的inline静态、可存档需要图形内交互操作时老版本 Notebook 用nbaggJupyter Lab 或新版 Notebook 则安装并选用ipympl。inline 后端的进阶调优文档与 PylabMagics.matplotlib 的 docstring 中还给出两个非常实用的 inline 后端调优技巧。切换图形输出格式使用matplotlib_inline.backend_inline.set_matplotlib_formats可以指定内联图形的格式如pdf、svgIn [1]: from matplotlib_inline.backend_inline import set_matplotlib_formats In [2]: set_matplotlib_formats(pdf, svg)其底层机制见 pylabtools.select_figure_formats支持png、png2x/retina、jpg/jpeg、svg、pdf等格式会把matplotlib.figure.Figure注册到 IPython 显示格式化器中对应的 MIME 类型处理器上由 print_figure 负责渲染retina格式会以两倍 DPI 渲染 PNG见 retina_figure。调整 bbox_inches 行为inline 后端默认将图形的bbox_inches设为tight这可能导致屏幕显示图与用savefig保存的图不一致。可以通过%config魔法禁用该行为In [3]: %config InlineBackend.print_figure_kwargs {bbox_inches:None}此外set_matplotlib_formats与set_matplotlib_close的 docstring 还描述了其他可调行为例如设置图形关闭策略等可按需查阅。%pylab 的历史角色与启动时配置为何推荐 %matplotlib 而非 %pylab早期 IPython 通过%pylab一次性导入 numpy、matplotlib 并执行from pylab import *、from numpy import *填充交互命名空间。从 pylab magic 的实现 与 import_pylab 可以看到它执行的导入序列np、plt、figsize、getfigs、display等并可能覆盖clobber用户已有变量——执行时会检测冲突并发出警告。因此该 magic 在源码中已打印明确的弃用提示%pylab is deprecated, use %matplotlib inline and import the required libraries.推荐的现代做法是%matplotlib inline 显式import所需库将命名空间控制权完全交给用户。若仍要使用%pylab可用--no-import-all禁止两次import *该标志的默认行为由配置项InteractiveShellApp.pylab_import_all决定。启动时自动启用 matplotlib除运行时魔法外IPython 应用配置也支持在启动阶段预置绘图环境。见 IPython/core/shellapp.py 中的三个相关配置项matplotlib允许配置为某个后端启动时调用shell.enable_matplotlib(key)pylab预加载 matplotlib 与 numpy 并选择后端启动时调用shell.enable_pylab(key, import_allself.pylab_import_all)pylab_import_all布尔值默认True为False时 pylab 模式不再向用户命名空间导入任何名字。例如在 IPython 配置文件中写入c.InteractiveShellApp.matplotlib inline即可让每次启动自动启用 inline 后端无需手动执行魔法命令。测试如何验证这些行为仓库的单元测试 tests/test_magics_pylab.py 直接验证了本文涉及的核心行为可作为理解实现的参考test_matplotlib_list%matplotlib --list输出以Available matplotlib backends: [开头且包含agg与autotest_matplotlib_explicit_backend显式指定后端如agg后matplotlib 处于交互模式is_interactive()为真且不打印后端提示test_matplotlib_no_arg_prints_backend无参调用会打印Using matplotlib backend:test_pylab_*系列验证%pylab的默认import_allTrue行为、--no-import-all标志、应用配置项pylab_import_all的优先级以及命名空间被覆盖时的警告。总结富输出用display()取代print()对象可通过_repr_html_/_repr_png_等特殊方法声明多种 MIME 表示display_idupdate_display()支持原地更新输出。绘图集成在任何 matplotlib 导入之前执行%matplotlib它只做幕后设置、不污染命名空间不带参数使用默认后端%matplotlib --list可查看全部可用后端。后端选择Jupyter 默认inline静态、随文档存档老版 Notebook 用nbagg获得交互图Jupyter Lab / Notebook ≥ 7 安装ipympl后使用widget后端。可移植替代不想依赖 IPython 魔法时直接使用matplotlib.pyplot.ion()/ioff()。对于更多细节尤其是后端机制本身可进一步查阅 matplotlib 官方文档中关于 backends 的章节原文档亦有此指引并结合本仓库 docs/source/interactive/plotting.rst、IPython/core/magics/pylab.py 与 IPython/core/pylabtools.py 继续深入。赞分享开发工具CLI【免费下载链接】ipythonOfficial repository for IPython itself. Other repos in the IPython organization contain things like the website, documentation builds, etc.项目地址https://gitcode.com/gh_mirrors/ip/ipython点击查看免费下载相关推荐RIOT STDIO 抽象层完全指南从 UART 到 USB/RTT/BLE 的输入输出后端配置与源码解析RIOT STDIO 抽象层完全指南从 UART 到 USB/RTT/BLE 的输入输出后端配置与源码解析 本文围绕 RIOT 操作系统中的 STDIO 抽象物联网嵌入式操作系统实时系统ESP-IDF 标准输入输出Standard I/O与 Console 输出配置完全指南ESP IDF 标准输入输出Standard I/O与 Console 输出配置完全指南 导读 本文基于 ESP IDF 官方文档 docs/en/api物联网嵌入式Inferno.js Hooks终极指南从useState到自定义Hook实战Inferno.js Hooks终极指南从useState到自定义Hook实战 Inferno.js 作为一款超快速的类 React JavaScript 库图计算数据分析科学计算上一篇HeidiSQL快捷键终极指南提升数据库管理效率的10个技巧下一篇深度学习项目精选快速发现GitHub热门AI项目的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考