2015-02-09 76 views
0

我正准备在R的ggplot2中绘制一个带有误差线的熊猫数据框,这需要计算列的统计量。错误栏需要最小值(平均值 - 标准开发)和最大值(平均值+标准开发)。我得到这些使用GROUPBY/AGG:准备带有误差线的绘图的熊猫数据帧

import pandas 
import numpy as np 

df = pandas.DataFrame({"id": ["a", "b", "c", "d"], 
         "exp": [10, 20, 30, 40], 
         "res1": [11, 22, 35, 42], 
         "res2": [9, 19, 32, 40], 
         "res3": [10.5, 20.8, 34, 48]}) 
# melt dataframe 
m = pandas.melt(df, id_vars=["id", "exp"]) 
# get mean/std 
summary = m.groupby("exp").agg([np.mean, np.std]) 
# add min and max under "value" 
summary[("value", "min")] = summary[("value", "mean")] - summary[("value", "std")] 
summary[("value", "max")] = summary[("value", "mean")] + summary[("value", "std")] 

然后有R绘制如下:

# plot with R 
p = ggplot2.ggplot(m) + \ 
    ggplot2.geom_point(aes_string(x="exp", y="value", colour="variable"), data=m) 
    ggplot2.geom_errorbar(aes_string(x="exp", y="mean", ymin="min", ymax="max"), data=summary) 

有没有一种方法,以简化的“最小” /“最大”列中的计算,因为它是这种常见操作?是否需要创建单独的数据框(上面的“摘要”),还是有一种将相同信息放入原始融化数据框的优雅方法?

groupby返回一个分级索引的数据框,所以我把“mean”和“std”放在“value”下似乎太复杂了。

回答

1

尝试执行相同的操作,而不使用numpy .agg函数,并使用Pandas中的.mean()和.std()函数。

import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({"id": ["a", "b", "c", "d"], 
        "exp": [10, 20, 30, 40], 
        "res1": [11, 22, 35, 42], 
        "res2": [9, 19, 32, 40], 
        "res3": [10.5, 20.8, 34, 48]}) 

m = pd.melt(df, id_vars=["id", "exp"]) 

mean = m.groupby("exp").mean() 

errors = m.groupby("exp").std() 

fig, ax = plt.subplots() 
mean.plot(yerr=errors, kind='bar') 

你应该得到以下结果: enter image description here

+1

是否有一个相当于''mean.plot(yerr =错误,那种= '酒吧')''在ggplot? – user248237dfsf 2015-02-09 22:22:53

+0

您是使用rpy2加载数据帧还是在将数据加载到R之前将数据帧保存为某种其他格式? – andrewwowens 2015-02-10 15:09:26

+0

此外,这里是错误与ggplot2绘图后不错的帖子 - http://docs.ggplot2.org/0.9.3.1/geom_errorbar.html – andrewwowens 2015-02-20 22:06:00