... | ... | @@ -18,7 +18,9 @@ Exemple [d'événements ](https://matplotlib.org/stable/users/event_handling.htm |
|
|
|
|
|
## Avec un "MouseEvent"
|
|
|
|
|
|
```plaintext
|
|
|
### pour commencer, le "clic" écrit juste les coordonnées dans la console
|
|
|
|
|
|
```python
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
def onclick(event):
|
... | ... | @@ -35,9 +37,11 @@ Prenons un code \[proposé pour expliquer le principe\]([https://stackoverflow.c |
|
|
* sur la figure, on connecte l'événement "button_press_event" avec la fonction onclick : concrètement, si on clique quelque part dans la figure, on déclenche la fonction en lui passant comme argument l'événement
|
|
|
* les attributs **xdata** et **ydata** de l'événement sont les coordonnées de la souris dans l'unité de la courbe, si la souris est sur un "Axes" ; l'axe sera alors retrouvé avec l'attributs **inaxes**. A ne pas confondre avec **x** et **y** qui sont les coordonnées en pixels.
|
|
|
* dans la fonction onclick, on se contente d'écrire les valeurs dans la console.
|
|
|
| ![Figure_10points_alignes](uploads/92107c1130854bb0ddea14c603a7fed8/Figure_10points_alignes.png) | ![Figure_on_ajoute_des_points](uploads/f7559a93cb64796ce97dca1714d8c0f3/Figure_on_ajoute_des_points.png) |
|
|
|
|--------------------------------------------------------------------------------------------------|--|
|
|
|
| courbe **donnees** initiale, 10 points alignés | courbes avec points ajoutés à la souris |
|
|
|
|
|
|
### le "clic" ajoute un point
|
|
|
| Figure initiale | Figure après plusieurs clics |
|
|
|
|-----------------|------------------------------|
|
|
|
| ![Figure initiale, 10points alignés](uploads/92107c1130854bb0ddea14c603a7fed8/Figure_10points_alignes.png) _ax.plot(range(10)), 10points alignés_ | ![Figure avec points supplémentaires](uploads/f7559a93cb64796ce97dca1714d8c0f3/Figure_on_ajoute_des_points.png) _Figure avec points supplémentaires définis à la souris_ |
|
|
|
|
|
|
On commence par une figure ne comportant qu'une seule courbe.
|
|
|
|
... | ... | @@ -51,18 +55,37 @@ import numpy as np |
|
|
|
|
|
fig = None
|
|
|
|
|
|
def onclick(event):
|
|
|
def onclick_ajouter(event):
|
|
|
donnees.set_xdata(np.append(donnees.get_xdata(), event.xdata))
|
|
|
donnees.set_ydata(np.append(donnees.get_ydata(),event.ydata))
|
|
|
fig.canvas.draw_idle()
|
|
|
|
|
|
fig,ax = plt.subplots()
|
|
|
donnees, = ax.plot(range(10), marker='o')
|
|
|
fig.canvas.mpl_connect('button_press_event', onclick)
|
|
|
fig.canvas.mpl_connect('button_press_event', onclick_ajouter)
|
|
|
plt.show()
|
|
|
```
|
|
|
|
|
|
### le "clic" sélectionne le point le plus proche
|
|
|
|
|
|
Cette fois, on va calculer la distance du point à chacun des points de la courbe, et on va retenir l'indice de la distance minimale, qui nous servira à aller chercher les bonnes coordonnées dans x et y. Il restera à déplacer la courbe "sélection"; réduite à un point, aux coordonnées de ce point.
|
|
|
|
|
|
```python
|
|
|
def onclick_proche(event):
|
|
|
x_souris, y_souris = event.xdata, event.ydata
|
|
|
distances = [((x-x_souris)**2 + (y-y_souris)**2)**(1/2) for x,y in zip(donnees.get_xdata(), donnees.get_ydata())]
|
|
|
distance_min = min(distances)
|
|
|
idx_min = np.argmin(distances)
|
|
|
selection.set_data([donnees.get_xdata()[idx_min]], [donnees.get_ydata()[idx_min]])
|
|
|
fig.canvas.draw_idle()
|
|
|
|
|
|
fig,ax = plt.subplots()
|
|
|
donnees, = ax.plot(range(10), marker='o')
|
|
|
selection, = ax.plot([0],[0], marker='*', c='red')
|
|
|
|
|
|
fig.canvas.mpl_connect('button_press_event', onclick_proche)
|
|
|
plt.show()
|
|
|
```
|
|
|
|
|
|
## Avec un "PickEvent" :
|
|
|
|
... | ... | @@ -179,4 +202,6 @@ def submit_radius(val): |
|
|
|
|
|
nuage, = ax.plot(x, y, '*', c='blue', label="nuage", picker=init_radius, ls='None')
|
|
|
textbox_radius.on_submit(submit_radius)
|
|
|
``` |
|
|
\ No newline at end of file |
|
|
```
|
|
|
|
|
|
![Figure_selection_point_proche](uploads/d108c419b577d18f8c8296a4c6c7f6a7/Figure_selection_point_proche.png) |
|
|
\ No newline at end of file |