2012-06-08 125 views
9

Disculpe si esta es una pregunta estúpida, pero ¿hay alguna manera fácil de trazar una elipse con matplotlib.pyplot en Python? Esperaba que hubiera algo similar a matplotlib.pyplot.arrow, pero no puedo encontrar nada.Trazar Elipse con matplotlib.pyplot (Python)

¿Es la única manera de hacerlo utilizando matplotlib.patches con draw_artist o algo similar? Espero que haya un método más simple, pero la documentación no ofrece mucha ayuda.

¡Gracias por cualquier consejo!

Respuesta

7
+0

Esperaba algo más cercano a los métodos de trazado estándar, pero lo investigaré a continuación. ¡Gracias! – casper

+0

Acabo de notar que estabas buscando algo en matplotlib.pyplot. Lo siento, no me di cuenta de eso para empezar. Una búsqueda en la documentación de la API 'matplotlib.pyplot' no revela nada, así que me temo que tendrá que vivir usando' matplotlib.patches.Ellipse' – Chris

+0

Gracias, parece que eso es lo que tendré que hacer. Hubiera esperado que pyplot incluyera alguna funcionalidad básica de trazado de formas, ¡pero supongo que no se puede tener todo! – casper

10

La demostración de elipse matplotlib es agradable. Pero no pude implementarlo en mi código sin un bucle for. Estaba obteniendo un error de figura de ejes. Aquí es lo que hice en su lugar, donde, por supuesto, el centro xy son mis propias coordenadas con el ancho y la altura respectivos en función de la imagen sobre la que tracé la elipse.

from matplotlib.patches import Ellipse 

plt.figure() 
ax = plt.gca() 

ellipse = Ellipse(xy=(157.18, 68.4705), width=0.036, height=0.012, 
         edgecolor='r', fc='None', lw=2) 
ax.add_patch(ellipse) 

Este código se basa parcialmente en el primer cuadro de código en this page. Vea la respuesta de Chris arriba para un enlace al matplotlib.patches.Ellipse.

0

Si no desea utilizar un parche, puede usar la ecuación paramétrica de una elipse: x = u + a.cos (t); y = v + b.sin (t)

import numpy as np 
from matplotlib import pyplot as plt 
from math import pi 

u=1.  #x-position of the center 
v=0.5 #y-position of the center 
a=2.  #radius on the x-axis 
b=1.5 #radius on the y-axis 

t = np.linspace(0, 2*pi, 100) 
plt.plot(u+a*np.cos(t) , v+b*np.sin(t)) 
plt.grid(color='lightgray',linestyle='--') 
plt.show() 

Qué da: x-oriented ellipse with parametric equation La elipse se puede girar gracias a una matriz 2D-rotación:

import numpy as np 
from matplotlib import pyplot as plt 
from math import pi, cos, sin 

u=1.  #x-position of the center 
v=0.5  #y-position of the center 
a=2.  #radius on the x-axis 
b=1.5  #radius on the y-axis 
t_rot=pi/4 #rotation angle 

t = np.linspace(0, 2*pi, 100) 
Ell = np.array([a*np.cos(t) , b*np.sin(t)]) 
    #u,v removed to keep the same center location 
R_rot = np.array([[cos(t_rot) , -sin(t_rot)],[sin(t_rot) , cos(t_rot)]]) 
    #2-D rotation matrix 

Ell_rot = np.zeros((2,Ell.shape[1])) 
for i in range(Ell.shape[1]): 
    Ell_rot[:,i] = np.dot(R_rot,Ell[:,i]) 

plt.plot(u+Ell[0,:] , v+Ell[1,:])  #initial ellipse 
plt.plot(u+Ell_rot[0,:] , v+Ell_rot[1,:],'darkorange') #rotated ellipse 
plt.grid(color='lightgray',linestyle='--') 
plt.show() 

Devuelve: rotated ellipse with parametric equation

Cuestiones relacionadas