Matplotlib लाइन प्लॉट में Error Bar कैसे जोड़ें?

Oct 10 2020

मेरे पास निम्नलिखित डेटासेट हैं जिनका उपयोग मैं एक लाइन प्लॉट करने के लिए करता हूं। कथानक को meanडेटा से प्राप्त मूल्यों के रूप में प्राप्त किया जाता है । मैं इस भूखंड में त्रुटि सलाखों को जोड़ना चाहता हूं जो मानक विचलन दिखाएगा। मैं अलग जवाब करने के लिए ध्यान दिया है लेकिन उनमें से ज्यादातर में वे परिभाषित किया था xऔर yस्पष्ट रूप से, लेकिन यहाँ मैं dataframe से सीधे साजिश की गणना। इस प्लॉट में एरर बार कैसे जोड़ें?

डेटाफ्रेम डीएफ

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

कोड

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

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

उत्पादन

EDIT (मानक विचलन के साथ केवल एक ग्राफ के लिए प्लॉट)

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

इस कोड को निष्पादित करने से निम्नलिखित त्रुटि उत्पन्न होती है:

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

जवाब

gherka Oct 10 2020 at 17:50

यदि आप लूप में अपनी लाइनें और त्रुटि बार बनाना चाहते हैं, तो आप लूप के plt.errorbar()अंदर सामान्य का उपयोग कर सकते हैं , लेकिन seabornयदि आप अपने डेटा को उचित प्रारूप में प्राप्त कर सकते हैं, तो इसका उपयोग करना बहुत आसान है।

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