"%matplotlib inline" 的目的是什么?

920
`%matplotlib inline`的确切用途是什么?

51
这是一个神奇的函数,可以在笔记本中呈现图形(而不是显示图形对象的转储)。这里有一个简单的Matplotlib教程:https://www.data-blogger.com/2017/11/15/python-matplotlib-pyplot-a-perfect-combination/。 - www.data-blogger.com
15
您可以通过输入 %matplotlib --list 来查看可用的后端(如 inline)。 - Luis
2
可能是如何使IPython笔记本matplotlib图表内联的重复问题。 - desertnaut
我最近看到了一篇关于这个话题的不错的推特帖子:https://twitter.com/tedpetrou/status/1238812794218307590?lang=en - Scott Boston
相关:matplotlib python inline on/off以及如何更改后端。 - user2314737
12个回答

516

%matplotlib 是IPython中的一个 魔法函数。我会为您引用相关文档以便于阅读:

IPython有一组预定义的“魔法函数”,可以使用命令行风格的语法调用。有两种类型的魔法,一种是行向魔法,另一种是单元格魔法。行魔法以%字符为前缀,并且与操作系统命令行调用非常相似:它们将剩余的行作为参数传递,其中参数不带括号或引号。行魔法可以返回结果,并且可以在赋值的右侧使用。单元格魔法以两个%%为前缀,它们是函数,不仅将剩余的行作为参数,而且还将其下面的行作为单独的参数。

%matplotlib inline 设置matplotlib的后端为“inline”后端

使用这个后端,绘图命令的输出将在诸如Jupyter笔记本之类的前端中内联显示,直接在生成它的代码单元格下方显示。生成的图形也将存储在笔记本文档中。
当使用“inline”后端时,你的matplotlib图形将包含在笔记本中,与代码并排显示。你可能还需要阅读如何使IPython notebook matplotlib图形内联作为参考,了解如何在你的代码中使用它。
如果你也想要交互性,可以使用nbagg后端%matplotlib notebook(在IPython 3.x中),如此处所述。

11
好的,但是如果没有激活这样的魔法,我怎么能看到图表呢? - JaakL
1
更具体地说,这是一个内置的魔术命令。 (Built-in magic command) - russau
1
@JaakL 当使用agg后端时,图形将在新窗口中呈现,这是大多数环境中的默认设置。最终,图形的呈现方式取决于Matplotlib在该环境中使用的后端。 - zr0gravity7
5
请注意,对于Google的colab,matplotlib后端默认设置为inline(具体来说是module://ipykernel.pylab.backend_inline)。 - zr0gravity7
1
对OP的问题的回答都让我无法理解。默认行为(即不使用%matplotlib inline)是将图表“内联”显示。在我的生活中,我从未遇到过图表出现在新窗口中或者根本不显示的情况。图表总是,总是出现在定义它的单元格下方。这感觉像是解决一个不存在的问题。我错过了什么吗? - NaiveBae
1
只是在回应@NaiveBae,因为直到最近,我一直在想同样的问题。如果你以这种方式导入matplotlib:import matplotlib.pyplot as plt,那么图表总是会出现在笔记本中。即使你使用面向对象的接口,通过fig, ax = plt.subplots(),你仍然在激活pyplot的隐式接口。如果你改用纯面向对象的接口,并且以from matplotlib.figure import Figure导入,那么你会发现,除非你指定要使用的后端,否则图表将不会显示。 - undefined

127

为了更清楚地解释:

如果您不喜欢这样:

enter image description here

请添加%matplotlib inline

enter image description here

然后在您的jupyter笔记本中就可以看到它了。


19
你的第二段代码错过了使用%matplotlib inline的全部意义。整个意义在于现在你不需要再使用plt.show(),而你在第二个代码中仍在使用它。还有一个有趣的事实,在你的第二段代码中,即使你不使用%matplotlib inline而只是使用plt.show(),图形仍会出现在Jupyter笔记本中。请阅读我下面的问题 here,即使到今天也没有得到回答。 - Sheldore
1
是的,我们使用的软件中有一些bug。我通常喜欢编写清晰的命令。这意味着 plt.show() 应该存在。即使可能已经在某个地方默认设置了 %matplotlib inline 的魔法,它也应该存在。 - prosti
1
但我真的不明白为什么你要在使用matplotlib inline时在jupyter笔记本中使用plt.show()。特别是当你在jupyter笔记本的上下文中回答这样的问题时。 - Sheldore
1
我个人喜欢有一个命令来控制某些东西是否应该出现。我讨厌含蓄或不完整。想象一下,如果有人错误地设置了 plt.close() 而没有设置 plt.show() 的情况。你重新启动笔记本电脑,却发现什么也没有显示出来。所以我仍然会设置 plt.show(),这不会有任何坏处。 - prosti
7
有趣。因为我使用Jupyter Notebook,无论是否使用%matplotlib inline,输出始终是第二种情况,窗口从未弹出。 - Paw in Data
1
@PawinData 我有同样的经验。似乎 %matplotlib inline 必须是较新版本的 Jupyter Notebook 的默认设置。 - Michael Bergstrom

112

如果您正在运行IPython,则%matplotlib inline将使您的图形输出在笔记本中显示并存储。

根据文档

要设置这个功能,在任何绘图或导入matplotlib之前,您必须执行%matplotlib魔法命令。此举对于让IPython与matplotlib正确协同工作是必要的;但它不执行任何Python导入命令,也就是说,不会将任何名称添加到命名空间中。

由IPython提供的一个特别有趣的后端是inline后端。它只适用于Jupyter Notebook和Jupyter QtConsole。可以按以下方式调用:

%matplotlib inline

使用这个后端,绘图命令的输出会在前端(如Jupyter笔记本)中内联显示,在生成它的代码单元格的正下方。生成的图形也将存储在笔记本文档中。


48
如果你想在Jupyter笔记本中添加图表,则%matplotlib inline是一个标准解决方案。还有其他魔术命令将在Jupyter内部交互使用matplotlib%matplotlib: 任何plt绘图命令都会打开一个图形窗口,可以运行进一步的命令来更新绘图。一些更改不会自动绘制,要强制更新,请使用plt.draw() %matplotlib notebook: 将导致嵌入到笔记本中的交互式绘图,您可以缩放和调整图形大小。 %matplotlib inline: 在笔记本中只绘制静态图像。

16
这只是意味着我们在代码中创建的任何图表都会出现在同一个笔记本中,而不是出现在单独的窗口中(如果我们没有使用这个神奇语句) 。

15

TL;DR

%matplotlib inline - 将输出以内联方式显示


IPython内核具有通过执行代码来显示图表的功能。 IPython内核旨在与matplotlib绘图库无缝配合,以提供此功能。

%matplotlib 是一个魔术命令,它执行必要的幕后设置,使IPython能够正确地与matplotlib协同工作; 它不执行任何Python导入命令,也就是说,没有名称添加到命名空间中。

在单独的窗口中显示输出

%matplotlib

行内显示输出

(仅适用于 Jupyter Notebook 和 Jupyter QtConsole)

%matplotlib inline

дЄОдЇ§дЇТеЉПеРОзЂѓдЄАиµЈжШЊз§Ї

пЉИжЬЙжХИеАЉдЄЇ'GTK3Agg'пЉМ'GTK3Cairo'пЉМ'MacOSX'пЉМ'nbAgg'пЉМ'Qt4Agg'пЉМ'Qt4Cairo'пЉМ'Qt5Agg'пЉМ'Qt5Cairo'пЉМ'TkAgg'пЉМ'TkCairo'пЉМ'WebAgg'пЉМ'WX'пЉМ'WXAgg'пЉМ'WXCairo'пЉМ'agg'пЉМ'cairo'пЉМ'pdf'пЉМ'pgf'пЉМ'ps'пЉМ'svg'пЉМ'template'пЉЙ

%matplotlib gtk

示例 - GTK3Agg - 一种将Agg渲染到GTK 3.x画布的方法(需要PyGObject和pycairo或cairocffi)。

有关matplotlib交互式后端的更多详细信息: 此处


IPython 5.0matplotlib 2.0开始,您可以避免使用 IPython的特定魔法,而使用matplotlib.pyplot.ion()/matplotlib.pyplot.ioff(), 它们具有在IPython之外工作的优点。

参考:IPython丰富输出 - 交互式绘图


这里有一个非常新手的问题,抱歉...什么是“IPython内核”和“魔法命令”?Python突然分裂了吗,变得不像Python了吗?我从未听说过这些概念。 - lb_so
1
对于Python笔记本(ipynb)- IPython内核或Jupyter内核是项目要使用的Python版本(及其依赖项)。您可以启动Jupyter笔记本,然后更改内核以使用不同配置的Python运行单元格,并配置环境变量等。 - Ani Menon
1
@Ib_so 魔法命令是ipython/jupyter的一个特性。在此处阅读更多信息。 - Ani Menon

12
从IPython 5.0和matplotlib 2.0开始,您可以避免使用IPython特有的魔术方法,而是使用matplotlib.pyplot.ion() / matplotlib.pyplot.ioff(),这两个函数也适用于IPython以外的环境。 ipython文档

我认为这与更改后端不同。除非后端是“inline”,否则图形将在外部窗口中生成,您需要使用display()在笔记本中显示它们。 - Vincenzooo
无论它与更改后端有何不同,它在运行x-server时帮助了我在ipython终端中。 - Ben Ogorek

8
如果您不知道什么是后端,可以阅读以下内容:https://matplotlib.org/stable/users/explain/backends.html 有些人从Python shell交互式地使用Matplotlib,并在键入命令时弹出绘图窗口。有些人运行Jupyter笔记本并绘制内联图以进行快速数据分析。其他人将Matplotlib嵌入到图形用户界面(如wxpython或pygtk)中,以构建丰富的应用程序。一些人在批处理脚本中使用Matplotlib从数值模拟生成PostScript图像,还有些人运行Web应用服务器以动态提供图形。为了支持所有这些用例,Matplotlib可以针对不同的输出目标,每个这些功能都被称为后端;“前端”是用户界面代码,即绘图代码,而“后端”则背后做所有艰难工作以制作图形。
因此,当您键入%matplotlib inline时,它会激活内联后端。如前几篇文章所讨论的那样:
使用此后端,绘图命令的输出在类似于Jupyter笔记本的前端中显示,在产生它的代码单元格下方直接显示。然后,结果绘图也将存储在Notebook文档中。

2

如果您正在运行Jupyter Notebook,则%matplotlib inline命令将使您的图形输出显示在笔记本中,也可以存储。


1
我认为在最近的Jupyter/matplotlib版本中,图形是“内联”绘制的,无需使用%matplotlib inline命令。因此,有人可能认为这个命令现在是无用的......但据我了解,它创建了一个“管理器”,用于配置绘图参数。Matplotlib在创建图形时查找现有的管理器,并在必要时创建一个管理器。在matplotlib.pyplot.figure内部:
    manager = _pylab_helpers.Gcf.get_fig_manager(num)
    if manager is None:
        # not relevant stuff…
        manager = new_figure_manager(
            num, figsize=figsize, dpi=dpi,
            facecolor=facecolor, edgecolor=edgecolor, frameon=frameon,
            FigureClass=FigureClass, **kwargs)


现在,设置绘图参数(rcParams)本身不会创建“管理器”。因此,在第一次绘制图形时,将创建新的管理器并覆盖您的参数。
取消或注释掉%matplotlib inline,看看会发生什么。(每次尝试之间不要忘记重新启动内核!)
import matplotlib.pyplot as plt
from matplotlib.image import imread
# %matplotlib inline

plt.rcParams["figure.dpi"] = 200
plt.imshow(imread("path_to_your_image"))
print(plt.rcParams["figure.dpi"])

是的,没有“%matplotlib inline”,图表现在可以在Jupyter笔记本中显示了。 - jdhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接