Bagaimana cara menambahkan Error Bar ke plot garis Matplotlib?

Oct 10 2020

Saya memiliki dataset berikut yang saya gunakan untuk memplot plot garis. Plot diperoleh sebagai meannilai yang diperoleh dari data. Saya ingin menambahkan bilah kesalahan ke plot ini yang akan menunjukkan deviasi standar. Saya telah mencari jawaban yang berbeda tetapi di sebagian besar jawaban telah ditentukan xdan ysecara eksplisit, tetapi di sini saya menghitung plot langsung dari kerangka data. Bagaimana cara menambahkan bilah kesalahan ke plot ini?

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

Kode

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

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

Keluaran

EDIT (Plot hanya untuk satu grafik dengan Standar Deviasi)

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())

Menjalankan kode ini menghasilkan kesalahan berikut:

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

Jawaban

gherka Oct 10 2020 at 17:50

Jika Anda ingin membuat garis & bilah kesalahan dalam perulangan, Anda dapat menggunakan plt.errorbar()seperti biasa di dalam perulangan, tetapi menggunakannya seabornjauh lebih mudah jika Anda bisa mendapatkan data Anda dalam format yang sesuai.

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
    );