Skip to content
GitLab
    • Explore Projects Groups Topics Snippets
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Register
  • Sign in
  • PYTHON - Atelier MatPlotLib PYTHON - Atelier MatPlotLib
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar

La forge institutionnelle d'INRAE étant en production depuis le 10 juin 2025, nous vous invitons à y créer vos nouveaux projets.

  • Poulard Christine
  • PYTHON - Atelier MatPlotLibPYTHON - Atelier MatPlotLib
  • Wiki
  • Atelier_clics

Atelier_clics · Changes

Page history
Update Atelier_clics authored 3 years ago by Poulard Christine's avatar Poulard Christine
Show whitespace changes
Inline Side-by-side
Showing
with 10 additions and 13 deletions
+10 -13
Atelier_clics.md
View page @ f615cfea
...@@ -79,10 +79,8 @@ Cette fois, on va calculer la distance du point à chacun des points de la courb ...@@ -79,10 +79,8 @@ Cette fois, on va calculer la distance du point à chacun des points de la courb
def onclick_proche(event): def onclick_proche(event):
x_souris, y_souris = event.xdata, event.ydata x_souris, y_souris = event.xdata, event.ydata
# deux syntaxes équivalentes, une avec get_data() l'autre avec get_xdata() et 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) # zip permet de boucler sur deux listes en même temps 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())] 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)
...@@ -98,15 +96,15 @@ fig.canvas.mpl_connect('button_press_event', onclick_proche) ...@@ -98,15 +96,15 @@ fig.canvas.mpl_connect('button_press_event', onclick_proche)
plt.show() plt.show()
``` ```
Le code "fait le travail", vous pouvez tester et essayer avec d'autres jeux de données. Vous pourrez trouvez des données pour lesquels le calcul des distances proposé ici n'est pas satisfaisant car il n'identifie pas le point le plus proche "visuellement". Le code "fait le travail", vous pouvez tester et essayer avec d'autres jeux de données.
Vous pourrez trouver des données pour lesquelles le calcul des distances proposé ici n'est pas satisfaisant car il n'identifie pas le point le plus proche "visuellement" : il est donc préférable de raisonner en unités "écran", ce qu'on fera dans la suite.
### Le tableau ci-dessous montre le résultat de l'identification du point le plus proche à partir des coordonnées de la souris ou de Picker, pour ce deuxième cas en montrant la différence de calculs distance "unités courbes" et distances "écran"
```plaintext | code ci-dessus | code ci-dessous, avec plusieurs courbes|
| code ci-dessus, basé sur MouseEvent | code basé sur Picker (voir ci-dessous)|
|-----------------|------------------------------| |-----------------|------------------------------|
| ![Figure initiale, 10points alignés](uploads/467300d845b9a2e75b1b8ecca19328d8/selection_point_mouseclick.png) | ![selection_picker2](uploads/36f24ebb707baac8a9af0c29c562d76c/selection_picker2.png) | | ![Figure initiale, 10points alignés](uploads/467300d845b9a2e75b1b8ecca19328d8/selection_point_mouseclick.png) | ![selection_point_mouseclick_2courbes](uploads/5e59b3773c9d83f464047deb72e4d5ff/selection_point_mouseclick_2courbes.png) |
|<i> une étoile rouge matérialise le point identifié comme le plus proche du clic de souris </i>|<i>résultats en distance "unités courbes" et distances "écran", avec affichage dans des annotations</i>| |<i> une étoile rouge matérialise le point identifié comme le plus proche du clic de souris </i>|<i>résultats en distance "unités écran", pour 2 courbes</i>|
### Avec une figure comportant 2 courbes ou plus. ### Avec une figure comportant 2 courbes ou plus.
...@@ -135,8 +133,7 @@ def onclick_proche_2courbes(event): ...@@ -135,8 +133,7 @@ def onclick_proche_2courbes(event):
def operations_sur_une_courbe(courbe, annotation, carre, ratio_w_sur_h = None): def operations_sur_une_courbe(courbe, annotation, carre, ratio_w_sur_h = None):
""" """
# si on ne passe pas comme argument ratio_w_sur_h, sa valeur par défaut sera None : on raisonne en "distance données" # si on ne passe pas comme argument ratio_w_sur_h, sa valeur par défaut sera None : on raisonne en "distance données"
# pour ça il faut aussi REASSIGNER LOCALEMENT DANS CETTE SOUS-FONCTION 1 à ratio_w_sur_h, delta_x et delta_y # sinon, on passe le ratio largeur/hauteur de la vignette et on raisonne en "distance écran"
# sinon, on passe le ratio largeur/hauteur de la vignette et on raisonne bien en "distance écran"
""" """
if ratio_w_sur_h is None: if ratio_w_sur_h is None:
...@@ -230,7 +227,8 @@ plt.show() ...@@ -230,7 +227,8 @@ plt.show()
## Avec un "PickEvent" : ## Avec un "PickEvent" :
La méthode précédente fonctionne, mais elle a l'inconvénient de faire des calculs sur l'ensemble des points de la courbe. On va utiliser la notion de _picker_, toujours sur une figure ne comportant qu'une seule courbe, afin de réaliser une **présélection**. Si on a plusieurs courbes, on peut ne lier le picker qu'à certaines d'entre elles. Si plusieurs sont réceptives au picker, la fonction liée sera déclenchée une fois pour chacune. La méthode précédente fonctionne, mais elle a l'inconvénient de faire des calculs sur l'ensemble des points de la courbe. On va utiliser la notion de _picker_, toujours sur une figure ne comportant qu'une seule courbe, afin de réaliser une **présélection**.
Si on a plusieurs courbes, on peut ne lier le picker qu'à certaines d'entre elles. Si plusieurs sont réceptives au picker, la fonction liée sera déclenchée une fois pour chacune.
![sélection picker](uploads/510c61180d0c1d51a059871fed23ab1c/selection_picker.png) ![sélection picker](uploads/510c61180d0c1d51a059871fed23ab1c/selection_picker.png)
...@@ -343,4 +341,3 @@ nuage, = ax.plot(x, y, '*', c='blue', label="nuage", picker=init_radius, ls='Non ...@@ -343,4 +341,3 @@ nuage, = ax.plot(x, y, '*', c='blue', label="nuage", picker=init_radius, ls='Non
textbox_radius.on_submit(submit_radius) textbox_radius.on_submit(submit_radius)
``` ```
![selection_point_mouseclick_2courbes](uploads/5e59b3773c9d83f464047deb72e4d5ff/selection_point_mouseclick_2courbes.png)
\ No newline at end of file
Clone repository
  • AtelierB1_Graphiques_simples
  • AtelierB2_Lire_un_fichier
  • AtelierC
  • Atelier_D_carte
  • Atelier_D_carte_a_partir_de_fichiers_binaires
  • Atelier_E_longues_series
  • Atelier_G_widgets
  • Atelier_clic_afficher
  • Atelier_clics
  • Cartes focus sur le redimensionnement
  • GUI avec QT
  • La doc avec Sphinx
  • Lexique
  • Point Théorie Subplots
  • Pour les contributeurs
View All Pages

Menu

Explore Projects Groups Topics Snippets