Python est souvent utilisé par des scientifiques pour donner forme à des données. La librairie matplotlib crée pour vous des graphiques en quelques lignes de code.
Quelques exemples de graphiques
Matplotlib est une bibliothèque python qui dessine des graphiques . Nul besoin de connaissances en interfaces graphiques pour créer un graphique dynamique avec possibilité de zoom et de sauvegarde par l'utilisateur. Il est d'ailleurs possible de sauvegarder les graphiques en format matriciels comme le PNG, JPEG , etc. et vectoriels comme le PDF et le SVG . Une grande communauté s'est formée autour de ce projet et donc la documentation et les exemples ne manquent pas.
Vous pouvez installer la lib matplotlib en utilisant le gestionnaire de paquets Linux :
sudo apt-get install python-matplotlib
Voici un exemple simple de graphique:
# coding: utf-8 import matplotlib.pyplot as plt plt.plot([1,2,3,4]) plt.ylabel('Label 1') plt.show()
Dans cet exemple on voit que par défaut il n'y a pas qu'un graphique, il y a aussi des outils pour exploiter ce graphique: il est en effet possible de zoomer, de modifier la taille du rendu et bien sur de l'enregistrer.
Pour visualiser le gaphique en plein écran vous pouvez utiliser le raccurci Ctrl + F. Il est possible d'afficher une grille en appuyant sur la touche g de votre clavier.
Dans notre exemple nous avons renseigné uniquement les valeurs de l'abscisse, c'est à dire [1,2,3,4], la lib a donc remplit la valeur des ordonnées d'elle-même comme si nous avions donné comme valeur range(4) c'est à dire [0,1,2,3]
Il est possible d'associer une valeur x à une valeur y comme ceci:
plt.title("Danger de la vitesse") plt.plot([50,100,150,200], [1,2,3,4]) plt.xlabel('Vitesse') plt.ylabel('Temps') plt.show()
La courbe est juste mais je ne souhaite délimiter moi même les limites du graphique. Seul les vitesses entre 80 et 180 m'intéressent et le temps de 1 secondes à 10 secondes. Il est possible d'encadrer son graphique à l'aide de la méthode axis(xmin, xmax, ymin, ymax)
plt.plot([50,100,150,200], [1,2,3,4]) plt.xlabel('Vitesse') plt.ylabel('Temps') plt.axis([80, 180, 1, 10]) plt.show()
Il est possible de superposer les courbes:
plt.plot([50,100,150,200], [1,2,3,4]) plt.plot([50,100,150,200], [2,3,7,10]) plt.plot([50,100,150,200], [2,7,9,10])
Vous pouvez utiliser cette syntaxe également:
plt.plot([50,100,150,200], [1,2,3,4], [50,100,150,200], [2,3,7,10], [50,100,150,200], [2,7
Il est possible de changer la couleur et la forme des courbes:
Courbes possibles: - -- -. :
Couleurs possibles: b g r c m y k w
plt.plot([50,100,150,200], [1,2,3,4], "r--") plt.plot([50,100,150,200], [2,3,7,10], "bs") plt.plot([50,100,150,200], [2,7,9,10], "g^")
Vous pouvez utiliser cette syntaxe également:
plt.plot([50,100,150,200], [1,2,3,4], "r--", [50,100,150,200], [2,3,7,10], "bs", [50,100,150,200], [2,7,9,10], "g^")
Vous pouvez changer la largeur des courbes comme ceci:
plt.plot([50,100,150,200], [1,2,3,4], "r--", linewidth=5) plt.plot([50,100,150,200], [2,3,7,10], "b", linewidth=3) plt.plot([50,100,150,200], [2,7,9,10], "g", linewidth=10)
Il est possible de mettre plusieurs graphiques sur une même image:
plt.subplot(211) plt.plot([50,100,150,200], [1,2,3,4], "r--", linewidth=5) plt.plot([50,100,150,200], [2,3,7,10], "b", linewidth=3) plt.plot([50,100,150,200], [2,7,9,10], "g", linewidth=10) plt.xlabel('Vitesse') plt.ylabel('Temps') plt.axis([80, 180, 1, 10]) plt.subplot(212) plt.plot([50,100,150,200], [1,2,3,15], "r--", linewidth=5) plt.plot([50,100,150,200], [2,3,7,10], "b", linewidth=3) plt.plot([50,100,150,200], [2,7,9,10], "g", linewidth=10) plt.xlabel('Vitesse') plt.ylabel('Temps') plt.axis([80, 180, 1, 10]) plt.show()
Vous pouvez également ajouter une grille (et des marqueurs):
marqueurs possibles : o + . x * ^
plt.grid(True) plt.plot([50,100,150,200], [2,3,7,10], "b", linewidth=0.8, marker="*") plt.plot([50,100,150,200], [2,7,9,10], "g", linewidth=0.8, marker="+")
Il est possible d'ajouter du texte en indiquant les coordonnées:
plt.text(150, 6.5, r'Danger')
plt.grid(True) plt.plot([50,100,150,200], [2,3,7,10], "b", linewidth=0.8, marker="*", label="Trajet 1") plt.plot([50,100,150,200], [2,7,9,10], "g", linewidth=0.8, marker="+", label="Trajet 2") plt.axis([80, 180, 1, 10]) plt.xlabel('Vitesse') plt.ylabel('Temps') plt.legend() plt.show()
plt.grid(True) plt.plot([50,100,150,200], [2,3,7,10], "b", linewidth=0.8, marker="*") plt.plot([50,100,150,200], [2,7,9,10], "g", linewidth=0.8, marker="+") plt.axis([80, 180, 1, 10]) plt.annotate('Limite', xy=(150, 7), xytext=(165, 5.5), arrowprops={'facecolor':'black', 'shrink':0.05} ) plt.xlabel('Vitesse') plt.ylabel('Temps')
Pour créer un histogramme on utilise la méthode hist . On peut lui donner des données brutes et il s'occupera de faire les calcules nécessaires à la présentation du graphique.
On a prit ici l'exemple de 1000 tirage au sort (random) de valeur entre 0 et 150 et voici le résultat:
# coding: utf-8 import matplotlib.pyplot as plt import random # 1000 tirages entre 0 et 150 x = [random.randint(0,150) for i in range(1000)] n, bins, patches = plt.hist(x, 50, normed=1, facecolor='b', alpha=0.5) plt.xlabel('Mise') plt.ylabel(u'Probabilité') plt.axis([0, 150, 0, 0.02]) plt.grid(True) plt.show()
La valeur 50 donné en deuxième paramètre de la méthode hist indique le nombre de barres à afficher. Si vous lui passer une liste par exemple [25,50] une seule barre sera affichée comprenant l'intervalle 25;50
Les accents peuvent faire boguer votre script, n'oubliez pas de mettre votre string en unicode comme dans l'exemple ci-dessus.
Un des graphiques les plus utilisés doit être le diagramme circulaire (ou camembert ) :
name = ['-18', '18-25', '25-50', '50+'] data = [5000, 26000, 21400, 12000] explode=(0, 0.15, 0, 0) plt.pie(data, explode=explode, labels=name, autopct='%1.1f%%', startangle=90, shadow=True) plt.axis('equal') plt.show()
Les données explode indiquent les espaces entre les parts. Nous avons fait en sorte dans cet exemple de séparer la part 18-25 des autres part. Le paramètre autopct indique le pourcentage réel par rapport aux données qu'on lui a fournit. Enfin la méthode axis("equal") rend le diagramme parfaitement circulaire. En son absence lorsque vous redimensionnez le graphique celui-ci s'adapte au conteneur ce qui peut lui donner une forme élliptique.
Site officiel: matplotlib.org
Livres Python & Django: conseils de lecture