|
|
## C) Atelier 2 : un graphique avec 3 variables d'unités différentes : 2e axe des y, subplots ; les objets d'une figure
|
|
|
|
|
|
:construction_worker: attention, sans doute à cause des modifications répétées d'éditeur ("en test" !), le code reporté ici a... disparu.
|
|
|
Il reste le fichier python complet, en attendant de réparer le problème.
|
|
|
:construction_worker: attention, sans doute à cause des modifications répétées d'éditeur ("en test" !), le code reporté ici a... disparu. Il reste le fichier python complet, en attendant de réparer le problème.
|
|
|
|
|
|
**Objectif :** représenter sur une même figure des variables de nature différente mais tracées selon un même axe des x, avec une légende contenant toutes les variables.
|
|
|
|
... | ... | @@ -55,10 +54,14 @@ Cette colonne doit devenir l'index de la table. On a donc au final un DF avec un |
|
|
|
|
|
![](uploads/4438d78280976838e8b0742b5bf84653/Figure_2_graphique_pandas.PNG) _figure obtenue avec DF_TD4.plot()_
|
|
|
|
|
|
L'outil zoom montre que l'affichage des étiquettes de date est correct quel que soit le niveau de zoom, contrairement à la première expérience. Dans la suite, vous trouverez les instructions qui donnent ce rendu même en dehors de Pandas.
|
|
|
L'outil zoom montre que l'affichage des étiquettes de date est correct quel que soit le niveau de zoom, contrairement à la première expérience. Dans la suite, vous trouverez les instructions qui donnent ce rendu même en dehors de Pandas.
|
|
|
|
|
|
Par défaut, les trois variables sont toutes les 3 tracées dans le même repère, bien qu'elles aient des unités différentes. Cela permet déjà de voir les données rapidement. Pour un vrai graphique mis en forme, il faut [utiliser des méthodes spécifiques à pandas](https://stackoverflow.com/questions/68955060/how-to-plot-a-pandas-dataframe-with-multiple-axes-each-rendering-multiple-column). Pour ne pas compliquer les choses avec les syntaxes spécifique pandas, on va dans la suite travailler avec les méthodes standard de matplotlib, en passant en arguments x et y les dates et les valeurs séparément.
|
|
|
Par défaut, les trois variables sont toutes les 3 tracées dans le même repère, bien qu'elles aient des unités différentes. Cela permet déjà de voir les données rapidement. Pour un vrai graphique mis en forme, il faut [utiliser des méthodes spécifiques à pandas](https://stackoverflow.com/questions/68955060/how-to-plot-a-pandas-dataframe-with-multiple-axes-each-rendering-multiple-column).
|
|
|
|
|
|
* plot en précisant si c'est sur un \[axe secondaire\](<https://pandas.pydata.org/docs/user_guide/visualization.html#plotting-on-a-secondary-y-axis>)
|
|
|
* définition d'une figure organisée en plusieurs "vignettes" (Axes) : \[subplots\](<https://pandas.pydata.org/docs/user_guide/visualization.html#subplots>)
|
|
|
|
|
|
Pour ne pas compliquer les choses avec les syntaxes spécifique pandas, on va dans la suite travailler avec les méthodes standard de matplotlib, en passant en arguments x et y les dates et les valeurs séparément.
|
|
|
|
|
|
:ocean: **seaborn** connaît le type pandas.DataFrame et offre donc des syntaxes adaptées aux données contenues dans les DataFrame. La version matplotlib :three:.:five: a repris cette bonne idée :
|
|
|
|
... | ... | @@ -118,13 +121,12 @@ Pour se rendre compte de la différence, mettez cette instruction en commentaire |
|
|
La figure tracée par la fonction **donnees_TD_ETP_2subplots** souffre de défauts esthétiques (couleurs qui se voient mal...) et de plus elle représente par des lignes des variables qui sont en fait des moyennes à pas de temps fixe. On va donc utiliser la méthode **step** sur laquelle j'attire votre attention car j'ai eu du mal à la trouver ! :warning: on remarque que le dernier point n'est pas suivi d'un trait horizontal, ce qui se comprend car dans les arguments il n'y pas d'information qui permettrait de savoir où l'arrêter ; ici cela ne pose pas de problème, mais cela peut parfois être trompeur.
|
|
|
|
|
|
<details>
|
|
|
<summary>Cliquez pour en savoir plus sur \*\*step\*\* et \*\*bar\*\*</summary>
|
|
|
|
|
|
Au moment de l'écriture, les tests avec \*\*bar\*\* ont donné des résultats complètement inutilisables : les valeurs étaient placées en fonction de leur rang (indépendamment des valeurs de x), avec l'intégralité des étiquettes en x ! Ainsi, avec plusieurs courbes qui ne partagent pas exactement la même liste de dates (par exemple, la série originale puis la même mais rééchantillonnée au mois), le rendu est absurde. Des posts de blog et autres discussions de forums ont fait le même constat, et proposaient des expédients pas forcément transposables à nos données (imposer la liste des étiquettes, valable avec une seule courbe et sans zoomer, ou... utiliser plot). En se référant à la doc (le bon réflexe ! ) la raison est apparue : cette méthode convient à des valeurs \*\*par catégories\*\*. \*\*Depuis, la méthode bar a évolué\*\* : elle permet maintenant de respecter la chronologie. C'est encore un bon exemple de la difficulté de trouver des informations : à part dans la doc officielle, qui existe pour chaque version, vous n'êtes pas à l'abri de trouver une information erronée ou incomplète (par exemple ; "bar ne convient pas donc il faut utiliser plot", alors que step est bien meilleur) ou une information correcte au moment de sa rédaction mais obsolète pour votre version.
|
|
|
<summary>Cliquez pour en savoir plus sur \\\*\\\*step\\\*\\\* et \\\*\\\*bar\\\*\\\*</summary>
|
|
|
Au moment de l'écriture, les tests avec \*\*bar\*\* ont donné des résultats complètement inutilisables : les valeurs étaient placées en fonction de leur rang (indépendamment des valeurs de x), avec l'intégralité des étiquettes en x ! Ainsi, avec plusieurs courbes qui ne partagent pas exactement la même liste de dates (par exemple, la série originale puis la même mais rééchantillonnée au mois), le rendu est absurde. Des posts de blog et autres discussions de forums ont fait le même constat, et proposaient des expédients pas forcément transposables à nos données (imposer la liste des étiquettes, valable avec une seule courbe et sans zoomer, ou... utiliser plot). En se référant à la doc (le bon réflexe ! ) la raison est apparue : cette méthode convient à des valeurs \*\*par catégories\*\*. \*\*Depuis, la méthode bar a évolué\*\* : elle permet maintenant de respecter la chronologie. C'est encore un bon exemple de la difficulté de trouver des informations : à part dans la doc officielle, qui existe pour chaque version, vous n'êtes pas à l'abri de trouver une information erronée ou incomplète (par exemple ; "bar ne convient pas donc il faut utiliser plot", alors que step est bien meilleur) ou une information correcte au moment de sa rédaction mais obsolète pour votre version.
|
|
|
|
|
|
(éléments développés actuellement [dans une autre page, consacrée au traitement des chroniques en hydrologie](https://gitlab.irstea.fr/orchyds-visualisation-et-traitement-de-chroniques-pas-de-temps-fixe/echasses/-/wikis/visualisations,-annexe-technique)
|
|
|
|
|
|
</details>Pour étoffer l'arsenal des courbes, on va aussi utiliser **scatter** à titre d'exercice, même si ce n'est pas vraiment pertinent ici. Scatter permet de passer comme argument color et size soit une valeur unique soit in vecteur de même taille de x et y. Ici, il n'y a pas matière à faire varier la taille (sauf pour s'exercer), on propose de jouer sur la couleur. On en profite au passage pour manipuler un dictionnaire qui vous propose une relation entre les entiers de 1 à 12 et des couleurs.
|
|
|
</details>Pour étoffer l'arsenal des courbes, on va aussi utiliser \*\*scatter\*\* à titre d'exercice, même si ce n'est pas vraiment pertinent ici. Scatter permet de passer comme argument color et size soit une valeur unique soit in vecteur de même taille de x et y. Ici, il n'y a pas matière à faire varier la taille (sauf pour s'exercer), on propose de jouer sur la couleur. On en profite au passage pour manipuler un dictionnaire qui vous propose une relation entre les entiers de 1 à 12 et des couleurs.
|
|
|
|
|
|
```python
|
|
|
```
|
... | ... | @@ -141,16 +143,11 @@ Evidemment, on peut écrire la même chose avec une liste en intension (comprehe |
|
|
|
|
|
Si vous avez bien assimilé cette manip avec les dictionnaires, vous pourriez écrire une fonction adaptée au fichier dans sa forme initiale, avec des "janv-01" et autres "sept-02".
|
|
|
|
|
|
## soucis possibles avec twinx et **pandas** :panda_face: :cactus: ?
|
|
|
|
|
|
Des tests effectués par ailleurs montrent que la gestion de 2 axes des y avec pandas.plot sur des pandas.Series avec twinx amène à des anomalies, même en ne faisant intervenir que pandas.plot. Dans certains bouts de code, on a défini un objet "Axes" puis un second avec twinx et les 2 axes des y sont placés à gauche et se superposent... En modulant le code avec des commentaires, on constate que la figure a bien 2 axes des y quand on trace une courbe sur chaque axe, et si on ajoute un troisième plot les deux axes des y se superposent...
|
|
|
Avec **pandas**, il faut utiliser les méthodes et arguments spécifiques ; [voir par exemple ce post](https://stackoverflow.com/questions/68955060/how-to-plot-a-pandas-dataframe-with-multiple-axes-each-rendering-multiple-column)
|
|
|
|
|
|
## soucis possibles avec twinx et **pandas** :panda_face: :cactus: ?
|
|
|
|
|
|
Des tests effectués par ailleurs montrent que la gestion de 2 axes des y avec pandas.plot sur des pandas.Series avec twinx amène à des anomalies, même en ne faisant intervenir que pandas.plot. Dans certains bouts de code, on a défini un objet "Axes" puis un second avec twinx et les 2 axes des y sont placés à gauche et se superposent... En modulant le code avec des commentaires, on constate que la figure a bien 2 axes des y quand on trace une courbe sur chaque axe, et si on ajoute un troisième plot les deux axes des y se superposent... Avec **pandas**, il faut utiliser les méthodes et arguments spécifiques ; [voir par exemple ce post](https://stackoverflow.com/questions/68955060/how-to-plot-a-pandas-dataframe-with-multiple-axes-each-rendering-multiple-column)
|
|
|
| 2 objets Axes liés par twinx, un pandas.plot sur chacun | on ajoute un troisième tracé avec pandas.plot |
|
|
|
|---------------------------------------------------------|-----------------------------------------------|
|
|
|
| ![pandas_plot_2axes_y_ok](uploads/61732ceae315884fb9e620d82e436298/pandas_plot_2axes_y_ok.png) | ![pandas_plot_2axes_y_superposes](uploads/df02bd56ca0fddf3c21a408f7d55ac5a/pandas_plot_2axes_y_superposes.png) |
|
|
|
|
|
|
|
|
|
|
|
|
[Retour à la page principale](Home) |
|
|
\ No newline at end of file |