自动缩放matplotlib Axes为传奇腾出空间

时间:2012-05-10 00:03:51

标签: python matplotlib

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

# ... 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报告窗口像素(我认为),甚至仅在绘制画布后,所以我不确定如何以类似于上面的方式获得图例“宽度”。

1 个答案:

答案 0 :(得分: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")