基于多索引熊猫数据框的matplotlib绘制错误栏

问题描述

我在熊猫中有以下数据框:

>>>name   Hour   trt_level    stress   date          value
0  D43    9         H         control  2019-06-07    0.4561
1  D43    10        H         control  2019-06-07    0.3216
2  D42    8         M         stress   2019-06-07    0.2143
3  D42    9         M         stress   2019-06-07    0.1342
4  D21    8         L         stress   2019-06-07    0.3214
...

我想使用mse / std创建带有误差线的折线图,如下所示:

enter image description here

在我的情况下,来自:https://matplotlib.org/1.2.1/examples/pylab_examples/errorbar_demo.htmlbut

:X轴应该是小时,y轴应该是值,并且三行,每级治疗(trt_level)一条,H,M,L一行。

为此,我使用了groupby和agg函数

data = df.groupby(['trt_level','Hour']).agg([np.mean,np.std])
data.head()

>>>                value
                   mean      std
trt_level  Hour   
H           7      0.231      0.0058
            8      0.212      0.0094
            9      0.431      0.1154
...


其中以treamtnet和hour作为索引以及值的均值和std的gav eme数据库, 但是问题是当我尝试绘制它时,我只得到一行,而顶部没有std:

data = data['value'] 
qual.plot(kind = "line",y = "mean",legend = False,xerr = "std",title = "test",color='green')

enter image description here

当我想要的结果应该在std顶部有三行时(最好是MES而不是std,但对于这个问题,我将重点更多地放在三行和std的显示上)

我的最终目标是获得更像这样的图表(对不起,抽奖很抱歉):

enter image description here

但持续所有时间

解决方法

附近。您必须拆开多索引数据框。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

#My test file contained at least two values per condition to calculate an SD value
#df = pd.read_csv("test.txt",sep = "\s{2,}") 

dfm = df.groupby(["trt_level","Hour"]).agg([np.mean,np.std])

dfm["value"].unstack(level=0).plot(y = "mean",yerr = "std",title = "TRT levels are really important!",color = list("rbg"))

plt.show()

样本输出

enter image description here

BTW:不必指定kind="line",它是默认值。大熊猫文档列出了所有possible keywords for kind.