你几乎可以通过以下方式获得想要的内容:
g.plot(kind='bar')
但它会为每个组生成一个图(而且不会以组名命名图表,所以我认为有点没用)。
这里有一个看起来相当漂亮的东西,但确实涉及相当多的“手动”matplotlib
工作,每个人都想避免,但没有人可以做到:
import numpy.random as rnd
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
x = pd.DataFrame(rnd.randn(100).reshape(20, 5), columns=list('abcde'))
group_col = 'groups'
groups = ['foo', 'bar', 'baz']
x[group_col] = pd.Series(rnd.choice(groups, len(x)))
g = x.groupby(group_col)
num_groups = g.ngroups
fig, axes = plt.subplots(num_groups)
for i, (k, group) in enumerate(g):
ax = axes[i]
ax.set_title(k)
group = group[[c for c in group.columns if c != group_col]]
num_columns = len(group.columns)
colours = cm.Spectral([float(x) / num_columns for x in range(num_columns)])
ax.hist(group.values, 5, histtype='bar',
label=list(group.columns), color=colours,
linewidth=1, edgecolor='white')
ax.legend()
plt.show()
我认为这可以满足你的需求:![漂亮的直方图](https://istack.dev59.com/T5XCf.webp)
更新
针对评论的回应(并且这个答案有几年历史了),我尝试将此答案简化到最简单的程度。可能现在已经有一种方法可以给
groupby
对象的绘图添加标签,但我不知道。
以下是最简单的方法:
axes = g.plot(kind='hist')
for i, (groupname, group) in enumerate(g):
axes[i].set_title(groupname)