1. ホーム
  2. python

[解決済み] Matplotlibのレジェンドが動作しない

2022-05-14 12:10:21

質問

matplotlibをアップグレードしてから、凡例を作成しようとすると次のようなエラーが発生するようになりました。

/usr/lib/pymodules/python2.7/matplotlib/legend.py:610: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0x3a30810>]
Use proxy artist instead.

http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist

  warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(orig_handle),))
/usr/lib/pymodules/python2.7/matplotlib/legend.py:610: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0x3a30990>]
Use proxy artist instead.

http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist

  warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(orig_handle),))

このような些細なスクリプトでも発生します。

import matplotlib.pyplot as plt

a = [1,2,3]
b = [4,5,6]
c = [7,8,9]

plot1 = plt.plot(a,b)
plot2 = plt.plot(a,c)

plt.legend([plot1,plot2],["plot 1", "plot 2"])
plt.show()

エラーが指し示すリンクは、エラーの原因を診断する上でかなり役に立たないことがわかりました。

どのように解決するのですか?

カンマを追加する必要があります。

plot1, = plt.plot(a,b)
plot2, = plt.plot(a,c)

カンマが必要な理由は、plt.plot()が、コマンドから実際にいくつ作成されたかに関係なく、線状オブジェクトのタプルを返すからです。カンマがなければ、 "plot1" と "plot2" はラインオブジェクトの代わりにタプルであり、後の plt.legend() の呼び出しが失敗することになります。

カンマは、タプルの代わりに、"plot1" と "plot2" が自動的にタプル内の最初のオブジェクト、すなわち、実際に欲しいラインオブジェクトになるように、結果を暗黙的にアンパックしています。

http://matplotlib.sourceforge.net/users/legend_guide.html#adjusting-the-order-of-legend-items

line, = plot(x,sin(x)) コンマは何の略ですか?