2014-01-28 2 views
1

Есть ли простой способ получить pyplot для обработки вызовов до text() или annotate(), как если бы они были «данными», так что он автоматически расширил пределы оси, чтобы включить текст в границах графика (т. Е. , а не на полях)?Ограничения оси автонастройки pyplot

# this creates a barplot with a significance bracket 
# but the p-value above the bracket overlaps the plot title 
import matplotlib.pyplot as plt 
p = plt.subplot(1, 1, 1) 
b = plt.bar((0, 1), (2, 3), yerr=(0.1, 0.2)) 
bracket = [[[0.4, 0.4], [2.5, 3.8]], 
      [[0.4, 1.4], [3.8, 3.8]], 
      [[1.4, 1.4], [3.4, 3.8]]] 
for x, y in bracket: 
    p.plot(x, y, 'k') 
txt = p.text(0.9, 4.0, 'p < 0.001', ha='center') 
plt.title('A significant MWE') 

matplotlib barplot with significance bracket

Мой текущий обходной путь заключается в создании текста, вызывая draw(), получение bbox_patch экстентов текста, превращенную эти экстенты координат данных, и вручную изменяя ybound осей объекту что-то большее, чем трансформированной верхней степени. Для меня это кажется довольно крутым, и мне интересно, есть ли более простой способ.

ответ

0

Это мое обходное решение. Неэлегантный, но функциональный. Если у кого-то есть лучший способ, я все равно буду его слушать.

txt.set_bbox(dict(facecolor='w', alpha=0, boxstyle='round, pad=1')) 
plt.draw() 
txtbb = txt.get_bbox_patch().get_window_extent() 
ymax = p.transData.inverted().transform(txtbb).ravel()[-1] 
ybnd = p.get_ybound() 
if ymax > ybnd[-1]: 
    p.set_ybound(ybnd[0], ymax) 
plt.draw() 
plt.show() 

matplotlib barplot with adjusted axis limits

Смежные вопросы