Matplotlib轴标签出现奇怪错误

72

我对Python和编程很新,所以如果我错过了一些显而易见的东西,请提前道歉。我正在尝试绘制一个图表并标记轴,但每次尝试标记y轴时都会引发异常。我在一个新脚本中编写了下面的代码,以确保问题不是来自模块中的其他地方。我正在使用Python 3.4。

from numpy import *
from matplotlib import *

a = [1, 2, 3, 4, 5]
b = [2, 3, 2, 3, 2]
pyplot.plot(a, b)
pylab.xlabel("Time")
pylab.ylabel("Speed")
每次在最后一行都会出现错误'TypeError: 'str' object is not callable'。如果我将y更改为x,则一切都好。如果我将x更改为y,则会出现相同的错误。然而,ylabel在下拉列表中出现了,因此函数确实存在,并且文档说明字符串是唯一必要的参数,就像xlabel一样(matplotlib.pyplot.ylabel(s,* args,** kwargs)和matplotlib.pyplot.xlabel(s,* args,** kwargs))。这里到底发生了什么?

我无法重现这个问题。你的代码在我的电脑上运行良好,无论是在 xlabel 还是 ylabel 中使用那些字符串都可以互换。 - Cory Kramer
1
我通过打开一个新的终端并重新运行代码来解决了相同的问题。 - Preston
8个回答

193

当我在iPython笔记本上工作时,我遇到了同样的问题。

我认为可以按照以下步骤重现:

import matplotlib.pyplot as plt
plt.ylabel = 'somestring' # oh wait this isn't the right syntax.
... 
plt.ylabel('somestring') # now this breaks because the function has been turned into a string

重新启动内核或重新导入库会将plt.ylabel恢复为一个函数。

7
我也认为这是问题所在!我偶尔也会犯这个错误。谢谢! - Jimi Oke
3
是的,我也认为这是我的错误。谢谢你发现了它! - yuqli
2
我觉得很有趣,这么多人都遇到了完全相同的错误 :)) - Shlomo Koppel
2
非常具有说明性。它强调了不要犯这些错误的重要性。谢谢。 - Cris
1
这应该是正确的被接受的答案。这正是我的问题,也可能是每个人的问题。 - blissweb
显示剩余4条评论

10

编辑:这段代码在正常运行时是工作正常的,但是您可能已经更改了 ylabel,如果是这种情况,重新启动应该可以解决问题,如 @wolfins 回答的(检查那个答案)

很抱歉我无法告诉您哪里出错了,因为这段代码在这里运行得很好。以下代码运行无误,并显示具有正确标签的图表。

from matplotlib import pyplot, pylab
a = [1, 2, 3, 4, 5]
b = [2, 3, 2, 3, 2]
pyplot.plot(a, b)
pylab.xlabel("Time")
pylab.ylabel("Speed")
pyplot.show()
如果那种方法对您不适用,也许您可以尝试使用图形和轴对象,就像这样。
from matplotlib.pyplot import subplots, show
a = [1, 2, 3, 4, 5]
b = [2, 3, 2, 3, 2]
fig, ax = subplots()
ax.plot(a, b)
ax.set_xlabel("Time")
ax.set_ylabel("Speed")
show()

无法解决根本问题(因为我无法复现它),但或许至少可以达到您的目的。


11
谢谢,那行。至于我的代码,在所有这些操作之后,重新启动解释器就解决了问题。对此很抱歉! - neptune36
@neptune36 或许最好更改被接受的答案,因为wolfins似乎已经成功地以同样的方式破坏了它,所以这可能更有用。 - Mark
谢谢你的标记。我不知道这个五年前的问题会引起这么多关注! - neptune36

8

我刚刚遇到了这个问题。 看起来我的做法是给xlab和ylab分别赋值一个字符串:

plt.xlab = 'string'
plt.ylab = 'string'

这导致xlab和ylab无法再被调用,因为它们现在实际上是字符串而不是函数。
同样地,我正在使用Jupyter时,必须杀掉Jupyter并从头重新运行来解决此问题。
奇怪的是,当内核保持运行时重新导入库并没有起作用。

7

通常情况下,如果您指定Xlabel值而不是调用它,则会发生这种情况。 例如:如果您想将Xlabel设置为“X-DUMMY”,则需要使用以下代码:

plt.xlabel("X-DUMMY")

但如果您不小心按照以下步骤操作。
plt.xlabel= "X-DUMMY"

即使你更正了这个错误,你仍然会得到这个错误。

plt.xlabel("X-DUMMY") 

除非您重新启动内核,否则此问题将重复出现。

原因是plt.xlabel是一个函数。在Python中,函数是一等对象。一旦您分配了

 plt.xlabel= "X-DUMMY" 

当你尝试将it转换为字符串时,它会被转换为字符串。稍后当你再次尝试时,会抛出错误:

'TypeError: 'str' object is not callable'。

你可以在赋值之前和之后使用 type(plt.xlabel) 来查看其数据类型。


3

我保存了检查点并停止了IPython笔记本。然后我重新启动它,这样问题就得到解决了。


2

我在jupyter notebook中也遇到了同样的问题,如果你也遇到了这个问题,只需重新启动内核即可解决,代码中并没有任何语法错误。


-1

这可能会对您有所帮助:

# 0. Import matplotlib and get it ready
%matplotlib inline
import matplotlib.pyplot as plt

# 1. Prepare data
x = [1,2,3,4]
y = [10,20,30,40]

# 2. Setup plot
fig, ax = plt.subplots(figsize=(8,8)) # width & height 

# 3. Plot the data
ax.plot(x,y)

# 4. Customize Plot
ax.set(title="Simple Plot", 
        xlabel="X - Put your X label TITLE here",
        ylabel="Y - Put your y label TITLE here")


# 5. Display
plt.show()

1
提供代码答案是可以的,但最好包括一些描述为什么您的代码有效的说明。您实际上并没有帮助任何人。问题本身存在错误,您没有解释为什么会出现这种情况或者您的代码如何修复和更改。 - incarnadine

-2

如果您使用的是Windows操作系统,可能没有安装正确版本的matplotlib。

您需要注意您所使用的Python版本以及计算机上需要安装的matplotlib版本。

下载链接:https://pypi.python.org/pypi/matplotlib/ 对于Windows用户,请执行以下命令进行安装:python -m pip install --user matplotlib-2.1.0-cp36-cp36m-win_amd64.whl

在文件名中,cp36表示Python 3.6,cp27表示Python 2.7,请始终首先检查计算机上安装的Python版本。


这与问题完全无关。 - ImportanceOfBeingErnest

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