这是因为你还没有绘制画布。
在 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
然而,这只代表图例在屏幕上绘制时的像素高度!如果保存图形,它将以不同于屏幕上绘制的dpi(默认为100)保存,因此像素大小将不同。
有两种方法解决这个问题:
1. 快速且简单:在输出像素值之前绘制图形画布,并确保在保存时明确指定图形的dpi(例如fig.savefig('temp.png', dpi=fig.dpi))。
2. 推荐,但稍微复杂一些:连接一个回调到绘制事件,并且仅在图形绘制时使用像素值。这样可以在只绘制一次图形的情况下使用像素值。
以下是后一种方法的快速示例:
import matplotlib.pyplot as plt
def on_draw(event):
fig = event.canvas.figure
ax = fig.axes[0]
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')
注意第一个和第二个示例中图例高度打印的不同之处。(在我的系统上,第二个示例为31.0,而第一个示例为24.8,但这将取决于
您的.matplotlibrc文件中的默认值)。这种差异是由于默认
fig.dpi
(默认为80 dpi)和保存图形时的默认分辨率(默认为100 dpi)之间的不同造成的。希望这样讲述有些道理。
type(leg.get_frame())
返回什么?你使用的matplotlib版本是什么? - Paul