2012-08-16 14 views
7

Vorrei tracciare un cerchio su un grafico generato da pyplot con scalatura automatica. Quando eseguocerchio tracciato su assi non uguali con pyplot

ax.get_aspect() 

sperando in un valore con cui ho potuto manipolare le assi di un ellisse, pyplot rendimenti:

auto 

che è meno utile. Quali metodi suggeriresti per tracciare un cerchio su un grafico pyplot con assi non uguali?

+0

L'ovvia n00b-lution consiste nel tracciare ellissi e modificarle manualmente per assomigliare a cerchi. Là * deve * essere un modo più pitonico ... – benkay

+0

Ha bisogno di essere in coordinate di dati? – pelson

+0

Non sono abbastanza esperto per capire davvero la tua domanda. Non ci sono * requisiti * per una soluzione a questo, quindi suppongo che un luogo di punti che sembra equidistante da un punto dato sulla trama (per ottenere una sorta di matematica-y) sarebbe del tutto sufficiente. – benkay

risposta

3

Dipende davvero ciò che si desidera.

Il problema con la definizione di un cerchio nelle coordinate dei dati quando le proporzioni sono auto, è che si sarà in grado di ridimensionare la figura (o la sua finestra) e le scale di dati si allungheranno bene. Sfortunatamente, ciò significherebbe anche che la tua cerchia non è più un cerchio, ma un'ellisse.

Ci sono diversi modi per risolvere questo problema. In primo luogo, e la maggior parte semplicemente, si potrebbe risolvere il tuo rapporto di aspetto e poi mettere un cerchio sul terreno nei dati coordinate:

import matplotlib.pyplot as plt 
import numpy as np 


fig = plt.figure() 
ax = plt.axes() 

ax.set_aspect(1) 
theta = np.linspace(-np.pi, np.pi, 200) 
plt.plot(np.sin(theta), np.cos(theta)) 

plt.show() 

data coords circle

Con questo, si sarà in grado di zoom e pan intorno come per solito, ma la forma sarà sempre un cerchio.

Se si vuole solo mettere un cerchio su una figura, indipendente dalle coordinate di dati, in modo tale che panning e zoom di un asse non ha effetto sulla posizione e lo zoom sul cerchio, allora si potrebbe fare qualcosa di simile:

import matplotlib.patches as mpatches 
import matplotlib.pyplot as plt 
import numpy as np 


fig = plt.figure() 
ax = plt.axes() 
patch = mpatches.Circle((325, 245), 180, alpha=0.5, transform=None) 
fig.artists.append(patch) 


plt.show() 

device coordinates circle

Questo è mpl abbastanza avanzato, ma anche così, penso che sia abbastanza leggibile.

HTH,

+0

Voglio il cerchio disegnato intorno a un punto in una serie di dati che viene selezionato automaticamente. Questo è come, caso 3, dove voglio che la scala dell'asse fluttua e voglio che il cerchio appaia sempre come un cerchio, ma anche lo zoom e il pan influenzano il cerchio. Ad un certo punto del giorno successivo cercherò di hackerare il codice mpl sopra nella mia applicazione, quindi mentre non riesco a verificare che la risposta abbia risolto il mio problema al momento, il controllo è nella posta (per fare uno scherzo davvero terribile sull'interfaccia Stack Overflow). – benkay

9

Questa domanda è più di un anno, ma ho anche appena avuto questa domanda. Avevo bisogno di aggiungere cerchi a una trama matplotlib e volevo essere in grado di specificare la posizione del cerchio nella trama usando le coordinate di dati, e non volevo che il raggio del cerchio cambiasse con il panning/zoom (o peggio il cerchio si trasformasse in un ellisse).

La soluzione migliore e più semplice che ho trovato è semplicemente tracciare una curva con un unico punto e includere un marcatore cerchio:

ax.plot(center_x,center_y,'bo',fillstyle='none',markersize=5) 

che dà una bella, di dimensioni fisse cerchio blu senza riempimento !

0

Sulla @ user3208430, se si desidera che il cerchio di apparire sempre nello stesso posto negli assi (indipendentemente intervalli di dati), è possibile posizionarlo utilizzando assi coordinate tramite trasformare:

ax.plot(.94, .94, 'ro', fillstyle='full', markersize=5, transform=ax.transAxes) 

Dove xey sono compresi tra [0 e 1]. Questo esempio posiziona il marcatore nell'angolo in alto a destra degli assi.

Problemi correlati