web-dev-qa-db-fra.com

Erreur étrange avec les étiquettes des axes matplotlib

Je suis très nouveau pour Python et la programmation en général, donc excuses à l'avance si je manque quelque chose d'évident. J'essaie de tracer un graphique et d'étiqueter les axes, mais chaque fois que je essayez d'étiqueter l'axe y une exception est levée. J'ai écrit le code ci-dessous dans un nouveau script pour m'assurer que le problème ne venait pas d'ailleurs dans le module. J'utilise 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")

Chaque fois, j'obtiens l'erreur "TypeError: l'objet" str "n'est pas appelable" pour la ligne finale. Si je change le y en un x, tout va bien. Si je change le x en y, j'obtiens la même erreur. Cependant, ylabel apparaît dans la liste déroulante pour ylabel donc la fonction existe et la documentation dit qu'une chaîne est le seul argument nécessaire, exactement comme pour xlabel (matplotlib.pyplot.ylabel (s, * args, ** kwargs) et matplotlib.pyplot.xlabel (s, * args, ** kwargs)). Que diable pourrait-il se passer ici?

38
neptune36

J'ai eu ce même problème lorsque je travaillais dans un ordinateur portable iPython.

Je pense qu'il peut être recréé comme suit:

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

Le redémarrage du noyau ou la réimportation des bibliothèques restaure plt.ylabel dans une fonction.

99
wolfins

[~ # ~] modifier [~ # ~] : ce code fonctionne très bien pour les exécutions propres, mais vous avez peut-être changé ylabel, dans ce cas, le redémarrage devrait le corriger, comme @wolfins répondu (vérifiez cette réponse) .

J'ai bien peur de ne pas pouvoir vous dire ce qui ne va pas car cela fonctionne bien ici. Le code ci-dessous s'exécute sans erreur et montre le tracé avec une étiquette correcte.

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

Si cela ne fonctionne pas pour vous, vous pouvez peut-être essayer d'utiliser des objets figure et axes, comme celui-ci

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

Ne résout pas le problème sous-jacent (ce qui est difficile car je ne peux pas le reproduire), mais peut-être qu'il atteindra au moins votre objectif.

9
Mark

Je venais juste de m'arriver à ça. Il semble que ce que j'ai fait était assign une chaîne à xlab et ylab comme:

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

Cela a cassé le xlab et le ylab de telle sorte que vous ne pouvez plus les appeler, car ce sont désormais des chaînes et non des fonctions.

De même, j'utilisais Jupyter, et j'ai dû tuer Jupyter et le réexécuter à partir de zéro pour résoudre ce problème.

Curieusement, la réimportation des bibliothèques alors que le noyau était en cours d'exécution PAS fonctionnait.

5
Jordan

Cela se produit généralement si vous attribuez la valeur Xlabel à la place. ex: si vous voulez définir le Xlabel sur "X-DUMMY". vous devez utiliser

plt.xlabel("X-DUMMY")

mais par erreur si vous faites comme ci-dessous.

plt.xlabel= "X-DUMMY"

vous obtiendrez cette erreur. Même si vous le corrigez en disant.

plt.xlabel("X-DUMMY") 

Ce problème se répète, sauf si vous redémarrez, vous redémarrez le noyau.

raison, plt.xlabel est une fonction. dans python sont des objets de première classe une fois que vous avez affecté

 plt.xlabel= "X-DUMMY" 

il est converti en chaîne. plus tard, lorsque vous essayez, cela génère une erreur

'TypeError: l'objet' str 'n'est pas appelable'.

vous pouvez l'essayer en utilisant type(plt.xlabel) avant et après affectation. pour voir son type de données.

3
Venkat Rajanala

J'ai enregistré le point de contrôle et arrêté le bloc-notes ipython. Ensuite, je l'ai redémarré, ce qui a résolu le problème.

3
Mreno sert

J'ai rencontré ce même problème dans le cahier jupyter, donc si vous êtes trop confronté au redémarrage du noyau et que cela le corrigerait, il n'y a aucune erreur syntaxique dans votre code.

1
sayantan ghosh