... | ... | @@ -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
|
|
|
|
|
|
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
|
|
|
|
... | ... | @@ -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")
|
|
|
| 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 :
|
|
|
|
|
|
- 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)
|
|
|
|
|
|
|
|
|
```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
|
|
|
|
|
|
On s'appuie pour les explications sur :
|
... | ... | @@ -597,4 +650,4 @@ def retracer_parametree(echantillon, a, b): |
|
|
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) |
|
|
\ No newline at end of file |
|
|
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 |