26

pyplot のplt.fill_between()メソッドを使用して積み上げ線/面積プロットを作成していますが、非常に多くのことを試した後でも、凡例やラベルが表示されない理由をまだ理解できません (それらをコード)。コードは次のとおりです。

import matplotlib.pyplot as plt
import numpy

a1_label = 'record a1'
a2_label = 'record a2'

a1 = numpy.linspace(0,100,40)
a2 = numpy.linspace(30,100,40)

x = numpy.arange(0, len(a1), 1)

plt.fill_between(x, 0, a1, facecolor='green')
plt.fill_between(x, a1, a2, facecolor='red')
plt.title('some title')
plt.grid('on')
plt.legend([a1_label, a2_label])
plt.show()

生成された画像は次のとおりです (凡例には、ラベルではなく空のボックスが表示されていることに注意してください)。 上部の空の凡例ボックス

ヘルプ!

4

4 に答える 4

40

このfill_between()コマンドは、コマンドでサポートされていない PolyCollection を作成しますlegend()

したがって、別の matplotlib アーティスト ( と互換性がlegend()ある) をプロキシとして使用し、それを軸に追加せずに (したがって、プロキシ アーティストはメインの軸に描画されません)、凡例関数にフィードする必要があります。(詳細については、matplotlib 凡例ガイドを参照してください)

あなたの場合、以下のコードはあなたの問題を解決するはずです:

from matplotlib.patches import Rectangle

p1 = Rectangle((0, 0), 1, 1, fc="green")
p2 = Rectangle((0, 0), 1, 1, fc="red")
legend([p1, p2], [a1_label, a2_label])

画像

于 2013-01-26T07:23:00.343 に答える
19

gcalmettes の回答は参考になりましたが、スタックプロットが自動的に割り当てた色を凡例に反映させたいと思いました。これが私がそれをした方法です:

polys = pyplot.stackplot(x, y)
legendProxies = []
for poly in polys:
    legendProxies.append(pyplot.Rectangle((0, 0), 1, 1, fc=poly.get_facecolor()[0]))
于 2013-08-26T17:33:38.583 に答える
18

おそらくより簡単なもう 1 つの手法は、空のデータ セットをプロットし、その凡例エントリを使用することです。

plt.plot([], [], color='green', linewidth=10)
plt.plot([], [], color='red', linewidth=10)

これは、凡例に他のデータ ラベルがある場合にもうまく機能します。

ここに画像の説明を入力

于 2014-06-13T02:26:57.337 に答える
4

私が探しているので、この問題についての最新情報を提供するだけです。2016 年の時点で、PolyCollection はすでに label 属性をサポートしています。

https://github.com/matplotlib/matplotlib/pull/3303#event-182205203

于 2016-02-03T13:42:43.737 に答える