... | ... | @@ -29,7 +29,7 @@ Dans un premier temps, on va profiter de la bibliothèque pandas, qui crée et t |
|
|
``` python
|
|
|
import pandas as pd
|
|
|
```
|
|
|
On vous a donné du code déjà écrit, donnees_TD_ETP_csv_panda_seul ; vous pouvez sans doute l'améliorer.
|
|
|
On vous a donné du code déjà écrit, **donnees_TD_ETP_csv_panda_seul** ; vous pouvez sans doute l'améliorer.
|
|
|
On va s'appuyer sur la méthode read_csv pour lire le fichier et le mettre sous forme de tableau (DataFrame).
|
|
|
Il devrait être possible de tout récupérer au format voulu en une seule opération, mais ici on a dû écrire quelques étapes.
|
|
|
On utilise des instructions comme "print" pour vérifier que l'on a bien lu correctement, et header pour jeter un oeil aux premières lignes du DF.
|
... | ... | @@ -52,8 +52,10 @@ La mauvaise nouvelle : les trois variables, qui s'expriment dans des unités dif |
|
|
|
|
|
### C3) Mise en forme des données : une figure avec deux vignettes, dont une avec deux axes des y.
|
|
|
|
|
|
On vous a donné du code déjà écrit, comme ce que vous pourriez trouver en ligne.
|
|
|
Ca marche, même si c'est plutôt moche, donc n'hésitez pas à mettre en forme pour vous exercer.
|
|
|
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.
|
|
|
[Figure mise en forme, chaque variable a son axe](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/blob/master/illustrations/Figure_3_graphique_PTQ_subplots.png)
|
|
|
|
|
|
De prime abord, certaines syntaxes peuvent paraître vraiment bizarres.
|
... | ... | @@ -117,7 +119,7 @@ Dans le code, on a utilisé une méthode legend appliquée à l'objet fig. Ainsi |
|
|
fig.legend(bbox_to_anchor=(1, 0), loc="lower right",
|
|
|
bbox_transform=fig.transFigure, ncol=4)
|
|
|
```
|
|
|
Pour se rendre compte de la différence, mettez cette instruction en commentaire (faire précéder de # et essayez les syntaxes suivantes :
|
|
|
Pour se rendre compte de la différence, mettez cette instruction en commentaire (faire précéder de # et **essayez les syntaxes suivantes** :
|
|
|
``` python
|
|
|
plt.legend()
|
|
|
```
|
... | ... | @@ -128,3 +130,35 @@ ax_t.legend() |
|
|
ax_q.legend()
|
|
|
|
|
|
```
|
|
|
|
|
|
### C5) Variantes "esthétiques" et tests d'autres types de courbes (step, scatter...)
|
|
|
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 !
|
|
|
A priori, la méthode **bar** convient aussi, et on la trouve plus facilement ; la doc prévient cependant que cette méthode convient à des valeurs par catégories, et toutes les étiquettes sont tracées ! On peut s'en sortir en imposant les étiquettes (mais en perdant alors l'ajustement automatique au zoom). Pire, si l'on trace plusieurs courbes qui ne partage pas exactement les mêmes étiquettes de dates (par exemple, la série originale puis la même mais rééchantillonnée au mois), on constate alors que les points sont tracés en fonction du rang et pas du tout de la date !
|
|
|
Tant qu'on y est, on va aussi utilise **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
|
|
|
DICO_COULEURS_MOIS = {1: "dimgrey", 2: "black", 3: "palegreen", 4: 'mediumspringgreen', 5: 'forestgreen', 6: 'gold', 7: 'orange',
|
|
|
8:'orangered', 9:'deepskyblue', 10:'royalblue', 11:'navy', 12:'silver'}
|
|
|
```
|
|
|
Evidemment, vous pouvez aussi intervenir dans ce dictionnaire.
|
|
|
Les données étant dans le pandas DataFrame DF_PTQ, on va remplir une liste en parcourant son index, dont les éléments sont au format date, et en allant chercher la valeur qui correspond à la clé "numéro de mois de cette date".
|
|
|
|
|
|
``` python
|
|
|
# couleurs par mois : prétexte pour manipuler dictionnaires et scatter
|
|
|
liste_couleurs = []
|
|
|
for date in DF_PTQ.index:
|
|
|
liste_couleurs.append(DICO_COULEURS_MOIS[date.month])
|
|
|
|
|
|
```
|
|
|
Evidemment, on peut écrire la même chose avec une liste en intension (comprehension list).
|
|
|
Il ne reste ensuite qu'à appliquer **scatter** en précisant pour l'argument **c** la liste de couleurs.
|
|
|
``` python
|
|
|
liste_couleurs = [ DICO_COULEURS_MOIS[date.month] for date in DF_PTQ.index]
|
|
|
|
|
|
ax_t.scatter(DF_PTQ.index, DF_PTQ[etiquette_temperatures].tolist(), marker='*', ls=':',
|
|
|
label=etiquette_temperatures, c=liste_couleurs)
|
|
|
|
|
|
```
|
|
|
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". |