B) Atelier 1 : un graphique simple, avec un axe des x et un axe des y
Si vous n'avez pas Python, vous pouvez quand même suivre sur un REPL en ligne. Exécutez avec "run" ; il faut attendre un peu que les packages s'installent. Vous ne pouvez pas modifier le code, si vous voulez manipuler il vous est possible d'ouvrir un compte sur ce site.
Un exemple de copie d'écran avec le code et la 2e figure :
B1. Un graphe super simple.
Reportez vous au besoin à la partie A pour les notions de base en Python nécessaires pour le tout début. On va utiliser le module pyplot de matplotlib ; il faut donc déclarer que l'on va l'utiliser, autrement dit on va l'importer d'abord. L'usage est d'importer matplotlib.pyplot avec l'alias "plt" ; cela économise quelques frappes, et comme tout le monde fait comme ça vous pourrez plus facilement échanger du code.
from matplotlib import pyplot as plt # instruction "canonique" !
plt.plot ( [1, 2, 5, 10, 50] , [11, 31, 53, 208, 502] ) # appel à fonction, arguments = une liste, une liste
plt.show() # à part dans JupyterLab, vous avez besoin de cette ligne pour afficher le graphique
une figure un peu plus habillée
Références : la Doc de matplotlib, très complète, ou des tutos comme Python Simple
Si vous travaillez dans la console, comme on a déjà importé précédemment le module pyplot il est "connu" pour tout le reste de la session. Vous avez ci-dessous les principales instructions, vous pouvez les manipuler et modifier le graphique comme vous le souhaitez.
A noter que l'on peut utiliser indifféremment pour certains arguments des noms en version longue ou courte : lw = linewidth ls = linestyle c = color
plt.plot ( [1, 2, 5, 10, 50] , [11, 21, 53, 108, 502], label="âge du capitaine", lw=2, marker='*', color='purple', ls=':' )
plt.xlabel('en unités du système international', color = 'green', fontsize = 14)
plt.ylabel('fois dix plus du bruit', color = 'blue', fontsize = 14)
plt.ylim(0, 800)
plt.title("ma première figure", fontsize = 14, horizontalalignment = 'left', loc = 'left')
plt.savefig("mafigure.svg") # l'extension suffit pour que Python comprenne quel format vous attendez
plt.savefig("mafigure.png")
plt.show() # pour faire apparaître le graphique
Cas d'une abscisse temporelle - exploration avec l'outil zoom
En hydrologie, mais aussi en hydraulique, on manipule des chroniques, valeur=f(t). Le module datetime est plutôt bien fait et vous rendra beaucoup de services. Pour en savoir plus, voir diapos ou page dédiée datetime.
DU module datetime, on va beaucoup utiliser datetime ; pensez que c'est une classe (même s'il n'y pas de majuscule...) ; on définit une instance avec des arguments entiers
from datetime import datetime, timedelta # module de gestion de dates "standard"
print (datetime.now())
date_de_creation_inrae = datetime(2020,1,1) # arguments= année, mois, jour ;
attention, datetime(2020,01,01) cause une erreur (je me fais avoir régulièrement...). Cette instance a des attributs:
date_de_creation_inrae.month
On a importé aussi timedelta, qui correspond à un "delta entre dates", donc une durée.
duree_d_existence = datetime.now() - date_de_creation_inrae # différence entre deux dates
type(duree_d_existence) # type attendu = timedelta
un_jour = timedelta(days=1) # définir une durée directement
Attention, on ne peut pas écrire timedelta(months=1) car un mois n'est pas une "durée" définie, cela dépend du mois...
Création d'une longue chronique temporelle tirée du chapeau pour pouvoir jouer avec le zoom
On définit une date de début, une date de fin (aujourd'hui) et on calcule le nombre de jours
date_premiere_mesure = datetime(1806,1,1) # première date de la série temporelle de débit à Dresde
nombre_de_jours = ( datetime.now() - date_premiere_mesure ).days # propriété days du type timedelta
On va rejouer avec une boucle for, et découvrir une manière plus performante de créer une nouvelle liste avec une boucle. On va créer une liste avec tous les jours depuis 1806
# première manière de faire
etendue_temporelle = [] # ou = list() : je crée une liste vide
for i_jour in range(nombre_de_jours ) : #range(N) = boucle de 0 à N, N non inclus
etendue_temporelle.append(date_premiere_mesure + timedelta(days=i_jour) # ajout d'un terme à la liste vide
PyCharm vous permet de passer facilement d'une formulation à l'autre, ce qui est bien pratique au début (surtout en présence de if et else, mais ceci est une autre histoire...
# écriture équivalente en mode plus "compact" et efficace qu'une boucle for (on s'y fait et on y prend goût)
etendue_temporelle = [date_premiere_mesure + timedelta(days=i_jour) for i_jour in range(nombre_de_jours )]
numeros_de_mois = [date.month for date in etendue_temporelle ]
Et maintenant on peut tracer les numéros de mois en fonction de la date. Attention, vous allez être déçus par le résultat...
plt.plot(etendue_temporelle , numeros_de_mois )
plt.ylabel('numéro de mois', color = 'blue', fontsize = 14)
plt.show() # est-ce vraiment juste un rectangle bleu ???
Sur le REPL.it, il vous suffit de fermer la première figure pour voir celle-ci. Si c'est tout bleu c'est normal : en fait l'information est trop dense, on n'y voit rien. Dans la barre du bas, avec l'icône "loupe" vous pouvez zoomer et dézoomer. Cet outil, avec l'outil "glisser-déplacer", est bien pratique pour explorer une longue chronique, mais au passage on identifie des imperfections : les étiquettes de dates affichées ne sont pas forcément optimales ; on verra par la suite des solutions pour améliorer l'affichage. On verra aussi à la fin comment ajuster la résolution d'affichage.
Sauvegarder la figure
Ces figures ne sont pas excessivement intéressantes, mais on va quand même indiquer comment les récupérer proprement :
- pendant l'exécution (at runtime) : il suffit de cliquer sur l'icône disquette pour accéder à un menu de sauvegarde du fichier. Vous pouvez choisir l'extension : PNG, JPEG et même SVG, un format vectoriel (donc modifiable avec Inkscape...)
- dans le code : la commande savefig permet d'enregistrer la figure à un format spécifié, à la place ou en plus de l'affichage. Le seul argument obligatoire est fname, un nom de fichier (ou chemin complet + nom de fichier)
ma_figure.savefig(fname, dpi=None, facecolor='w', edgecolor='w',
orientation='portrait', papertype=None, format=None, transparent=False, bbox_inches=None, pad_inches=0.1,
frameon=None, metadata=None)
A noter qu'il suffit de donner en argument un nom de fichier muni d'une extension pour que Python réalise la sauvegarde au bon format :
ma_figure.savefig("un_nom_de_fichier_clair.svg")
Nous avons réalisé des tests avec des données "tirées du chapeau", dans la suite on va aller lire des données dans des fichiers, B2) lire un fichier texte et extraire l'information