问题描述
我在熊猫中有以下数据框:
>>>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创建带有误差线的折线图,如下所示:
在我的情况下,来自: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')
当我想要的结果应该在std顶部有三行时(最好是MES而不是std,但对于这个问题,我将重点更多地放在三行和std的显示上)
我的最终目标是获得更像这样的图表(对不起,抽奖很抱歉):
但持续所有时间
解决方法
附近。您必须拆开多索引数据框。
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()
样本输出
BTW:不必指定kind="line"
,它是默认值。大熊猫文档列出了所有possible keywords for kind
.