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