“%matplotlib内联”的目的

%matplotlib inline到底有什么用?

863323 次浏览

%matplotlib是IPython中的魔法函数。为了方便起见,我将在这里引用相关的留档供您阅读:

IPython有一组预定义的“魔法函数”,您可以使用命令行风格的语法调用它们。魔法有两种,面向行的和面向单元格的。线条魔法以%字符为前缀,其工作方式与OS命令行调用非常相似:它们将该行的其余部分作为参数获取,其中参数在没有括号或引号的情况下传递。线条魔法可以返回结果,并且可以在赋值的右侧使用。单元格魔法以双%为前缀,它们是不仅作为参数获取该行其余部分的函数,而且还将其下方的行作为单独参数的函数。

%matplotlib inline将matplotlib的后端设置为内联后端

有了这个后端,绘图命令的输出将内联显示在前端中,就像Jupyter笔记本一样,直接显示在生成它的代码单元下方。然后,生成的绘图也将存储在笔记本文档中。

使用内联后端时,您的matplotlib图形将包含在您的笔记本中,就在代码旁边。关于如何在代码中使用它,可能还值得阅读如何使IPython笔记本matplotlib情节内联以供参考。

如果您也想要交互性,您可以使用nBagg后端%matplotlib notebook(在IPython 3. x中),如这里所述。

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

根据留档

要设置它,在matplotlib的任何绘图或导入之前执行您必须执行%matplotlib magic command。这执行IPython工作所需的幕后设置正确地与matplotlib手牵手;它不,然而,实际执行任何Python导入命令,即没有名称添加到命名空间。

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

%matplotlib inline

使用此后端,绘图命令的输出内联显示在像Jupyter笔记本这样的前端中,直接在代码下方产生它的细胞。然后生成的图也将存储在笔记本文件。

这不是强制写的。它对我来说很好,没有(%matplotlib)魔法函数。我正在使用Sypder编译器,Anaconda中附带的编译器。

如果您想将绘图添加到Jupyter笔记本中,那么%matplotlib inline是标准解决方案。还有其他魔术命令将在Jupyter中以交互方式使用matplotlib

%matplotlib:任何plt绘图命令现在都将导致图形窗口打开,并且可以运行进一步的命令来更新绘图。某些更改不会自动绘制,要强制更新,请使用plt.draw()

%matplotlib notebook:将导致嵌入在笔记本中的交互式情节,您可以缩放和调整图形大小

%matplotlib inline:只在笔记本中绘制静态图像

如果你不知道什么是后端,你可以阅读:https://matplotlib.org/stable/users/explain/backends.html

有些人从python shell交互式地使用matplotlib当他们键入命令时弹出绘图窗口。有些人运行Jupyter笔记本和绘制内联图以进行快速数据分析。其他人将matplotlib嵌入到wxpython等图形用户界面中或pygtk来构建丰富的应用程序。有些人在批处理脚本以从数值生成附言图像模拟,还有一些运行Web应用程序服务器来动态提供图表。为了支持所有这些用例,Matplotlib可以针对不同的输出,并且每个输出能力称为后端;“前端”是面向用户的代码,即绘图代码,而“后端”完成所有困难在幕后工作,使图。

因此,当您内联键入%matplotlib时,它会激活内联后端。正如历史发文中所讨论的:

使用此后端,绘图命令的输出内联显示在像Jupyter笔记本这样的前端中,直接在代码下方产生它的细胞。然后生成的图也将存储在笔记本文件。

从IPython 5.0和matplotlib 2.0开始,您可以避免使用IPython的特殊魔力和用途matplotlib.pyplot.ion()/matplotlib.pyplot.ioff()其中有在IPython之外工作的优点也是如此。

ipython文档

这只是意味着我们作为代码的一部分创建的任何图形都将出现在同一个笔记本中,而不是出现在单独的窗口中,如果我们没有使用这个神奇的语句,就会发生这种情况。

太长别读

%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-对GTK 3. x画布的Agg渲染(需要PyGObject和pyc开罗或cairocffi)。

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


IPython 5.0matplotlib 2.0开始,您可以避免使用IPython的特殊魔力和用途matplotlib.pyplot.ion()/matplotlib.pyplot.ioff()它也具有在IPython之外工作的优势。

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

如果您运行的是Jupyter Notebook,%matplotlib内联命令将使您的绘图输出显示在笔记本中,也可以存储。

要解释清楚:

如果你不喜欢这样:

在此处输入图片描述

添加%matplotlib inline

在此处输入图片描述

在你的jupyter笔记本里有它。

我认为在最近版本的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 pltfrom matplotlib.image import imread# %matplotlib inline
plt.rcParams["figure.dpi"] = 200plt.imshow(imread("path_to_your_image"))print(plt.rcParams["figure.dpi"])