2017-04-06 3 views
0

私はmatplotlibの凡例を新しいものに置き換えたいが、置き換えられる凡例の同じ(おそらく任意の)場所を保持する。matplotlibの凡例を置き換える方法と同じ場所を維持するには?

なぜ次のコードは機能しませんか?私は誤解だ場合を除き

 
import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left') 
bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) 

plt.legend(['b'], bbox_to_anchor=bb) 

答えて

0

が質問に答えるために:
伝説の位置が場合にのみ、実行時に決定されます図形が描画されます。さらに、bbox_to_anchorは設定されていないので、完全軸((0,0,1,1))になります。

何ができることは、最初のウィンドウの大きさをキャンバスに描き、その後、取得された

ax.figure.canvas.draw() 
bb = leg.get_window_extent().inverse_transformed(ax.transAxes) 

しかし、これはあなたに(それだけに近い)正しい位置を与えることはありません。

今、可能な解決策は、凡例を置き換えるためではないかもしれないが、その代わりにのみ、それはコンテンツのアップデート:

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left') 

leg.texts[0].set_text("b") 

plt.show() 

そうでない場合は、更新がオプションでない場合、あなたはからbbox_to_anchorとLOCパラメータが必要になります古い伝説:

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

leg = plt.legend(['a'], loc='lower left', bbox_to_anchor=(0.5,0.5)) 

bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) 
plt.legend(['b'], bbox_to_anchor=bb, loc=leg._loc_real) 

plt.show() 

モードが「展開」に設定されている場合でも、これは失敗する可能性があります。また、新しい凡例の作成に同じfancyboxパラメータを使用する場合にのみ正確です。

+0

内容を更新するだけでいいですね。しかし、フォントサイズ、numpoint、散布ポイント、ラベルスペース、ハンドレックスパッド、境界線パッド、ボーダーパッド、ハンドル長、およびファンシーボックスのすべてのプロパティを更新することはできません。私は、これらのうちのいくつかは作成時に伝説のコマンドでしかアクセスできないと思います。 – mrclary

+0

凡例がどのように/どこに固定されているかを判断する方法はありますか?たとえば、凡例の左下隅が軸の左下隅に固定されています。もしそうなら、私はちょうど 'loc = 'lower left''を設定することができました... – mrclary

+0

私は答えを更新しました。多分、これはあなたが必要とするものに近いです。 – ImportanceOfBeingErnest

0

、単に実行します。問題のコードは動作しませんなぜ

import matplotlib.pyplot as plt 

plt.plot(range(10)) 
ax = plt.gca() 

location = 'lower left' 

while 1: 

    plt.legend(['a'], loc=location) 
    plt.pause(1) 
    plt.legend(['b'], loc=location) 
    plt.pause(1) 
+0

元の凡例の場所がわからないことが明らかになっているはずです。これは、たとえば図がピクルファイルからロードされた場合に発生します。 – mrclary

関連する問題