如何使IPython Notebook Matplotlib内联绘图


829

我正在MacOS X上使用Python 2.7.2和IPython 1.1.0的情况下使用IPython Notebook。

我无法获得matplotlib图形来内联显示。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

我也试过了%pylab inline和ipython命令行参数,--pylab=inline但这没什么区别。

x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp')
plt.show()

我得到的不是内联图形,而是:

<matplotlib.figure.Figure at 0x110b9c450>

matplotlib.get_backend()表明我有'module://IPython.kernel.zmq.pylab.backend_inline'后端。


您的代码段不应该产生,<matplotlib.figure.Figure at 0x110b9c450>但是<matplotlib.text.Text at 0x94f9320>(因为您的最后一行正在打印标题)。无论如何,您的代码(带有%matplotlib内联代码和plt.show())在Windows上可以按预期工作
joaquin

感谢您的建议,但对我不起作用。我仍然获得没有内联图形的上述输出。您有任何故障排除建议吗?
伊恩·菲斯克

没有线索。相同的python,相同的ipython(和相同的后端),但是在Windows上,它可以工作....我想在没有内联时,plot对您有用,对吗?
华金

2
没有%matplotlib inline,内核将永久保持繁忙状态,并且我没有任何输出。它必须被杀死。这是试图使用MacOSX后端,但我猜它由于某种原因无法打开。当不使用ipython笔记本时,用于matplotlib的MacOSX后端可以正常工作。
伊恩·菲斯克

1
我有一个相同的症状,但事实证明,我在OSX 10.8上安装了32位版本的Canopy。重新安装64位版本可以解决此问题。
Vicky T

Answers:


1128

%matplotlib inline在笔记本的第一个单元中使用了它,并且可以正常工作。我认为您应该尝试:

%matplotlib inline

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

通过在配置文件中设置以下配置选项,默认情况下,您也始终可以始终默认以内联模式启动所有IPython内核:

c.IPKernelApp.matplotlib=<CaselessStrEnum>
  Default: None
  Choices: ['auto', 'gtk', 'gtk3', 'inline', 'nbagg', 'notebook', 'osx', 'qt', 'qt4', 'qt5', 'tk', 'wx']
  Configure matplotlib for interactive use with the default matplotlib backend.

7
我认为这是正确的答案。替代方法可行--pylab inline,但是会向您发出以下警告: 不建议以pylab模式启动所有内核,并且在以后的版本中将禁用它。请改用%matplotlib魔术来启用matplotlib。pylab意味着许多进口产品,这些产品可能产生令人困惑的副作用,并损害笔记本的可重复性。
mpavlov

1
@ eNord9 @mightwolf:我正在学习使用iPython(以及Python编程而不是Matlab);哪些呢import matplotlib' do versus 进口matplotlib为[名]“?原谅简单的评论
TSGM 2014年

1
@ eNord9 @mightwolf:以及与“ from matplotlib import mpl”的比较。
TSGM 2014年

2
@TSGM对于您的问题,我看到的最好的解释是:effbot.org/zone/import-confusion.htm
mpavlov 2014年

谢谢@ eNord9。我刚刚测试了您的命令,因为更新和所有功能已经有一段时间了。现在,在Python 2.7.9和IPython 3.1.0上一切正常。
伊恩·菲斯克

214

如果您的matplotlib版本高于1.4,则也可以使用

IPython 3.x及更高版本

%matplotlib notebook

import matplotlib.pyplot as plt

旧版本

%matplotlib nbagg

import matplotlib.pyplot as plt

两者都将激活nbagg后端,从而启用交互性。

使用nbagg后端的示例图


这似乎不适用于%config InlineBackend.figure_format='retina'。任何想法如何获得交互式视网膜数字?
orome 2016年

嗯...我对视网膜图形真的没有太多的专业知识。我偶然发现的唯一一件事就是该链接,但是它可能已被弃用。如果更多的人想知道同样的事情,我在这里链接您的SO问题,并祝您在那里得到解答。最佳
Løiten

31
这个答案被低估了。%matplotlib notebook提供比更好的可视化效果%matplotlib inline
Hieu

9
%matplotlib notebook在jupyter笔记本电脑4.1.1 / ubuntu 16.04 / chrome上,使用不能正常工作(有点先显示,然后再显示空白)%matplotlib inline,但确实显示图像,但它们出现在降价文字之后,而不是字面上的“内联”。
迈克尔

6
如果%matplotlib inline先尝试然后切换到%matplotlib notebook,则可能会得到空结果。重新启动内核,然后再次运行。
捷克学


24

使用%pylab inline魔术命令。


14
不再:“ ipython笔记本--pylab内联[E 15:01:18.182 NotebookApp]已删除了在命令行上指定--pylab的支持。[E 15:01:18.182 NotebookApp]请在笔记本本身中使用%pylab inline%matplotlib inline。 ”
戴夫X

14

要在Jupyter(IPython 3)中默认使matplotlib内联:

  1. 编辑档案 ~/.ipython/profile_default/ipython_config.py

  2. 加线 c.InteractiveShellApp.matplotlib = 'inline'

请注意,添加该行将ipython_notebook_config.py不起作用。否则,它可以与Jupyter和IPython 3.1.0一起使用




5

我做了anaconda安装,但是matplotlib没有绘制

当我这样做时它开始绘图

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

2

您可以使用语法错误来模拟此问题,但是%matplotlib inline无法解决该问题。

首先是创建绘图的正确方法的示例。eNord9提供的导入内容和魔术可以使一切正常工作。

df_randNumbers1 = pd.DataFrame(np.random.randint(0,100,size=(100, 6)), columns=list('ABCDEF'))

df_randNumbers1.ix[:,["A","B"]].plot.kde()

但是,通过将()绘图类型的末尾保留为空白,您会收到含糊不清的非错误。

错误代码:

df_randNumbers1.ix[:,["A","B"]].plot.kde

错误示例:

<bound method FramePlotMethods.kde of <pandas.tools.plotting.FramePlotMethods object at 0x000001DDAF029588>>

除了这一行消息外,没有堆栈跟踪或其他明显的理由认为您犯了语法错误。该图不打印。


这不是一个语法错误-没有()调用 kde,IPython的告诉你什么kde ,即绑定方法。因此,实际上,从iPython的角度来看,这根本不是“错误”,因此为什么没有堆栈跟踪。
Kyle Strand

1
@KyleStrand谢谢。重新阅读我的文章后,我应该说的是:“我认为我的问题是无法使用%matplotlib inline命令使绘图以内联方式显示。实际上我只是忘了在绘图类型的末尾加上()。所以如果其他都失败了,看看括号里有没有错。”
Blake M

1

在Jupyter的单独单元中运行绘图命令时,我遇到了同样的问题:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         <Figure size 432x288 with 0 Axes>                      #this might be the problem
In [4]:  ax = fig.add_subplot(1, 1, 1)
In [5]:  ax.scatter(x, y)
Out[5]:  <matplotlib.collections.PathCollection at 0x12341234>  # CAN'T SEE ANY PLOT :(
In [6]:  plt.show()                                             # STILL CAN'T SEE IT :(

通过将绘图命令合并到单个单元格中解决了该问题:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         ax = fig.add_subplot(1, 1, 1)
         ax.scatter(x, y)
Out[3]:  <matplotlib.collections.PathCollection at 0x12341234>
         # AND HERE APPEARS THE PLOT AS DESIRED :)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.