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 en grappes à plusieurs séries empilées

Dans cette page nous allons montrer comment afficher des grappes de colonnes empilées

Données

Les données pourraient se présenter, après export depuis un tableur au format csv avec la barre de division en tant que séparateur, comme suit :

Premier trimestre
"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"
Deuxième trimestre
"Article/Nombre de ventes/Chiffre d’affaire/Bénéfice"
"Article 1/4532/12789/1235"
"Article 2/8964/97989/8976"
"Article 3/3500/5989/3989"
Troisième trimestre
"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"
Quatrième trimestre
"Article/Nombre de ventes/Chiffre d’affaire/Bénéfice"
"Article 1/5000/99564/9987"
"Article 2/2500/98675/7896"
"Article 3/7000/12000/8000"

Remarque : Ici les groupes de données sont relatives aux mêmes choses pour des intervalles de temps différents (ventes, ca et bénéfices pour différents articles). Néanmoins, le script est conçu pour fonctionner avec des choses de nature différentes dans les différents groupes.

Le script

    #!/usr/bin/python3
    import matplotlib.pyplot as plt
    from matplotlib import rcParams
    import sys
    import re

    #nécessaire pour que les ticks autour du graphique aient suffisamment de place
    # doit être placé avant la création de la figure
    #rcParams.update({'figure.autolayout': True})
    rcParams['figure.figsize']=[12,9]
    rcParams['figure.subplot.top']=0.8

    #on crée d'emblée une figure 
    plt.figure('') 

    #invocation script : python clusterofseveralstackedseries.py 

    #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 /

    print(sys.argv[1])

    f=open(sys.argv[1]) 
    cluster_names=[]#le nom des clusters ('Premier trimestre, etc.)

    clusters=[]#le tableau global des données, 4 clusters comprenant 3 piles de 
    #chacune n lignes dont une ligne d'entêtes
    cluster_col_headers=[] # les entêtes de colonne
    cluster_row_headers=[] # les entêtes de ligne
    cluster_vals=[]#le tableau des clusters enêtes sous forme numérique
    piles=[]

    #PHASE DE LECTURE BRUTE
    loop=True
    while loop: #on sort de la boucle sur exception
       try:  
          newline=next(f)
          newline=newline.rstrip('\n')
          newline=re.sub('/*$','',newline)#on retire les éventuels / en fin de ligne
          line=newline.split('/') #on crée un tableau avec les éléments séparés par /
          if len(newline)==0:
             line[:]=[]
             print('emptyline')
             continue
     
          if len(line) == 1:#Est-ce la première ligne ?
             cluster_names.append(line[0]) #on récupère le nom de cluster
             #on entame un nouvel empilage, on sauvegarde l'actuel
             clusters.append(piles) #la première pile sera retiré à la fin
             piles=[]
             continue
          
          piles.append(line)
              
       except:
          print('exception - last read line : '+newline)
          
          loop=False #on sort de boucle en fin de fichier

    clusters.append(piles) #on ajoute une grappe de piles
    del clusters[0]#on retire la pile vide en trop du début
    print (clusters)

    #PHASE DE TRANSFORMATION EN NUMÉRIQUE ET RETRAIT DES ENTÊTES
    cluster_vals=[] #pour stocker les valeurs numériques
    cluster_num_series=[]
    #cluster_origin=[]
    cluster_num_series=[]
    pile_vals=[]
    for pile in clusters:
       line_headers=[]
       pile_col_headers=[]
       pile_col_headers=[]
       pile_origin=""
       exist_line_headers=False
       num_series=0
       pile_vals=[]
       first_line=True
       for line in pile:
          line_vals=[]
    
          for v in line:
             try:
                 line_vals.append(float(v))           
             except:     
                #ce n'est pas un nombre
                if not(first_line):
                   line_headers.append(v) #on stocke l'entête de ligne           
                   exist_line_headers = True
    
             if first_line:
                pile_col_headers.append(v)
          
         first_line=False
         pile_vals.append(line_vals)
          num_series+=1
         
       cluster_num_series.append(num_series)
       del pile_vals[0]
       del pile_col_headers[0]
       cluster_row_headers.append(line_headers)
       cluster_col_headers.append(pile_col_headers)
       cluster_vals.append(pile_vals)
    
    #à utiliser pour un graphique en couleurs
    colors2=['aquamarine', 'beige', 'coral','cyan', 'fuchsia', 'green', 'indigo', 'lime','olive', 'navy','orange', 'pink']
     
    def makeStack(bx,vals,w,c,lw, hd,rh,title): #crée une grappe de séries empilées
        #bx starting point on x axis, vals values of lines, w bar width, c color palette,lw linewidth, hd entêtes, rh row_headers
       xra= range(len(vals[0]))
       cumul=[]
       graph=[] #
    
       for v in vals[0]:
          cumul.append(0)

       i=0
       for line in vals:
          graph.append(plt.bar([bx+x for x in xra],line,width=w,bottom=cumul,color=c[i*4 % 11],linewidth=1)) 
          i+=1
          index=0
          while index

Le résultat

Les commentaires dans le script doivent suffire à l'expliquer. Le résultat est le suivant :

clustrowstacked.jpeg