2013-07-23 15 views
6

Come posso ottenere le coordinate della casella visualizzate nel grafico seguente?Coordinate della casella di annotazioni in 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')) 

ho cercato di ispezionare le proprietà di questo oggetto, ma non riuscivo a trovare qualcosa di adatto a questo scopo. C'è una proprietà chiamata get_bbox_patch() che potrebbe essere sulla strada giusta, però, ottenere risultati in un sistema di coordinate diverso (o associato a una proprietà diversa)

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

Grazie mille!

+0

vi consiglio di leggere questo: http://matplotlib.org/users/transforms_tutorial.html Quali unità vuoi le coordinate in? – tacaswell

+0

Già fatto. Non ho aiutato molto perché mostra come trasformare le coordinate in diversi sistemi di riferimento, ma non in larghezza o altezza. Penso di volere "coordinate dati". –

+0

Sospetto che la larghezza sia nelle coordinate di visualizzazione, le larghezze sono solo la differenza tra due punti, quindi se puoi fare le coordinate, puoi fare larghezze. La scatola è centrata dove la metti, hai solo bisogno di afferrare la trasformazione che vuoi (vengono imballati con i loro inversi). – tacaswell

risposta

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

restituirà un oggetto Bbox per il testo in unità di display (la draw è necessario, in modo che il testo è reso e in realtà ha una dimensione di visualizzazione). È quindi possibile utilizzare le trasformazioni per convertirlo in qualsiasi sistema di coordinate che si desidera. Ex

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

Grazie. Questo sembra essere giusto. Hai notato che le coordinate di output non corrispondono realmente alle coordinate xytext? Sembrano essere proporzionali, però. Ad esempio, xytext = (0.0,1.0) dà [[-0.11196657 0.83225806] [-0.06034526 0.87258065]] –

+0

Torno indietro '[[-0.02608367 1.] [0.02608367 1.03385417]]'. Ricorda che questo è il bounding box, quindi dipenderà dalle impostazioni 'ha' e' va'. – tacaswell

+0

Hai ragione. Tuttavia, ottengo ancora 0,8 nella coordinata y. Puoi aggiungere il codice che hai provato? Forse c'è un argomento in più che deve essere considerato. –

1

alle vostre domande c'è anche una pre-domanda:

  • Quando si scrive How can I get the coordinates of the box displayed in the following plot?, che sistema di coordinate vuoi dire?

Per impostazione predefinita, annotate viene eseguito utilizzando xytext = None, defaults to xy, and if textcoords = None, defaults to xycoords.

Poiché non è stato specificato il sistema di coordinate. La tua annotazione è sul sistema predefinito. È possibile specificare le coordinate di dati, che per alcuni scopi è abbastanza buono:

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')) 

Per trovare il sistema di coordinate, si può fare:

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

e per ottenere le coordinate:

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

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

PS non direttamente correlato, ma l'output è da IPython, se ancora non lo si utilizza, può aumentare il modo in cui si sviluppa in Python e utilizzare matplotlib. Provaci.

+0

Grazie. Come ho detto, le coordinate dei dati vanno bene.Non riesco però a vedere come ottenere le coordinate della scatola in base a xytext. In realtà, l'avevo già fatto mentre testavo diverse proprietà. Sì, uso sempre il blocco note di Ipython. Hai provato qtconsole come un blocco per i graffi? –

Problemi correlati