Comment ajouter une barre d'erreur au tracé de ligne Matplotlib?

Oct 10 2020

J'ai le jeu de données suivant que j'utilise pour tracer un graphique linéaire. Le graphique est obtenu en tant que meanvaleurs obtenues à partir des données. Je veux ajouter des barres d'erreur à ce graphique qui montrera l'écart type. J'ai recherché différentes réponses, mais dans la plupart d'entre elles, elles avaient défini xet yexplicitement, mais ici je calcule l'intrigue directement à partir du dataframe. Comment ajouter une barre d'erreur à ce tracé?

Dataframe df

UserId     |   date                 |-7|-6|-5|-4|-3|-2|-1|0 |1 |2 |3 |4 |5 |6 |7
     1      2009-10-17 17:38:32.590 |0 |0 |0 |0 |0 |0 |1 |0 |1 |0 |0 |0 |0 |0 |0  
     2      2009-10-19 00:37:23.067 |0 |0 |0 |0 |0 |1 |1 |0 |1 |0 |0 |0 |0 |0 |0    
     3      2009-10-20 08:37:14.143 |0 |0 |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 |0 |0 
     4      2009-10-21 18:07:51.247 |0 |0 |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 |0 |0 
     5      2009-10-22 21:25:24.483 |0 |0 |0 |0 |0 |0 |1 |0 |0 |0 |0 |0 |0 |0 |0

Code

badges = ["A", "B", "C"]

for badge in badges:
  res.iloc[:,2:].mean().plot(kind='line', label = badge)

Production

EDIT (Tracer pour un seul graphique avec écart type)

res.iloc[:,2:].mean().plot(kind='line', label = 'A')
plt.errorbar(x = res.columns.values[:-1], y = res.iloc[:,2:].mean(),yerr = res.iloc[:,2:].std())

L'exécution de ce code produit l'erreur suivante:

TypeError: 'value' must be an instance of str or bytes, not a int

Réponses

gherka Oct 10 2020 at 17:50

Si vous souhaitez créer vos lignes et vos barres d'erreur dans la boucle, vous pouvez utiliser le plt.errorbar()comme d'habitude à l'intérieur de la boucle, mais l'utilisation seabornest beaucoup plus facile si vous pouvez obtenir vos données dans le format approprié.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.concat([
    pd.DataFrame(np.random.randint(0,2, (5, 14))).assign(badge="A"),
    pd.DataFrame(np.random.randint(0,2, (5, 14))).assign(badge="B"),
])

plt.figure(figsize=(10, 5))

badges = ["A", "B"]
colors = ["teal", "firebrick"]

for i, badge in enumerate(badges):
    
    sub_df = df[df["badge"]==badge]
    
    sub_df.iloc[:,:-1].mean().plot(kind='line', label=badge, color=colors[i])

    plt.errorbar(
        sub_df.columns.values[:-1] + (i*0.1), # offset the second error bar a bit
        sub_df.iloc[:,:-1].mean(),
        yerr=sub_df.iloc[:,:-1].std(),
        fmt='|', ecolor='grey', elinewidth=1
    );