我的ipython图形不通过pyplot.show()显示

200 投票
17 回答
400464 浏览
提问于 2025-04-17 02:57

我需要帮助,在 ipython 中显示 matplotlib 的图表。我没有忘记调用 pyplot.show()

$ ipython --pylab

import matplotlib.pyplot as plt
plt.plot(range(20), range(20))

它的输出是 matplotlib.lines.Line2D at 0xade2b2c

plt.show()

但是没有任何反应。没有错误信息,也没有新窗口。我是通过 pip 安装的 matplotlib,安装过程中没有出现错误。

详细信息:

我使用的是:

  • Ubuntu
  • IPython v0.11
  • Python v2.6.6
  • matplotlib v1.0.1

17 个回答

46

在绘图之前,先在笔记本中添加一次 %matplotlib inline

75

我在Ubuntu 12.04上遇到了完全一样的问题,因为我在一个虚拟环境中用

pip install matplotlib

安装了matplotlib。简单来说,我的建议是:不要通过pip或者手动安装matplotlib;让真正的软件包管理器(比如apt-get或synaptic)来为你安装它和所有相关的依赖。

不幸的是,matplotlib的后端(也就是用来实际显示图表的不同方法)有很多依赖,而pip并不会处理这些依赖。更糟糕的是,它不会给你任何提示;也就是说,pip install matplotlib看起来是成功安装了matplotlib。但当你尝试使用它(比如pyplot.show())时,根本不会出现图表窗口。我尝试了网上推荐的各种后端(Qt4Agg、GTK等),结果都失败了(也就是说,当我尝试导入matplotlib.pyplot时,出现了ImportError,因为它试图导入一些缺失的依赖)。我接着研究如何安装这些依赖,但这让我更加想放弃在虚拟环境中用pip作为安装任何有非Python依赖的软件包的解决方案。

整个经历让我又回到了apt-get/synaptic(也就是Ubuntu的软件包管理器)来安装像matplotlib这样的软件。这次安装非常顺利。当然,这意味着你只能安装到系统目录里,无法享受虚拟环境的好处,而且你只能使用Ubuntu提供的版本,这些版本可能远远落后于当前的版本……

191

如果我把我的后端设置为 template~/.matplotlib/matplotlibrc 文件里,那么我就能复现你遇到的问题:

这个文件的内容是:

# backend      : GtkAgg
backend      : template

注意,文件 matplotlibrc 可能不在 ~/.matplotlib/ 这个文件夹里。如果是这样,下面的代码可以告诉你它在哪里:

>>> import matplotlib
>>> matplotlib.matplotlib_fname()

In [1]: import matplotlib.pyplot as p

In [2]: p.plot(range(20),range(20))
Out[2]: [<matplotlib.lines.Line2D object at 0xa64932c>]

In [3]: p.show()

如果你编辑 ~/.matplotlib/matplotlibrc 文件,把后端改成像 GtkAgg 这样的选项,你应该能看到一个图表。你可以用下面的代码列出你电脑上所有可用的后端:

import matplotlib.rcsetup as rcsetup
print(rcsetup.all_backends)

这段代码会返回一个类似这样的列表:

['GTK', 'GTKAgg', 'GTKCairo', 'FltkAgg', 'MacOSX', 'QtAgg', 'Qt4Agg',
'TkAgg', 'WX', 'WXAgg', 'CocoaAgg', 'agg', 'cairo', 'emf', 'gdk', 'pdf',
'ps', 'svg', 'template']

参考资料:

撰写回答