2017-05-02 6 views
3

matplotlibで凡例の場所を取得しようとしています。 Legend.get_window_extent()はこれを提供するはずですが、凡例の場所に関係なく同じ値を返します。次に例を示します。matplotlibで凡例の場所を取得する方法

from matplotlib import pyplot as plt 

def get_legend_pos(loc): 

    plt.figure() 
    plt.plot([0,1],label='Plot') 
    legend=plt.legend(loc=loc) 

    plt.draw() 

    return legend.get_window_extent() 

if __name__=='__main__': 

    # Returns a bbox that goes from (0,0) to (1,1) 
    print get_legend_pos('upper left') 

    # Returns the same bbox, even though legend is in a different location! 
    print get_legend_pos('upper right') 

凡例の場所を取得する正しい方法は何ですか。

+0

は話題にならないかもしれませんが、最高の凡例の場所を探しているかもしれませんが、matplotlibには既にこの機能があります。 'loc = 0'を使って凡例を「最良の」位置に置きます。 –

+0

それは良い点です...私はloc = 0(またはloc = 'best')について知っています...私がしようとしているのは、loc = 0を使った後で凡例がどこに置かれたのか把握することです。それの周りに他のものを置く。 – jhaiduce

答えて

1

あなたはFigureハンドル、fig.canvas.draw()を持っている場合

plt.gcf().canvas.draw() 

か、によってplt.draw()を交換する必要があります。凡例の位置はキャンバスが描かれたとき、前の場所と同じ場所に置かれる前に決定されるため、これが必要です。

plt.draw()を使用すると、凡例の描画に使用中のバックエンドからの有効なレンダラーが必要なため、十分ではありません。

2

TL DR;これを試してみてください:

だから私はJupyterであなたのコードを試してみましたが、私は

%matplotlib inline 
ためしかしオプション

%matplotlib notebook 

で動作を再現できる理由

def get_legend_pos(loc): 
    plt.figure() 
    plt.plot([0,1],label='Plot') 
    legend=plt.legend(loc=loc) 
    plt.draw() 
    plt.pause(0.0001) 
    return legend.get_window_extent() 

ここにはあります

私は正しい応答を得ています

Bbox(x0=60.0, y0=230.6, x1=125.69999999999999, y1=253.2) 
Bbox(x0=317.1, y0=230.6, x1=382.8, y1=253.2) 

凡例の位置は、実行が終了するまで評価されません。ここで私は

fig = plt.figure() 
plt.plot([0,1],label='Plot') 
legend=plt.legend(loc='upper left') 
plt.draw() 
print(legend.get_window_extent()) 

出力Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0)を実行する最初のセルで、それを証明している例があります。あなたはおそらく評価を強制するplt.pause()を追加する必要がある次のセルの最後の式を再評価する

print(legend.get_window_extent()) 

出力Bbox(x0=88.0, y0=396.2, x1=175.725, y1=424.0)

+0

それは私のためにも機能しますが、より直接的なものを好むでしょう。 – jhaiduce

関連する問題