web-dev-qa-db-ja.com

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

毎回、最終行で「TypeError: 'str' object is callable」というエラーが表示されます。 yをxに変更すると、すべて問題ありません。 xをyに変更すると、同じエラーが発生します。ただし、ylabelはylabelのドロップダウンリストに表示されるため、関数は存在し、ドキュメントには、xlabel(matplotlib.pyplot.ylabel(s、* args、** kwargs)とまったく同じように、文字列が唯一の必要な引数であると記載されています。 matplotlib.pyplot.xlabel(s、* args、** kwargs))。ここで一体何が起こっているのでしょうか?

38
neptune36

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が復元されます。

99
wolfins

[〜#〜] edit [〜#〜]:このコードはクリーンランでは正常に機能しますが、ylabelを変更した可能性があります。この場合、@ wolfins answered(その答えを確認してください) のように、再起動すると修正されます。

ここで問題なく動作するため、何が悪いのかを説明できないのではないかと心配しています。以下のコードはエラーなしで実行され、正しいラベルでプロットを表示します。

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

それがうまくいかない場合は、おそらく次のようにFigureとAxesオブジェクトを使用してみてください。

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

根本的な問題は解決しません(再現できないため困難です)が、少なくともあなたの目的は達成されるかもしれません。

9
Mark

私はこれが私に起こった。私がやったことはassign xlabとylabへの文字列のようでした:

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

これはxlabとylabを壊し、もはやそれらを呼び出すことができないようになりました。なぜなら、これらは関数ではなく実際には文字列になっているからです。

同様に、私はJupyterを使用していたので、この問題を解決するにはJupyterを強制終了し、ゼロから再実行する必要がありました。

奇妙なことに、kernalの実行中にライブラリを再インポートすると[〜#〜] not [〜#〜]が動作しました。

5
Jordan

代わりにを呼び出す代わりにXlabel値を割り当てると、これは通常起こります。例:Xlabelを「X-DUMMY」に設定する場合。あなたが使用する必要があります

_plt.xlabel("X-DUMMY")
_

しかし、以下のようにすると間違ってしまいます。

_plt.xlabel= "X-DUMMY"
_

このエラーが発生します。たとえそれを修正しても。

_plt.xlabel("X-DUMMY") 
_

Kernalを再起動するまで、この問題は繰り返されます。

理由は、plt.xlabelは関数です。 in python関数はファーストクラスのオブジェクトです。一度割り当てたら

_ plt.xlabel= "X-DUMMY" 
_

文字列に変換されます。後でしようとすると、エラーがスローされます

'TypeError:' str 'オブジェクトは呼び出し不可能です'。

割り当ての前後にtype(plt.xlabel)を使用して試すことができます。そのデータ型を確認します。

3
Venkat Rajanala

チェックポイントを保存し、ipythonノートブックを停止しました。その後、再起動して問題を解決しました。

3
Mreno sert

私はjupyterノートブックでこの同じ問題に直面しているので、カーネルを再起動するだけでそれを修正することにあまりにも直面している場合は、コードに構文上の間違いはありません。

1
sayantan ghosh