matplotlib轴标签出现奇怪错误

nep*_*e36 42 python axes matplotlib

我对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")
Run Code Online (Sandbox Code Playgroud)

每次,我得到错误'TypeError:'str'对象不可调用'为最后一行.如果我将y更改为x,一切都很好.如果我将x更改为ay,我会得到相同的错误.但是,ylabel出现在ylabel的下拉列表中,所以函数确实存在,文档说字符串是唯一必要的参数,与xlabel完全相同(matplotlib.pyplot.ylabel(s,*args,**kwargs)和matplotlib.pyplot.xlabel(s,*args,**kwargs)).到底是怎么回事?

wol*_*ins 112

在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
Run Code Online (Sandbox Code Playgroud)

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

  • 我也认为这也是问题所在!我时不时地犯这个错误.谢谢! (4认同)
  • 确认我也成功在iPython中做到了这一点! (4认同)
  • 是的,我认为这也是我的错误.感谢您发现它! (2认同)
  • 我发现很多人都有这个错误的事实非常有趣:)) (2认同)
  • 很有说明性。它指出了不要陷入这种错误的重要性。谢谢 (2认同)

Mar*_*ark 9

编辑:此代码适用于干净运行,但您可能已更改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()
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,也许您可​​以尝试使用图形和轴对象,就像这样

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()
Run Code Online (Sandbox Code Playgroud)

没有解决潜在的问题(这很难,因为我无法重现它),但也许它至少会实现你的目的.

  • 谢谢,这很有效.至于我的代码,毕竟重启解释器就完成了这个伎俩.对于那个很抱歉! (11认同)

小智 7

我发生了这件事.似乎我所做的是字符串分配给xlab和ylab,如:

plt.xlab = 'string'
plt.ylab = 'string'
Run Code Online (Sandbox Code Playgroud)

这打破了xlab和ylab,因此你不能再调用它们,因为它们现在实际上是字符串,而不是函数.

同样地,我正在使用Jupyter,我不得不杀死Jupyter并从头开始重新运行以解决这个问题.

奇怪的是,重新导入库,而籽粒仍然运行没有工作.


小智 6

这通常会发生,如果您分配 Xlabel 值而不是调用 . 例如:如果您想将 Xlabel 设置为“X-DUMMY”。你需要使用

plt.xlabel("X-DUMMY")
Run Code Online (Sandbox Code Playgroud)

但如果你按照下面的方式做,就会出错。

plt.xlabel= "X-DUMMY"
Run Code Online (Sandbox Code Playgroud)

你会得到这个错误。即使你纠正它说。

plt.xlabel("X-DUMMY") 
Run Code Online (Sandbox Code Playgroud)

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

原因是, plt.xlabel 是一个函数。在 python 函数中是一流的对象。一旦你分配

 plt.xlabel= "X-DUMMY" 
Run Code Online (Sandbox Code Playgroud)

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

'TypeError: 'str' 对象不可调用'。

您可以通过使用type(plt.xlabel)before 和 after assignment来尝试。查看它的数据类型。