【问题标题】:How to add Error Bar to Matplotlib line plot如何将误差线添加到 Matplotlib 线图
【发布时间】:2021-01-25 07:27:01
【问题描述】:

我有以下数据集,用于绘制线图。该图是作为从数据中获得的值的mean 获得的。我想在该图中添加误差线,以显示标准偏差。我查看了不同的答案,但在大多数答案中,他们明确定义了xy,但在这里我直接从数据框中计算图。如何在该图中添加误差线?

数据框 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

代码

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

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

输出

编辑(仅绘制一个具有标准偏差的图)

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

【问题讨论】:

  • @Roim 在这种情况下,我必须明确指定什么是 x 和什么是 y,这在我的情况下是不可能的,从代码本身可以看出。能不能借助代码演示一下?

标签: python dataframe matplotlib seaborn data-visualization


【解决方案1】:

如果您想在循环中创建行和错误栏,您可以在循环中正常使用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
    );

【讨论】:

  • 考虑到我没有使用循环并仅绘制 1 个图形,如果我为错误栏 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。如何解决这个问题?
  • 您的示例代码显示了一个循环。您可以对其进行编辑以显示您遇到的问题的可重现示例吗?
  • 我在最后添加了EDIT,请看一下。
  • 当我在循环外运行我的答案中的代码时,我没有得到同样的错误。请参阅here 我所说的可重现示例的意思。
猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 2014-12-02
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
相关资源
最近更新 更多