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
  • lexique_astuces

lexique_astuces · Changes

Page history
Update lexique_astuces authored Apr 04, 2023 by Poulard Christine's avatar Poulard Christine
Hide whitespace changes
Inline Side-by-side
lexique_astuces.md
View page @ 16d31b00
...@@ -31,6 +31,8 @@ Ce sont maintenant des arguments à part entière : dans les versions antérieur ...@@ -31,6 +31,8 @@ Ce sont maintenant des arguments à part entière : dans les versions antérieur
Si on a n lignes et p colonnes, on définit height_ratios = liste de n entiers et width_ratios = liste de p entiers qui vont définir les proportions de chacun. Si on a n lignes et p colonnes, on définit height_ratios = liste de n entiers et width_ratios = liste de p entiers qui vont définir les proportions de chacun.
`width_ratios = [ 5, 1, 2]` : la première colonne occupera 5/8 de la largeur de la figure, la seconde 1/8 etc... `width_ratios = [ 5, 1, 2]` : la première colonne occupera 5/8 de la largeur de la figure, la seconde 1/8 etc...
L'illustration du problème de superposition utilise `width_ratios =[1,4]` dans l'exemple de gauche, et `width_ratios =[1,5]` dans celui de droite, où on a agrandi la figure avec `figsize=(10,6)`
#### `layout` ? ! #### `layout` ? !
layout = "constrained" : à tester, pour remplacer tight_layout ! layout = "constrained" : à tester, pour remplacer tight_layout !
...@@ -48,29 +50,53 @@ Il existe plusieurs façons de faire, dont la plus simple : ...@@ -48,29 +50,53 @@ Il existe plusieurs façons de faire, dont la plus simple :
## la superposition d'éléments (z-order) ## la superposition d'éléments (z-order)
Les différents éléments ("artistes") sont tracés par mpl dans un ordre prédéfini, mais il est toujours possible de changer avec l'attribut `zorder`. Les différents éléments ("artistes") sont tracés par mpl dans un ordre prédéfini, mais il est toujours possible de changer avec l'attribut `zorder`.
https://matplotlib.org/stable/gallery/misc/zorder_demo.html https://matplotlib.org/stable/gallery/misc/zorder_demo.html.
### ordre de tracé des courbes
Les courbes de même nature (eg plot) sont tracées dans l'ordre, donc la première tracée sera placée sous les autres.
Par contre (version 3.7) on remarque que les courbes fill_between sont tracées par dessus les "plot" même si tracées avant. Un réglage par le z-order n'a pas permis de régler le problème.
| Problème de superposition| Solution en réglant le z-order des Axes| | objet| z-order par défaut|
| ------ | ------ | | ------ | ------ |
| ![Figure_2membre](uploads/624a4f6d5dd283af0ebc9811bcc3d25e/Figure_2membre.png) | ![DesagMDavecSecondMembre](uploads/20a4964579f2adfc276d4c041340e2bc/DesagMDavecSecondMembre.JPG) | | Patch, PatchCollection | 1 |
| Line2D, LineCollection (including minor ticks, grid lines) | 2 |
Attention au cas où on a plusieurs objets Axes : la hiérarchie des tracés dépend d'abord de l'ordre des Axes, puis l'ordre des tracés et de la nature des objets tracés .
Au sein d'un même objet Axes, on peut modifier le z-order pour gérer les superpositions.
### description du cas de figure
Dans notre cas, il y a deux objets Axes, `ax` et `ax_2m`.
- la vignette `ax` porte les courbes vmj et vj, en trait épais, tracées avec `plot`.
- la vignette `ax_2m` porte 12 courbes "second membre", chacune étant une fois tracée pour son contour (`plot`) et une pour le remplissage (`fill_between`). On trace d'abord le premier plot et son fill_between, puis le deuxième, et ainsi de suite.
### hiérarchie par Axes puis par nature de courbe puis par ordre de tracé
Dans la figure présentée ci-dessous, à gauche, les courbes tracées pour les "seconds membres" sont placées par dessus vmj et vj quel que soit l'ordre des instructions de tracé dans le script. Un réglage par le z-order ne permet pas de régler le problème. Forcément, les aplats de couleurs des `fill_between` masquent les courbes vmj et vj, et ce même si vj et vmj sont plus épaisses.
En fait, la doc précise bien que **les courbes sont tracées dans l'ordre de leurs Axes**, et ensuite seulement pour chaque Axes dans l'ordre de définition. Ainsi, toutes les courbes de `ax` sont en dessous de toutes les courbes de `ax_2m`, quel que soit l'ordre de tracé dans le script.
Par défaut, les courbes vont également être placées en fonction de leur nature (Line2D (via plot)=2, Patch=1 ; Polygons (via fill_between)= ?).
| Première version : vm et vj masquées| Solution en réglant le z-order des Axes|
| ------ | ------ |
| ![Figure_2membre](uploads/624a4f6d5dd283af0ebc9811bcc3d25e/Figure_2membre.png) | ![image](uploads/025c887db69e5961fd173bf4eded0d44/image.png) |
### astuce : ordre de tracé des Axes et transparence des fonds d'Axes. ### astuce : ordre de tracé des Axes et transparence des fonds d'Axes.
La solution trouvée est le modifier le z-order des Axes, et dans le cas présenté ci-dessous les plots d'une part et les fill_between d'autre part sont tracés sur des Axes différents, jumelés par x.
La solution trouvée pour gérer les superpositions est le modifier le z-order des Axes. Il suffirait peut-être de changer l'ordre de définition des Axes, non testé.
```python ```python
ax_2m = ax.twinx() # ax_2m qui porte les fill_between ax_2m = ax.twinx() # ax_2m qui porte les "fill_between" et des plots des mêmes vecteurs 'second membre'
ax_2m.set_zorder(5) ax_2m.set_zorder(5)
ax.set_zorder(20) # on affecte à ax un z-order plus haut ax.set_zorder(20) # on affecte à ax un z-order plus haut
ax.patch.set_alpha(0) # important, sinon ax masque ax_2m ax.patch.set_alpha(0) # important, sinon ax masque ax_2m
``` ```
Nous avons résolu le problème en affectant un z-order aux deux Axes pour gérer les superpositions, et en rendant transparent le fond de la "vignette" du dessus qui, sinon, masque totalement la vignette du dessous. Quand on assigne des z-orders différents à deux Axes, la "vignette" du dessus masque totalement la vignette du dessous. Il suffit de rendre transparent le fond de la "vignette" du dessus pour voir toutes les courbes.
La figure a été munie de widgets, un TextBox et un RangeSlider, pour faciliter l'explication en rendant tous les fill_between transparents sauf pour un mois donné (TextBox) ou sauf pour une fourchette de mois (RangeSlider).
Le code prévoit aussi une fonction avec une boucle sur les mois pour créer une animation où les fill_between sont mis en évidence les uns après les autres, toujours en réglant la transparence. On note cependant des différences entre les rendus de droite et de gauche sur les "second membres".
On voudrait que, même pour les vecteurs "second membre", les contours (via plot) soient au-dessus des remplissages (fill_between). Un zorder de 40 a été spécifié dans les plot et un zorder de 10 dans les fill_between du second membre, et on a cette fois le résultat escompté.
![image](uploads/1fdac0737b687284d7f1059d10aa86ad/image.png)
La figure a été munie de widgets, un `TextBox` et un `RangeSlider`, pour faciliter l'explication en rendant tous les `fill_between` transparents sauf pour un mois donné (`TextBox`) ou sauf pour une fourchette de mois (`RangeSlider`).
Le code prévoit aussi une fonction avec une boucle sur les mois pour créer une animation où les `fill_between` sont mis en évidence les uns après les autres, toujours en réglant la transparence.
## Les dates ! ## Les dates !
......
Clone repository
Accueil ("Home")

Python, astuces et outils
  • Gestion des versions de Python des paquets (en construction) pip, venv, poetry
  • Python_modules_du_developpeur
    • La doc avec Sphinx

Matplotlib, ateliers et points théoriques

Présentation des ateliers, avec galerie

  • le problème des versions
  • notes sur les versions 3.6 et 3.5
  • bien exploiter la doc : les infos des méthodes
  • lexique des astuces et méthodes à connaître
  • Atelier A Bases en Python utiles pour comprendre mpl
  • Atelier B graphiques simples
    • suite, lire un fichier
    • focus méthode scatter
    • focus méthodes step et bar
  • Atelier C : les objets d'une figure graphiques avec plusieurs unités
    • Point Théorie Subplots
  • Atelier D : cartes, heatmaps et leurs légendes
    • suite, les fichiers binaires extraire une matrice avec np.fromfile
    • focus : redimensionnement d'une carte "zoom"
  • Atelier E : cas des longues chroniques
  • Atelier G : interactivité widgets, toolbar et événements
    • focus : les événements "MouseEvent"
    • focus : afficher/cacher une courbe ; la mettre à jour
  • définir un style, obtenir des étiquettes de dates correctes focus plt.rcParams
  • Atelier H : tracé efficace sur données tabulaires : seaborn (pandas et mpl à venir) focus seaborn
Interfaces graphiques (GUI)
  • Un outil complet avec gestion des signaux et internationalisation: QT

  • Lexique
  • Tutographie
  • Test création de page

  • Pour les contributeurs
  • Sidebar