1

我正在使用 matplotlib 绘制航天器轨道的 2D 视图。在这个轨道上,我识别并标记某些事件,然后在图例中列出这些事件和相应的日期。在将图形保存到文件之前,我会自动缩放我的轨道图,这会导致图例直接打印在我的图顶部。我想做的是,在自动缩放之后,以某种方式找出我的图例的宽度,然后扩展我的 xaxis 以为图右侧的图例“腾出空间”。从概念上讲,是这样的;

# ... code that generates my plot up here, then:
ax.autoscale_view()
leg = ax.get_legend()
leg_width = # Somehow get the width of legend in units that I can use to modify my axes
xlims = ax.get_xlim()
ax.set_xlim( [xlims[0], xlims[1] + leg_width] )
fig.savefig('myplot.ps',format='ps')

我遇到的主要问题是ax.set_xlim()采用“数据”特定值,而leg.get_window_extent在窗口像素中报告(我认为),甚至只有在画布绘制之后,所以我不确定如何获得图例“宽度”,我可以使用类似于上面的方式。

4

1 回答 1

0

您可以将图形保存一次以获得真正的图例位置,然后使用 transData.inverted() 将屏幕坐标转换为数据坐标。

import pylab as pl
ax = pl.subplot(111)
pl.plot(pl.randn(1000), pl.randn(1000), label="ok")
leg = pl.legend()

pl.savefig("test.png") # save once to get the legend location

x,y,w,h = leg.get_window_extent().bounds

# transform from screen coordinate to screen coordinate
tmp1, tmp2 = ax.transData.inverted().transform([0, w])
print abs(tmp1-tmp2) # this is the with of legend in data coordinate

pl.savefig("test.png")
于 2012-05-10T13:37:41.990 回答