用多索引数据帧绘制非对称误差线

2024-09-30 08:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用熊猫数据帧.plot(kind='bar')函数,用于在MxN数据帧中有多个索引时添加错误条。在

根据documentation,这可以通过为yerr参数提供一个Mx2xN数组来实现,但是我没有幸为这个参数使用DataFrame。当然,对于误差条使用一个DataFrame(与数据的形状相同,但是有两个列表示上限和下限)将非常方便,因为它允许索引本身与数据匹配。在

目前,我只能通过使用newaxis和append这两个相当残酷的工具将高/低边界的列敲入Mx2xN numpy数组,才能让它正常工作。这充满了错误,语法也很难看,所以我的问题是:有没有更好的方法来完成我正在尝试的操作,而不必像我在这里所做的那样将数据帧敲入数组?在

要绘制的数据帧(在post底部生成的代码):

> print data
       errlo    errhi     mean     
letter     a  b     a   b    a    b
word                               
bar        7  5    12  11  9.5  8.0
foo        5  6    11   9  8.0  7.5

所需标绘代码:

^{pr2}$

实际绘图代码-这是我希望可以改进的地方:

> errlo     = data['mean'] - data['errlo']
> errhi     = data['errhi'] - data['mean']
> errlo_arr = errlo.values[:,np.newaxis,:]
> errhi_arr = errhi.values[:,np.newaxis,:]
> yerr      = np.append(errlo_arr, errhi_arr, axis=1).T
> data['mean'].plot(kind='bar', yerr=yerr)

期望输出: Bar plot of dataframe with multi-indexed columns, with error bars

生成数据帧的代码:

> ix3 = pd.MultiIndex.from_arrays([['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], ['foo', 'foo', 'bar', 'bar', 'foo', 'foo', 'bar', 'bar']], names=['letter', 'word'])
> df3 = pd.DataFrame({'data1': [3, 2, 4, 3, 2, 4, 3, 2], 'data2': [6, 5, 7, 5, 4, 5, 6, 5]}, index=ix3)
> df=df3.groupby(level=['letter','word']).sum()
> df.columns=['errlo','errhi']
> df['mean']=df.mean(axis='columns')
> data=df.unstack(level='letter')
> print data
       errlo    errhi     mean     
letter     a  b     a   b    a    b
word                               
bar        7  5    12  11  9.5  8.0
foo        5  6    11   9  8.0  7.5

Tags: 数据代码dataframedfdatafoobar数组
1条回答
网友
1楼 · 发布于 2024-09-30 08:29:32

您可以直接使用列,并通过执行以下操作来避免numpy代码:

#assuming your initial frame
df =df3.groupby(level=['letter','word']).sum()
df.columns=['errlo','errhi']
df['mean']=df.mean(axis='columns')


df['errlo']  = df['mean'] - df['errlo']
df['errhi']  = df['errhi'] - df['mean']

data=df.unstack(level='letter')

data['mean'].plot(kind='bar', yerr=data[['errlo','errhi']].T.values)

退货:

enter image description here

相关问题 更多 >

    热门问题