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!
Avez-vous vu la démonstration d'ellipse de matplotlib ? Ici, ils utilisent matplotlib.patches.Ellipse
.
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
.
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()
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()