1

给定这个数据框:

xlabel = list('xxxxxxyyyyyyzzzzzz')
fill= list('abc'*6)
val = np.random.rand(18)
df = pd.DataFrame({ 'xlabel':xlabel, 'fill':fill, 'val':val})

这就是我的目标: http: //matplotlib.org/mpl_examples/pylab_examples/barchart_demo.png

应用于我的示例,Group将是xy并且zGender将是ab并且c,并且Scores将是val

我知道在 pandas 中,与 matplotlib 的绘图集成仍在进行中,所以可以直接在 matplotlib 中进行吗?

4

2 回答 2

2

这是你想要的吗?

df.groupby(['fill', 'xlabel']).mean().unstack().plot(kind='bar')

或者

df.pivot_table(rows='fill', cols='xlabel', values='val').plot(kind='bar')

您可以将其分开并摆弄标签、列和标题,但我认为这基本上可以为您提供您想要的情节。

对于当前的错误栏,您必须直接转到 mpl。

mean_df = df.pivot_table(rows='fill', cols='xlabel',
                         values='val', aggfunc='mean')
err_df = df.pivot_table(rows='fill', cols='xlabel',
                        values='val', aggfunc='std')

rows = len(mean_df)
cols = len(mean_df.columns)
ind = np.arange(rows)
width = 0.8 / cols
colors = 'grb'

fig, ax = plt.subplots()
for i, col in enumerate(mean_df.columns):
    ax.bar(ind + i * width, mean_df[col], width=width,
           color=colors[i], yerr=err_df[col], label=col)

ax.set_xticks(ind + cols / 2.0 * width)
ax.set_xticklabels(mean_df.index)
ax.legend()

但是会有一个增强,可能在 0.13:issue 3796

于 2013-09-03T18:26:40.427 回答
1

这是我找到的显示错误栏的唯一解决方案:

means = df.groupby(['fill', 'xlabel']).mean().unstack()
x_mean,y_mean,z_mean = means.val.x, means.val.y,means.val.z

sems = df.groupby(['fill','xlabel']).aggregate(stats.sem).unstack()
x_sem,y_sem,z_sem = sems.val.x, sems.val.y,sems.val.z

ind = np.array([0,1.5,3])
fig, ax = plt.subplots()
width = 0.35
bar_x = ax.bar(ind, x_mean, width, color='r', yerr=x_sem, ecolor='r')
bar_y = ax.bar(ind+width, y_mean, width, color='g', yerr=y_sem, ecolor='g')
bar_z = ax.bar(ind+width*2, z_mean, width, color='b', yerr=z_sem, ecolor='b')

ax.legend((bar_x[0], bar_y[0], bar_z[0]), ('X','Y','Z'))

不过,我很高兴看到一种更简洁的方法来解决这个问题,可能是 Viktor Kerkez 答案的扩展。

于 2013-09-05T17:59:47.080 回答