Comment ajouter une barre d'erreur au tracé de ligne Matplotlib?
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
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
);