为什么Matplotlib没有'pylab'属性?

4

我以这种方式导入了matplotlib

import matplotlib as mpl

当我运行以下代码时,出现了一个错误,错误提示为'module' object has no attribute 'pylab'

x = np.arange(0,10,0.01)   # import numpy as np
y = np.sin(x)
mpl.pylab.plot(x,y)
mpl.pylab.show()

当我用另一种方式导入matplotlib时,没有出现任何错误:

import matplotlib.pylab as pl

有人知道发生了什么吗?

3个回答

10

为了在非交互模式下绘图,您应该使用模块pyplot而不是pylab

from matplotlib import pyplot
import numpy

pyplot.plot(range(1,100), numpy.sin(range(1,100)))
pyplot.show()

通常情况下,模块pylab不是作为matplotlib的子模块使用,而是作为顶层模块使用。通常,它用于交互模式,将numpy、scipy和matplotlib的几个部分合并到一个命名空间中。

>>> from pylab import *
>>> plot(range(1,100), sin(range(1,100)))
>>> show()

我只关心如何正确使用 pylabpyplot!但是你提到的确实对我很有帮助。 - YOng
@ Chinmay:我认为from pyplot import *应该改成pylab。 - joris

5

子模块并不总是默认导入的。您可以使用以下命令导入pylab

import matplotlib as mpl
import matplotlib.pylab  # Loads the pylab submodule as well
# mpl.pylab is now defined

这就是为什么对你来说,执行import matplotlib.pylab as pl这个命令可以解决问题。

默认情况下不导入子模块可以加快加载速度。它也不会将未使用的子模块名称污染到主模块命名空间中。模块的创建者可以定义哪些子模块默认加载(由于pylab非常庞大,因此matplotlib默认情况下不会导入它)。


-1

如果您要导入的模块没有__init__.py文件,则通常会出现此错误。我在我的安装中也遇到了此错误。我认为您只需接受必须从matplotlib单独导入matplotlib.pylab。


默认导入哪些子模块实际上完全由模块创建者控制。在pylab的情况下,matplotlib/__init__.py实际上可以包含一个简单的import pylab,并且通过import matplotlib就可以使用matplotlib.pylab(它不需要有一个__init__.py文件)。 - Eric O. Lebigot

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