2012-08-16 22 views
7

Me gustaría trazar un círculo en un gráfico generado por pyplot a escala automática. Cuando corrodiagrama de círculo en ejes desiguales con pyplot

ax.get_aspect() 

la esperanza de un valor con el que podía manipular los ejes de una elipse, pyplot devuelve:

auto 

que es menos útil. ¿Qué métodos sugerirías para trazar un círculo en una trama pyplot con ejes desiguales?

+0

El n00b-lution obvio es trazar puntos suspensivos y ajustarlos manualmente para que se asemejen a los círculos. Hay * debe * ser una manera más pythonic ... – benkay

+0

¿Necesita estar en las coordenadas de datos? – pelson

+0

No soy lo suficientemente versado como para entender realmente tu pregunta. No hay * requisitos * para una solución a esto, así que supongo que un locus de puntos que se ve equidistante de un punto dado en la trama (para obtener una especie de matemática) sería totalmente suficiente. – benkay

Respuesta

3

Realmente no depende de lo que desee.

El problema de definir un círculo en las coordenadas de datos cuando la relación de aspecto es automática, es que podrá cambiar el tamaño de la figura (o su ventana), y las escalas de datos se estirarán bien. Desafortunadamente, esto también significa que tu círculo ya no es un círculo, sino una elipse.

Existen varias formas de solucionar esto. En primer lugar, y lo más simplemente, se podría arreglar su relación de aspecto y luego poner un círculo en la trama de datos de coordenadas:

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 esto, usted será capaz de hacer zoom y desplazarse por según de costumbre, pero la forma siempre será un círculo.

Si lo que desea es poner un círculo en una figura, independiente de las coordenadas de datos, de tal manera que encuadre y zoom de una ejes no afectó la posición y el zoom en el círculo, entonces se podría hacer algo como:

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

Ésta es MPL bastante avanzada, pero aún así, creo que es bastante fácil de leer.

HTH,

+0

Quiero que el círculo se dibuje alrededor de un punto en una serie de datos que se selecciona automáticamente. Es como, caso 3, donde quiero que la escala del eje flote y quiero que el círculo siempre aparezca como un círculo, pero el zoom y la panorámica también afectan al círculo. En algún momento del día siguiente, intentaré hackear el código mpl anterior en mi aplicación, por lo tanto, aunque no puedo verificar que su respuesta resolvió mi problema en este momento, el cheque está en el correo (a hacer una broma realmente horrible sobre la interfaz Stack Overflow). – benkay

9

Esta pregunta es más de un año de edad, pero yo también sólo tenía esta pregunta. Necesitaba agregar círculos a un gráfico matplotlib y quería poder especificar la ubicación del círculo en el diagrama usando las coordenadas de datos, y no quería que el radio del círculo cambiara con panorámica/zoom (o peor el círculo convirtiéndose en una elipse).

El mejor y más sencilla solución que he encontrado es simplemente trazar una curva con un solo punto e incluir un marcador círculo:

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

que da un agradable, de tamaño fijo círculo azul sin relleno !

0

Sobre la base @ user3208430, si desea que el círculo para aparecer siempre en el mismo lugar en los ejes (sin tener en cuenta los rangos de datos), se puede colocar utilizando ejes coordenadas a través de transformar:

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

Donde xey están entre [0 y 1]. Este ejemplo coloca el marcador en la esquina superior derecha de los ejes.

Cuestiones relacionadas