... | ... | @@ -10,7 +10,7 @@ _figure composée de deux sous-figures liées par un unique axe des x ; la vigne |
|
|
|
|
|
Les diapos introduisant l'Atelier ont déjà abordé ce cas, en expliquant ce qui se "cache derrière" un plt.plot, et le pourquoi de la syntaxe plus explicite **" fig, ax = plt.subplots() "**, On y explique aussi ce qu'est vraiment le type de "ax", qui n'est pas que un axe mais se caractérise par une surface dans la figure munie d'un système d'axes... Les diapos de cette partie reviennent sur ce point théorique de manière plus détaillée.
|
|
|
|
|
|
:warning: dans cette page, on présente des résultats obtenus avec le module **pandas** qui gère les structures DataFrame et Series. :panda_face: Attention, il est fortement recommandé de ne pas mélanger les méthodes de tracé de pandas (pandas.plot) avec les méthodes de base de matplotlib (Axes.plot) sur une même figure. Des tests montrent également des soucis de gestion de 2 axes des y avec pandas.plot sur des pandas.Series, même en ne faisant intervenir que pandas.plot (et c'est très étonnant, ça se passe bien pour 2 séries, on a bien 2 axes des y et à la troisième tout se superpose... ; voir à la fin).
|
|
|
:warning: dans cette page, on présente des résultats obtenus avec le module **pandas** qui gère les structures DataFrame et Series. :panda_face: Attention, il est fortement recommandé de ne pas mélanger les méthodes de tracé de pandas (pandas.plot) avec les méthodes de base de matplotlib (Axes.plot) sur une même figure. Des tests montrent également des soucis de gestion de 2 axes des y avec pandas.plot sur des pandas.Series, même en ne faisant intervenir que pandas.plot si on utilise la méthode twinx présentée ici...
|
|
|
|
|
|
### C1) le fichier d'un TD de bilan hydrologique avec 4 colonnes : date, T, pluie, Q
|
|
|
|
... | ... | @@ -47,9 +47,10 @@ 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. La mauvaise nouvelle : les trois variables, qui s'expriment dans des unités différentes, sont toutes les 3 tracées dans le même repère. Cela permet de voir les données rapidement, mais évidemment la mise en forme n'est pas du tout satisfaisante pour un rapport. On va donc retravailler cela dans la suite.
|
|
|
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.
|
|
|
|
|
|
### C3) Mise en forme des données : une figure avec deux vignettes, dont une avec deux axes des y.
|
|
|
### C3) Mise en forme des données (sans pandas) : une figure avec deux vignettes, dont une avec deux axes des y.
|
|
|
|
|
|
Vous pouvez partir de la fonction précédente ou de **donnees_TD_ETP_2subplots** déjà écrit; dans le développement on trouve souvent en ligne des bouts de code qu'il faut s'approprier et adapter. Cette fonction reprend le début de la fonction précédente (lecture avec pd.read_csv), on trace aussi avec la méthode pd plot pour vérifier que la lecture s'est bien passée (phase que l'on peut ensuite mettre en commentaire). Ensuite on a du code spécifique. Si vous l'exécutez, vous verrez que ça marche, le rendu n'est pas forcément à votre goût, donc ce sera l'occasion de vous exercer à mettre en forme. On proposera par la suite une variante, vous pourrez donc étoffer votre palette.
|
|
|
|
... | ... | @@ -118,7 +119,7 @@ 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 **pandas** :panda_face: :cactus: ?
|
|
|
## 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)
|
... | ... | |