|
**But de l'atelier** : manipuler les notions d' **événement** et de **fonction associée** pour rendre un graphique interactif.
|
|
**But de l'atelier** : manipuler les notions d' **événement** et de **fonction associée** pour rendre un graphique interactif.
|
|
|
|
|
|
**Autres notions manipulées au passage** : modifier certaines caractéristiques d'une courbe existante avec set_data() ou set_xdata() et set_ydata() ; optionnel : le widget "Textbox".
|
|
**Autres notions manipulées au passage** :
|
|
|
|
- Python : **comprehension list** : création d'une nouvelle liste par une syntaxe plus performante qu'une boucle for classique (exemple de syntaxe : [x*x for x in liste_x] va créer une liste des carrés des éléments de liste_x) ; **zip** pour parcourir deux ou plusieurs conteneurs (liste, array...) simultanément, càd en prenant à l'itération i l'élément i de chaque conteneur, comme une fermeture éclair parcourt les dents situées de part et d'autre de la fermeture.
|
|
|
|
- spécifique mpl : modifier certaines caractéristiques d'une courbe existante avec **set_data()** ou **set_xdata() et set_ydata()** ; optionnel : le widget **"Textbox"**.
|
|
|
|
|
|
**Application** : sélectionner sur une courbe le point le plus proche d'un clic de souris
|
|
**Application** : sélectionner sur une courbe le point le plus proche d'un clic de souris
|
|
|
|
|
... | @@ -76,7 +78,12 @@ Il restera à déplacer la courbe "sélection",réduite à un point, aux coordon |
... | @@ -76,7 +78,12 @@ Il restera à déplacer la courbe "sélection",réduite à un point, aux coordon |
|
```python
|
|
```python
|
|
def onclick_proche(event):
|
|
def onclick_proche(event):
|
|
x_souris, y_souris = event.xdata, event.ydata
|
|
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())]
|
|
# deux syntaxes équivalentes, une avec get_data() l'autre avec get_xdata() et get_ydata()
|
|
|
|
# solution 1 : on boucle sur deux listes en même temps avec zip pour former un tuple (x,y)
|
|
|
|
distances = [((x-x_souris)**2 + (y-y_souris)**2)**(1/2) for (x,y) in zip(donnees.get_xdata(), donnees.get_ydata())]
|
|
|
|
# équivalent plus simple, où on boucle sur une liste de **tuples**
|
|
|
|
# distances = [((x-x_souris)**2 + (y-y_souris)**2)**(1/2) for (x,y) in donnees.get_data()]
|
|
|
|
|
|
distance_min = min(distances)
|
|
distance_min = min(distances)
|
|
idx_min = np.argmin(distances)
|
|
idx_min = np.argmin(distances)
|
|
selection.set_data([donnees.get_xdata()[idx_min]], [donnees.get_ydata()[idx_min]])
|
|
selection.set_data([donnees.get_xdata()[idx_min]], [donnees.get_ydata()[idx_min]])
|
... | | ... | |