Skip to content
GitLab
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 recommandons d'y créer tous vos nouveaux projets.

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

Atelier_clics · Changes

Page history
Update Atelier_clics authored Sep 20, 2021 by Poulard Christine's avatar Poulard Christine
Hide whitespace changes
Inline Side-by-side
Atelier_clics.md
View page @ aea2e056
......@@ -76,27 +76,35 @@ plt.show()
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. Attention, il s'agit ici de la distance "en unités de la courbe", on verra dans l'exemple du picker qu'il vaut mieux travailler en distances "écran", en pixels, pour que le point sélectionné corresponde à l'impression visuelle. Il restera à déplacer la courbe "selection",réduite à un point matérialisé par une grande étoile rouge, aux coordonnées de ce point.
```python
def onclick_proche(event):
def onclick_plus_proche(event):
x_souris, y_souris = event.xdata, event.ydata
# deux syntaxes équivalentes, une avec get_data() l'autre avec get_xdata() et get_ydata()
# line2D.get_xdata() et get_ydata() permettent de récupérer les vecteurs des x et y respectivement d'un objet line2D
# 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())]
distance_min = min(distances)
idx_min = np.argmin(distances)
# on va affecter à la courbe nommée selection les coordonnées du point le plus proche
selection.set_data([donnees.get_xdata()[idx_min]], [donnees.get_ydata()[idx_min]])
fig.canvas.draw_idle()
fig,ax = plt.subplots()
# Corps du programme
fig, ax = plt.subplots()
ax.set_title("détermination du point de la courbe le plus proche")
donnees, = ax.plot(range(10), marker='o')
selection, = ax.plot([0],[0], marker='*', c='red', markersize=20)
fig.canvas.mpl_connect('button_press_event', onclick_proche)
# la méthode plot renvoie une liste d'objets line2D ;
# on récupère le premier pour le nommer avec la syntaxe d'unpacking des tuples : premier_terme, = tuple
donnees, = ax.plot(range(10), marker='o') # y= les entiers de 0 à 9 ; en l'absence de x , le rang sera utilisé
selection, = ax.plot([0], [0], marker='*', c='red', markersize=20) # un seul point, placé en (0,0)
fig.canvas.mpl_connect('button_press_event', onclick_plus_proche)
plt.show()
```
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 code "fait le travail", vous pouvez aussi essayer avec d'autres jeux de données. Avec des graphiques non orthonormés, le point sélectionné ne sera pas forcément le point le plus proche "visuellement" : selon l'objectif du code, il faudra choisir de raisonner en unités "des données" ou "écran", ce qu'on fera dans la suite.
| code ci-dessus | code ci-dessous, avec plusieurs courbes |
|----------------|-----------------------------------------|
......@@ -120,7 +128,8 @@ import matplotlib.pyplot as plt
import numpy as np
fig = None
adnotacja_ecran = None
# "Annotation" étant un nom de classe de mpl, on utilise ici par précaution un nom de variable différent ; ici la précaution est inutile car on a précisé _ecran
adnotacja_ecran = None
adnotacja_ecran_2 = None
une_croix = None
carre_jaune=None
......@@ -136,13 +145,13 @@ def onclick_proche_2courbes(event):
"""
if ratio_w_sur_h is None:
# on raisonne en "distances en unité des données"
# on raisonne en "distances en unité des données" (et donc on ne devrait pas appeler la variable "distances_ecran"...)
distances_ecran = [((x - x_souris) ** 2 + (y - y_souris)**2) ** (1 / 2) for (x, y) in zip(courbe.get_xdata(), courbe.get_ydata())]
else:
# on raisonne en "unités écran", donc on norme par w/h unité données et on dénorme par le ratio w/h de la vignette
distances_ecran = [((ratio_w_sur_h *(x - x_souris) / delta_x ) ** 2 +
((y - y_souris) / delta_y)**2) ** (1 / 2) for (x, y) in zip(courbe.get_xdata(), courbe.get_ydata())]
# print("liste des distances écran", distances_ecran)
# print("liste des distances (écran)", distances_ecran)
idx_ecran = np.argmin(distances_ecran)
xpt, ypt = courbe.get_xdata()[idx_ecran], courbe.get_ydata()[idx_ecran] # tuple
distance_min = min(distances_ecran)
......
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