5

凡例のサイズをピクセル単位で知る必要があります。どの関数からでも高さ = 1 しか取得できないようです...次のことを試しました

これは 1 を返します。

height = legend.get_frame().get_bbox_to_anchor().height

これは [0,0],[1.,1.] を返します

box = legend.get_window_extent().get_points()

これも [0,0],[1.,1.] を返します。

box = legend.get_frame().get_bbox().get_points()

凡例のサイズが変わっても、これらはすべて 1 を返します! どうしたの?

4

1 に答える 1

5

これは、まだキャンバスを描画していないためです。

キャンバスが描画されるまで、ピクセル値は単に matplotlib に存在しません (または、存在し、画面やその他の出力とは関係ありません)。

理由はいくつかありますが、今回は割愛します。matplotlib は可能な限り一般的なものにとどまろうとしており、通常、描画されるまでピクセル値の操作を避けていると言えば十分です。

簡単な例として:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10), label='Test')
legend = ax.legend(loc='upper left')

print 'Height of legend before canvas is drawn:'
print legend.get_window_extent().height

fig.canvas.draw()

print 'Height of legend after canvas is drawn:'
print legend.get_window_extent().height

ただし、これは、凡例が画面に描画されるときに、凡例の高さをピクセル単位で表すだけです! Figure を保存すると、画面に描画されるのとは異なる dpi (既定では 100) で保存されるため、ピクセル単位のサイズは異なります。

これには 2 つの方法があります。

  1. 手っ取り早い: ピクセル値を出力する前に Figure のキャンバスを描画し、保存時に必ず Figure の dpi を明示的に指定してください (例: fig.savefig('temp.png', dpi=fig.dpi).

  2. 推奨されますが、少し複雑です: コールバックを描画イベントに接続し、Figure が描画されるときにのみピクセル値を操作します。これにより、一度図形を描画するだけでピクセル値を操作できます。

後者の方法の簡単な例として:

import matplotlib.pyplot as plt

def on_draw(event):
    fig = event.canvas.figure
    ax = fig.axes[0] # I'm assuming only one subplot here!!
    legend = ax.legend_ 
    print legend.get_window_extent().height

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10), label='Test')
legend = ax.legend(loc='upper left')

fig.canvas.mpl_connect('draw_event', on_draw)

fig.savefig('temp.png')

1 番目と 2 番目の例では、凡例の高さとして出力されるものが異なることに注意してください。(私のシステムでは、2番目の31.0と最初の24.8ですが、これは.matplotlibrcファイルのデフォルトに依存します)

この違いはfig.dpi、Figure を保存するときのデフォルト (デフォルトで 80 dpi) とデフォルトの解像度 (デフォルトで 100 dpi) の間の dpi の違いによるものです。

とにかく、それがある程度の意味をなすことを願っています。

于 2011-02-16T16:21:40.127 に答える