La passion du libre

Graphiques avec pyplot (toujours en cours d'élaboration)

Cliquez sur le bouton pour afficher les conseils de lecture.Cliquez à nouveau pour les masquer

Fenêtres surgissantes explicatives

Certains mots dans le texte, affichés en vert et en gras, sont précédés d'une étoile verte sur fond orange. Par exemple, ce mot : lien.

Si vous placez le pointeur de la souris sur un tel mot, une fenêtre surgissante – popup – s'ouvre alors que l'affichage du reste du documment s'atténue. Cette fenêtre contient une explication détaillée du mot en question

Une fois que vous avez pris connaissance de ce que vous affiche cette fenêtre surgissante, vous pouvez retourner à l'état normal en cliquant ailleurs dans le document.

Navigation

Pour naviguer, utilisez le menu vertical à gauche du texte. Les entrées de menu marquées d'une petite flèche vers le bas ouvrent un sous-menu lorsqu'on clique dessus.

Vous pouvez également choisir une lecture continue en cliquant sur un des liens proposés en bas de page.

Graphique à plusieurs séries empilées

Données

Article/Nombre de ventes/Chiffre d’affaire/Bénéfice
Article 1/1000/23987/2780
Article 2/1345/57989/4532
Article 3/7000/12000/8000

Script

Le script est invoqué par :

python3 severalstackedseries.py extab.csv

Cette fois nous allons découper le script en tranches pour faciliter les explications

Partie 1 : imports et commentaires

#!/usr/bin/python3
import matplotlib.pyplot as plt
from matplotlib import rcParams
import sys
rcParams.update({'figure.autolayout': True})#nécessaire pour que les ticks autour
#du graphique aient suffisamment de place
#invocation python severalstackedseries.py <data file name>

#Pour ce script, les séries de données sont supposées être présentées en lignes.
#La première ligne est une ligne d'entêtes
#Une première colonne comprenant un entête de ligne peut, ou pas, exister
#Les données sont supposées provenir de l'enregistrement au format csv d'un 
#tableur, format dans lequel le séparateur est la barre de division /

Les commentaires suffisent à la compréhension de cette partie

Partie 2 : analyse du fichier

f=open(sys.argv[1]) 
#la première ligne est spécifique
newline=next(f)
newline=newline.rstrip('\n')#on élimine tout retour à la ligne
entêtes=newline.split('/')#on récupère la ligne des entêtes
existent_entêtes_lignes=False
valeurs=[]
origine=""#si des entêtes de lignes existent alors représente la ligne 0 colonne 0
entêtes_lignes=[]
loop=True
while loop:
   try:
      newline=next(f)
      newline=newline.rstrip('\n')
      #print('newline : '+newline)
      line=newline.split('/')# 
      valeurs.append(line)
   except:
      loop=False #on sort de boucle en fin de fichier

vals=[] #on transforme les textes des valeurs en valeurs numériques
num_series=0 # on en profite pour compter les séries
for line in valeurs:
    line_vals=[]
    for v in line:
       try:
          line_vals.append(float(v))       
       except:
          entêtes_lignes.append(v) #on stocke l'entête de ligne qui ne doit pas faire partie des valeurs
          existent_entêtes_lignes=True

vals.append(line_vals)
num_series+=1

if(existent_entêtes_lignes):
   origine=entêtes[0]
   del entêtes[0]

print(vals) # ces trois lignes sont là pour débogage
print(entêtes_lignes)
print(entêtes)

Les trois dernières lignes nous permettent de contrôler le résultat

[[1000.0, 23987.0, 2780.0], [1345.0, 57989.0, 4532.0], [7000.0, 12000.0, 8000.0]]
['Article 1', 'Article 2', 'Article 3']
['Nombre de ventes', 'Chiffre d’affaire', 'Bénéfice']

On observera que le tableau des valeurs (vals) est à deux dimensions.

Partie 3 : création d'une palette de couleurs en niveaux de gris

def definecolors(nb): #cette fonction crée un tableau de 12 couleurs en niveaux de gris
   v,i=0,0
   colors=[]
   while i<nb:
      colors.append((v/10,v/10,v/10))
      v=(v+1) % 11
      i+=1
   return colors

colors=definecolors(12)
print()
print (colors)

La dernière instruction est là pour contrôle. Voici ce qu'elle fournit :

[(0.0, 0.0, 0.0), (0.1, 0.1, 0.1), (0.2, 0.2, 0.2), (0.3, 0.3, 0.3), (0.4, 0.4, 0.4), (0.5, 0.5, 0.5), (0.6, 0.6, 0.6), (0.7, 0.7, 0.7), (0.8, 0.8, 0.8), (0.9, 0.9, 0.9), (1.0, 1.0, 1.0), (0.0, 0.0, 0.0)]

Partie 4 : le tracé

plt.xlim(-2,+3) #les limites en x du graphique
xra= range(len(vals[0]))
g=[]

cumul=[]
for v in vals[0]:
   cumul.append(0)
i=0
for line in vals:
   g.append(plt.bar(xra,line,width=0.7,bottom=cumul,color=colors[i*4 % 11],linewidth=1))
   i+=1
   index=0
   while index<len(cumul):
      cumul[index]=cumul[index]+line[index]
      index+=1

plt.xticks([x+0.7 /2 for x in xra], entêtes,rotation =90)
plt.legend(g,entêtes_lignes,loc = 'upper left')
plt.title('Graphique à plusieurs séries de données empilées') 

On observera que, avec i comme numéro d'ordre de la série, la formule i*4 % 11 permet d'alterner les couleurs en faisant que deux barres adjacentes ont des couleurs assez éloignées : 0,4,8,1,5,9,2, etc.

Ce qui permet l'emplilage, c'est le décalage des barres par l'option bottom.

Partie 5 : sauvegarde et affichage de la figure

plt.savefig('/home/jaaf/pythontuto/stacked.png')
plt.show() #doit toujours être placé après la ligne précédente, jamais avant
f.close()

Le résultat

stacked.jpeg