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_G_widgets

Atelier_G_widgets · Changes

Page history
Update Atelier_G_widgets authored Dec 01, 2021 by Poulard Christine's avatar Poulard Christine
Show whitespace changes
Inline Side-by-side
Atelier_G_widgets.md
View page @ 10cd220f
...@@ -22,7 +22,7 @@ Dans cet exemple, on définit une figure avec deux vignettes : **ax** va accueil ...@@ -22,7 +22,7 @@ Dans cet exemple, on définit une figure avec deux vignettes : **ax** va accueil
### le graphique : trois courbes donc une sera modifiable ### le graphique : trois courbes donc une sera modifiable
On définit deux courbes fixes avec **plot**, une sinusoïde et un point isolé placé sur cette sinusoïde (cette 2e courbe est tout à fait optionnelle). Il ne serait pas nécessaire de les nommer, puisqu'on n'intervient plus dessus. On va définir une 3e courbe, avec scatter, que l'on souhaite modifier au fil du temps. On a nommé cette courbe scat. On définit une courbe fixe avec **plot**, une sinusoïde. Il ne serait pas nécessaire de la nommer, puisqu'on n'intervient plus dessus. On va définir une 3e courbe, avec scatter, que l'on souhaite modifier au fil du temps. On a nommé cette courbe scat.
### définition de la textbox ### définition de la textbox
...@@ -31,13 +31,66 @@ On place une textbox dans la vignette ax_tbox. On n'a pas besoin de la nommer ca ...@@ -31,13 +31,66 @@ On place une textbox dans la vignette ax_tbox. On n'a pas besoin de la nommer ca
### définition de la fonction associée à un événement ("callback") ### définition de la fonction associée à un événement ("callback")
| la souris ne survole pas la textbox | la souris survole la textbox | | la souris ne survole pas la textbox | la souris survole la textbox |
|-------------------------------------|------------------------------| |-------------------------------------|------------------------------|
| ![Sinus_modifiable](uploads/aa1f7671490ea6eecddd2a91bda8b21c/Sinus_modifiable.JPG) | cell | | ![Sinus_modifiable](uploads/aa1f7671490ea6eecddd2a91bda8b21c/Sinus_modifiable.JPG) | ![sinusoide](uploads/6c86fcf0d9febe8626c3c38b407f5a6b/sinusoide.png) |
L'événement **on_submit**="une valeur a été modifiée dans la textbox" est associé à une fonction, appelée update, qu'il faut à présent définir\*\*. Cette fonction va tout simplement lire la valeur dans la textbox (argument "val" de la fonction ), transformée en entier positif, et tirer au hasard autant de valeurs aléatoires entre un et 6, et placer les points (x, sin(x)) pour tous les points x de cette série. Au lieu de définir une nouvelle courbe à chaque fois, on va modifier scat, grâce à la méthode **set_offsets** qui est analogue à la méthode **set_data** pour plot. On en profite aussi pour modifier une liste d'étiquettes que l'on va placer sur le graphique grâce à la méhtode **annotate**, qu'il est utile de connaître. On verra donc : L'événement **on_submit**="une valeur a été modifiée dans la textbox" est associé à une fonction, appelée update, qu'il faut à présent définir\*\*. Cette fonction va tout simplement lire la valeur dans la textbox (argument "val" de la fonction ), transformée en entier positif, et tirer au hasard autant de valeurs aléatoires entre un et 6, et placer les points (x, sin(x)) pour tous les points x de cette série. Au lieu de définir une nouvelle courbe à chaque fois, on va modifier scat, grâce à la méthode **set_offsets** qui est analogue à la méthode **set_data** pour plot. On en profite aussi pour modifier une liste d'étiquettes que l'on va placer sur le graphique grâce à la méhtode **annotate**, qu'il est utile de connaître. On verra donc :
- les points, représentés par des carrés ; pour montrer comment changer les couleurs dans scatter, on a décidé que le 2e de chaque série, dans l'ordre de tirage, sera rouge et les autres orange ; pour en savoir plus, la [page dédiée à scatter](focus_scatter) est beaucoup plus détaillée ; - les points, représentés par des carrés ; pour montrer comment changer les couleurs dans scatter, on a décidé que le 2e de chaque série, dans l'ordre de tirage, sera rouge et les autres orange ; pour en savoir plus, la [page dédiée à scatter](focus_scatter) est beaucoup plus détaillée ;
- les annotations, qui correspondent à l'abscisse mise en forme grâce à une f-string (valeur précédée de # et avec 2 chiffres après la virgule) - les annotations, qui correspondent à l'abscisse mise en forme grâce à une f-string (valeur précédée de # et avec 2 chiffres après la virgule)
```python
from matplotlib import pyplot as plt
from matplotlib.widgets import TextBox
import numpy as np
x = np.arange(0, 2 * np.pi, 0.01)
nb_points_ini = 3
ann_list = []
def update(val):
# on ne peut pas effacer une liste définie hors de la fonction, mais on peut appliquer une méthode remove ou remplacer ses éléments...
for a in ann_list:
a.remove()
ann_list[:] = []
try:
nombre = abs(int(val))
except ValueError:
nombre = nb_points_ini
text_box.set_val(str(nombre))
# tirage de n, vecteur de taille nombre = abscisses comprises entre 0 et 6 (pour fait un motif de sinusoïde)
n = np.random.rand(nombre) * 6
scat.set_offsets(np.c_[n, np.sin(n)])
liste_couleurs = []
for indice in range(nombre):
if indice == 2:
liste_couleurs.append('red')
else:
liste_couleurs.append('orange')
scat.set_facecolors(liste_couleurs)
scat.set_edgecolors('purple')
for j in range(nombre):
ann = ax.annotate("#{:.2f}".format(n[j]), xy=(n[j], np.sin(n[j])), color="purple", fontsize=12)
ann_list.append(ann)
fig.canvas.draw()
fig, (ax, ax_tbox) = plt.subplots(nrows=2, gridspec_kw={'height_ratios':(5,1)})
fig.suptitle("changez le nombre de points dans la textbox (en bas)")
line, = ax.plot(x, np.sin(x))
scat = ax.scatter([4], [0], s=40, alpha=0.9, c="sienna", marker='s')
text_box = TextBox(ax_tbox, "Nombre de points aléatoires", initial=nb_points_ini, color='lemonchiffon', hovercolor='yellow') # à partir de version 3.5, textalignment="center")
text_box.on_submit(update)
update(nb_points_ini)
plt.show()
```
## Widgets intégrés à des applications ## Widgets intégrés à des applications
On s'appuie pour les explications sur : On s'appuie pour les explications sur :
...@@ -597,4 +650,4 @@ def retracer_parametree(echantillon, a, b): ...@@ -597,4 +650,4 @@ def retracer_parametree(echantillon, a, b):
fig_pp.canvas.draw_idle() fig_pp.canvas.draw_idle()
``` ```
Le code Chegodaiev.py est fourni, n'hésitez pas à le modifier à votre sauce, éventuellement à tester d'autres widgets, et à me faire remonter vos remarques. Pour un autre exemple, intégré à un projet bâti autour d'une interface Tkinter, voir ST2Shape.![sinusoide](uploads/6c86fcf0d9febe8626c3c38b407f5a6b/sinusoide.png) Le code Chegodaiev.py est fourni, n'hésitez pas à le modifier à votre sauce, éventuellement à tester d'autres widgets, et à me faire remonter vos remarques. Pour un autre exemple, intégré à un projet bâti autour d'une interface Tkinter, voir ST2Shape.
\ No newline at end of file \ 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