Python 使用多索引数据帧绘制非对称错误条

Python 使用多索引数据帧绘制非对称错误条,python,pandas,plot,Python,Pandas,Plot,我试图使用pandas DataFrame.plot(kind='bar')函数在MxN数据帧中具有多索引时添加错误条 根据,通过为yerr参数提供一个Mx2xN数组,这是可能的,但是我没有运气为这个参数使用数据帧。为错误条使用数据框(与数据形状相同,但有两列表示上限和下限)当然非常方便,因为它允许索引本身与数据匹配 目前,我只能通过使用newaxis和append这两个相当残酷的工具将高/低边界的列强行插入Mx2xN numpy数组来实现它。这充满了错误,而且语法难看,所以我的问题是:有没有更

我试图使用pandas DataFrame.plot(kind='bar')函数在MxN数据帧中具有多索引时添加错误条

根据,通过为
yerr
参数提供一个Mx2xN数组,这是可能的,但是我没有运气为这个参数使用数据帧。为错误条使用数据框(与数据形状相同,但有两列表示上限和下限)当然非常方便,因为它允许索引本身与数据匹配

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

要打印的数据帧(要在文章底部生成的代码):

所需打印代码:

> data['mean'].plot(kind='bar', yerr=data['errlo','errhi'])
实际绘图代码-这是我希望可以改进的代码:

> 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)
期望输出:

生成数据帧的代码:

> 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

您可以直接使用这些列,并通过以下操作避免使用
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)
返回:

#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)