... | ... | @@ -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.
|
|
|
`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 = "constrained" : à tester, pour remplacer tight_layout !
|
|
|
|
... | ... | @@ -48,29 +50,53 @@ Il existe plusieurs façons de faire, dont la plus simple : |
|
|
## 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`.
|
|
|
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.
|
|
|
https://matplotlib.org/stable/gallery/misc/zorder_demo.html.
|
|
|
|
|
|
| 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.
|
|
|
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
|
|
|
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.set_zorder(20) # on affecte à ax un z-order plus haut
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
|
|
|
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 !
|
... | ... | |