Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

matplotlib ylabel TypeError: 'str' object is not callable [duplicate]

I'm very new to Python and programming in general, so apologies in advance if I'm missing something obvious. I'm trying to plot a graph and label the axes, but every time I try to label the y axis an exception is raised. I wrote the code below in a new script to make sure the problem wasn't coming from somewhere else in the module. I'm using 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")

Every time, I get the error 'TypeError: 'str' object is not callable' for the final line. If I change the y to an x, everything is fine. If I change the x to a y, I get the same error. However, ylabel comes up on the drop down list for ylabel so the function does exist and the documentation says a string is the only necessary argument, exactly as for xlabel (matplotlib.pyplot.ylabel(s, *args, **kwargs) and matplotlib.pyplot.xlabel(s, *args, **kwargs)). What on earth could be going on here?

like image 378
neptune36 Avatar asked Jun 09 '14 12:06

neptune36


4 Answers

I had this same issue when working in iPython notebook.

I think it can be re-created as follows:

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 

Re-starting the kernel or re-importing the libraries restores plt.ylabel to a function.

like image 67
wolfins Avatar answered Sep 19 '22 11:09

wolfins


EDIT: This code works fine for clean runs, but you might have changed ylabel, in which case restarting should fix it, as @wolfins answered (check that answer).

I'm afraid I can't tell you what's going wrong because it works fine here. The below code runs without error and shows the plot with correct label.

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() 

If that doesn't work for you, perhaps you can try using figure and axes objects, like this

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() 

Doesn't solve the underlying problem (which is hard since I can't reproduce it), but maybe it will achieve your purpose at least.

like image 36
Mark Avatar answered Sep 21 '22 11:09

Mark


I just had this happen to me. It seems that what I did was assign a string to xlab and ylab like:

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

This broke the xlab and ylab such that you cannot call them anymore, since they are now in fact strings, not functions.

Similarly, I was using Jupyter, and I had to kill Jupyter and re-run it from scratch to fix this problem.

Oddly, re-importing the libraries while the kernal remained running did NOT work.

like image 45
Jordan Avatar answered Sep 20 '22 11:09

Jordan


This usually Happens, if you assign the Xlabel value instead calling . ex: if you want to set the Xlabel to "X-DUMMY". you need to use

plt.xlabel("X-DUMMY")

but by mistake if you do as below.

plt.xlabel= "X-DUMMY"

you will get this error . Even if you correct it saying .

plt.xlabel("X-DUMMY") 

This issue repeats unless you restart you restart the kernal .

reason being, plt.xlabel is a function. in python functions are first-class objects.once you assigned

 plt.xlabel= "X-DUMMY" 

it get converted to a string. later when ever you try, it throws error as

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

you can try it by using type(plt.xlabel) before and after assignment. to see its datatype.

like image 36
Venkat Rajanala Avatar answered Sep 20 '22 11:09

Venkat Rajanala