Bagaimana cara menambahkan Error Bar ke plot garis Matplotlib?
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
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
);