2015-02-09 71 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