web-dev-qa-db-fra.com

Plot Ellipse avec matplotlib.pyplot (Python)

Désolé si c'est une question stupide, mais existe-t-il un moyen facile de tracer une ellipse avec matplotlib.pyplot en Python? J'espérais qu'il y aurait quelque chose de similaire à matplotlib.pyplot.arrow, mais je ne trouve rien.

Est-ce la seule façon de le faire en utilisant matplotlib.patches avec draw_artist ou quelque chose de similaire? J'espère qu'il existe une méthode plus simple, mais la documentation n'offre pas beaucoup d'aide.

Merci pour tout conseil!

15
hjweide
7
Chris

La démonstration de l'ellipse de matplotlib est Nice. Mais je ne pouvais pas l'implémenter dans mon code sans une boucle for. J'obtenais une erreur de figure d'axe. Voici ce que j'ai fait à la place, où bien sûr le centre xy sont mes propres coordonnées avec la largeur et la hauteur respectives en fonction de l'image sur laquelle j'ai tracé l'ellipse.

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)

Ce code est basé en partie sur la toute première boîte de code sur cette page . Voir la réponse de Chris ci-dessus pour un lien vers matplotlib.patches.Ellipse.

16
max29

Si vous ne souhaitez pas utiliser de patch, vous pouvez utiliser l'équation paramétrique d'une ellipse:

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

Qui donne : x-oriented ellipse with parametric equation

L'ellipse peut être tournée grâce à une matrice de rotation 2D:

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

Retour : rotated ellipse with parametric equation

8
jeannej