凡例に入れるラベル付きのハンドルが見つかりません

Salman Mehmood 2023年6月20日
  1. 凡例に入れるラベル付きのハンドルが見つかりません
  2. Matplotlib で 凡例に入れるラベルが見つかったハンドルがありません を解決する
凡例に入れるラベル付きのハンドルが見つかりません

この記事では、Matplotlib を使用して何かをプロットしようとしたときに、警告 No handles with labels found to put in legend を解決する方法を示します。

凡例に入れるラベル付きのハンドルが見つかりません

さまざまなアプリケーションで広く使用されている Matplotlib は、MATLAB と同様の機能をユーザーにある程度提供することを目的とした Python ライブラリです。 分析やその他の目的で、データの静的、アニメーション、およびインタラクティブな視覚化を作成します。

Matplotlib を使用して何かをプロットしようとしているときに、理解やその他の理由で、視覚化グラフの特定の部分にラベルを付けたいことがよくあります。 このプロセス中に、何らかのエラーのために凡例を作成できなかったことを示唆する警告が表示される場合があります。

次のコードを検討してください。

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)
ax.spines["left"].set_position("zero")
ax.spines["right"].set_color("none")
ax.spines["bottom"].set_position("zero")
ax.spines["top"].set_color("none")

plt.axis([-5, 5, -5, 5])

ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("left")

plt.grid()

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True)
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True)
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True)

plt.legend()
plt.show()

プログラムを実行すると、次の出力が表示されます。

問題の出力

上記のコードで、グラフをプロットしようとすると、次のようなエラーが発生します。

No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.

注: 最近の更新では、警告がハンドルなしではなくアーティストなしで始まるようになりました。

出力画像から明らかなように、凡例が生成されていないことがわかります。 ラベルの代わりに、プロットのみが表示されます。

Matplotlib で 凡例に入れるラベルが見つかったハンドルがありません を解決する

プロットされた Figure で legend() メソッドを呼び出す前に label パラメーターを指定しなかった場合、警告が発生します。

pyplot は、Python でインタラクティブな図のプロットを可能にする Matplotlib への状態ベースのインターフェイスです。 legend() メソッドは、軸に凡例を追加できます。

ただし、labels オプションを省略してから legend() 関数を呼び出すと、エラー メッセージが表示されます。

No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when `legend()` is called with no argument.

以下は、この警告が表示されるいくつかのシナリオです。

原因 1: ラベルが宣言されていない

凡例に含まれるはずのラベルが最初から宣言されていなかった可能性があります。

次の例を考えてみましょう。

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True)
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True)
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True)

上記の矢印宣言では、それらのいずれにもラベルが割り当てられていないため、凡例に追加されるはずのラベルが凡例で見つからない可能性があります。

この場合の修正は簡単で、矢印にラベルを追加します。

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True, label="u")
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True, label="v")
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True, label="u+v")

plt.arrow() メソッド内でラベルを宣言する代わりに、plt.legend() 関数自体にラベルを渡すことでラベルを宣言することもできます。

plt.legend() メソッドは、プロットで宣言する必要のあるラベルを含むリストまたはタプルを受け取ります。

以下の例を考えてみましょう。

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True)
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True)
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True)

plt.legend(["u", "v", "u+v"])

ラベルが定義されたので、警告は表示されず、以下に示すようにグラフが正常にプロットされます。

解決策 1

凡例のラベルを宣言するのを忘れることはよくある間違いです。 グラフの要素を宣言するときはいつでも、ラベルを宣言することをお勧めします。 このアプローチは、特定のラベルの宣言を見逃す可能性を減らすのに役立ちます。

コードからわかるように、matplotlib では、さまざまなプロット要素を作成するいくつかの関数 (この場合は plt.arrow()) への引数としてラベルを宣言できます。

原因 2: 凡例の後に作成されたプロット

この問題のもう 1つの根本的な原因は、グラフが正しくプロットされる順序が正しく守られていないことです。 たとえば、プロットを作成する前に凡例を作成すると、警告が表示され、凡例は作成されません。

次のコードを検討してください。

plt.legend()  # Wrong Placement

plt.arrow(0, 0, 3, 1, head_width=0.2, color="b", length_includes_head=True)
plt.arrow(0, 0, 3, 4, head_width=0.2, color="g", length_includes_head=True)

ここでは、実際にプロット自体を作成する前に legend() 関数を呼び出しました。 legend() 関数が呼び出されたときにラベル (またはプロット) が宣言されていないため、警告が表示され、凡例は空のままになります。

これを修正するには、legend() が呼び出されていることを確認してください。 グラフのすべての側面は、適切なラベルでプロットされています。

私たちの場合、それは次のようになります。

plt.arrow(0, 0, 3, 1, head_width=0.2, color="b", length_includes_head=True, label="x")
plt.arrow(0, 0, 3, 4, head_width=0.2, color="g", length_includes_head=True, label="y")

plt.legend()  # Correct placement

plt.legend() の順序が修正されたので、プロットには定義された凡例が含まれます。

解決策 2

完全なコード:

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)

ax.spines["left"].set_position("zero")
ax.spines["right"].set_color("none")
ax.spines["bottom"].set_position("zero")
ax.spines["top"].set_color("none")

plt.axis([-5, 5, -5, 5])

ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("left")

plt.grid()

plt.arrow(0, 0, 3, 1, head_width=0.2, color="r", length_includes_head=True, label="u")
plt.arrow(0, 0, 1, 3, head_width=0.2, color="g", length_includes_head=True, label="v")
plt.arrow(0, 0, 4, 4, head_width=0.2, color="b", length_includes_head=True, label="u+v")

plt.legend()
# plt.legend(['u','v','u+v'])
plt.show()
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn