2012-05-10 3 views
1

Я рисую двумерный вид космической орбиты с использованием matplotlib. На этой орбите я идентифицирую и отмечаю определенные события, а затем перечисляю эти события и соответствующие даты в легенде. Прежде чем сохранять фигуру в файл, я автоматически нахожусь на моем участке орбиты, что приводит к тому, что легенда будет напечатана непосредственно поверх моего сюжета. То, что я хотел бы сделать, после автомасштабирования, как-то узнать ширину моей легенды, а затем расширить мой xaxis, чтобы «освободить место» для легенды в правой части сюжета. Концептуально, что-то вроде этого;Autoscale a matplotlib Оси, чтобы освободить место для легенды

# ... 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 отчетов в окне пикселей (я думаю), и даже, что только после того, как холст был нарисован, так что я не знаю, как я могу получить легенду «ширина» таким образом, чтобы я мог использовать аналогичное выше.

ответ

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") 
Смежные вопросы