导入matplotlib和matplotlib.pyplot有什么区别?

13
我对Python还比较新,想知道x.y语句是否表示y是x的子模块?如果是这样,那么下面的命令不是会有问题吗?
import matplotlib.pyplot as plt

我只想导入特定的子模块而不是其他的,这是为了获取对 hist 函数的访问权限。这会对调用 import matplotlib as plt 时通常导入的模块产生什么影响?我能否将所有matplotlib模块集中到plt名称下?

我知道这个问题与从NumPy、Matplotlib包导入Python子模块有何区别相关,但该问题的答案并未告诉我如何只导入matplotlib的全部内容,而不用担心遗漏子模块。


你是说你不能再使用plot函数了吗? - Plasma
@Plasma 你说得对,我刚试了一下,之前可能做错了什么。我修改了问题,但现在更加困惑了... 只导入了pyplot模块吗?还是包括子模块pyplot在内的整个matplotlib都被导入了? - Moppentapper
2
pyplot是matplotlib的一个子模块,如果你这样导入它可能会更清晰:from matplotlib import pyplot as plt。你也可以使用from matplotlib import *,这样你就会导入matplotlib中的每个模块,包括pyplot(并通过调用matplotlib.pyplot.plot来绘制)。然而,如果你要绘制图形,pyplot可能是你唯一需要的。 - Plasma
@Plasma,现在我明白了很多!谢谢!那么最后一个问题:有没有一种方法可以将matplotlib所有子模块中包含的所有函数直接导入工作区?类似于from matplotlib import *,但是它会导入子模块中的所有函数,以便您可以简单地使用plot(x,y)?还是说您必须为每个子模块单独执行此操作(例如from matplotlib.pyplot import *,以及所有其他子模块)? - Moppentapper
我不知道有什么办法可以导入每个子模块中的所有函数。使用from matplotlib.pyplot import *这种方式可能导入每个子模块中的所有函数。 - Plasma
显示剩余4条评论
3个回答

12

请看这个代码库树:matplotlib 包含一个代码库,而 pyplot 只是这个库中的一个文件。

import matplotlib

will会导入此存储库中的所有文件。例如,要使用它:

import matplotlib as mpl
mpl.pyplot.plot(...)

要导入pyplot:

from matplotlib import pyplot as plt
# or
import matplotlib.pyplot as plt
plt.plot(...)

有一个问题要问你:你使用哪个控制台?我猜是Ipython控制台或者其他什么吧?

编辑:

导入全部:

from matplotlib import *
pyplot(...)

为什么我猜你在使用Ipython?Ipython控制台默认在启动时导入了numpy和其他一些库中的所有模块,所以在Ipython控制台中,您可以简单地使用sqrt,而不是import math; math.sqrt等。 matplotlib也默认被导入到Ipython中。


是的,我正在Spyder中使用IPython控制台。谢谢,那很有道理。我仍然在想(我刚刚在上面问了@Plasma同样的问题),是否有一种方法可以直接导入所有子模块中的所有函数?这可能不是一个理想的选择,但对我来说,似乎只需导入matplotlib包含的所有内容并使用简单的语句如plot(x,y)至少在学习如何正确使用Python的前几个月内会更容易。 - Moppentapper
谢谢!我不知道 IPython 自动导入了其中的一些库,但这解释了我使用它时注意到的一些事情!你的编辑方式可以让我使用 pyplot.plot(x, y),但我不能只输入 plot(x, y)。不过没关系,感谢你和 Plasma,现在我明白了正在发生什么! - Moppentapper
@Moppentapper,你真的理解了吗?plot是在matplotlib.pyplot中的一个函数,当只导入matplotlib.*时,你抱怨不能简单地使用plot?当答案有用时,请点赞。 - knh170
我理解的是:pyplot 是 matplotlib 的一个子模块。写 from matplotlib import * 会将所有子模块导入工作区。在这种情况下,为了使用 plot 函数,我可以写 pyplot.plot(x,y) 而不是写 matplotlib.pyplot.plot(x,y),但我不能直接写 plot(x,y),因为 plot 在工作区中没有被定义。如果要无需“前缀”使用 plot,则必须使用 from matplotlib.pyplot import *,但我不能直接将所有子模块的所有函数导入工作区。这样说对吗? - Moppentapper
1
当你理解了Python的运作方式,它会变得更有趣!! - Moppentapper
原来 import matplotlib as mpl; mpl.pyplot.plot(3) 不起作用:AttributeError: module 'matplotlib' has no attribute 'pyplot'。这是因为导入一个包(即带有 __init__.py 的目录)不会自动导入其模块(该目录中的 .py 文件)。 - ijoseph

2

我不知道有什么方法可以导入每个子模块中的所有函数。使用例如from matplotlib.pyplot import *的方式可以导入一个子模块中的所有函数。

需要注意导入每个函数可能存在潜在问题;您可能会通过定义与导入函数相同名称的自己的函数来覆盖导入的函数。例如:

from matplotlib.pyplot import *

def plot():
    print "Hello!"

plot()

将输出

Hello!

这很有道理,所以我假设至少有一个函数在matplotlib的至少两个子模块中被定义。然后导入所有内容会导致阴影效应。现在这一切都建立起来了,真是有趣的事情! - Moppentapper

0

我已经安装了conda,它添加了一些内容到~/.bashrc文件中。

将其注释后,它对我起作用了。


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