2013-07-23 13 views
6

Jak mogę uzyskać współrzędne pola wyświetlanego na poniższym wykresie?Współrzędne pola adnotacji w matplotlib

enter image description here

fig, ax = subplots() 
x = ax.annotate('text', xy=(0.5, 0), xytext=(0.0,0.7), 
       ha='center', va='bottom', 
       bbox=dict(boxstyle='round', fc='gray', alpha=0.5), 
       arrowprops=dict(arrowstyle='->', color='blue')) 

Próbowałem sprawdzić właściwości tego obiektu, ale nie mógł znaleźć coś nadaje się do tego celu. Istnieje właściwość o nazwie get_bbox_patch() które mogłyby być na dobrej drodze, ale ja uzyskać wyniki w innym układzie współrzędnych (lub związanej z innym posesji)

y = x.get_bbox_patch() 
y.get_width() 
63.265625 

dziękuję!

+0

Proponuję przeczytać: http://matplotlib.org/users/transforms_tutorial.html Co jednostki chcesz współrzędne w? – tacaswell

+0

Już to zrobiłem. Nie pomogłem wiele, ponieważ pokazuje, jak przekształcać współrzędne do różnych układów odniesienia, ale nie do szerokości czy wysokości. Myślę, że chcę "współrzędne danych". –

+0

Podejrzewając, że szerokość jest we współrzędnych wyświetlania, szerokości są tylko różnicą między dwoma punktami, więc jeśli potrafisz robić współrzędne, możesz robić szerokości. Pudełko jest wyśrodkowane w miejscu, w którym je umieścisz, potrzebujesz tylko transformacji, którą chcesz (są one zapakowane z ich odwróceniem). – tacaswell

Odpowiedz

5
ax.figure.canvas.draw() 
bbox = x.get_window_extent() 

zwróci Bbox obiekt do tekstu w jednostkach wyświetlania (the draw konieczne jest więc, że tekst jest renderowany i faktycznie ma rozmiar wyświetlacza). Następnie możesz użyć transformacji, aby przekonwertować go do dowolnego, w którym chcesz skoordynować system. Ex

bbox_data = ax.transData.inverted().transform(bbox) 
+0

Dzięki. Wydaje się, że to prawda. Czy zauważyłeś, że współrzędne wyjściowe nie pasują do współrzędnych xytext? Wydają się jednak proporcjonalne. Na przykład xytext = (0.0,1.0) daje [[-0,11196657 0.83225806] [-0,06034526 0,87258065]] –

+0

Wracam '[[-0.02608367 1.] [0.02608367 1.03385417]]". Pamiętaj, że jest to ramka ograniczająca, więc będzie zależeć od ustawień 'ha' i' va'. – tacaswell

+0

Masz rację. Jednak nadal otrzymuję 0,8 współrzędnej y. Czy możesz dodać kod, który wypróbowałeś? Może jest dodatkowy argument, który należy wziąć pod uwagę. –

1

na pytania jest też wstępnie pytanie:

  • Kiedy piszesz How can I get the coordinates of the box displayed in the following plot?, co masz na myśli układ współrzędnych?

Domyślnie annotate jest wykonywane przy użyciu xytext = None, defaults to xy, and if textcoords = None, defaults to xycoords.

Ponieważ nie określono układu współrzędnych. Twoja adnotacja znajduje się w domyślnym systemie. Można określić współrzędne danych, które dla pewnych celów jest wystarczająco dobry:

x = ax.annotate('text', xy=(0.5, 0), xytext=(0.0,0.7), 
       ha='center', va='bottom', textcoords='data', xycoords="data", 
       bbox=dict(boxstyle='round', fc='gray', alpha=0.5), 
       arrowprops=dict(arrowstyle='->', color='blue')) 

Aby znaleźć układ współrzędnych, można zrobić:

In [39]: x.xycoords 
Out[39]: 'data' 

i uzyskać współrzędne:

In [40]: x.xytext 
Out[40]: (0.0, 0.7) 

In [41]: x.xy 
Out[41]: (0.5, 0) 

PS nie jest bezpośrednio związany, ale wynik jest z IPython, jeśli nadal go nie używasz, możesz zwiększyć jego rozwój w Pythonie i użyć matplotlib. Spróbuj.

+0

Dzięki. Jak już powiedziałem, współrzędne danych są w porządku.Nie widzę jednak, jak uzyskać współrzędne pola na podstawie xytekstu. Właściwie to już zrobiłem to podczas testowania różnych właściwości. Tak, cały czas korzystam z notebooka Ipython. Czy wypróbowałeś qtconsole jako podkładkę do scratch? –

Powiązane problemy