如何为Pandas生成的分组直方图添加图例和标题

16

我想绘制一个直方图,该直方图根据数据框中的另一个属性对多个属性进行分组。

借助于这个问题的帮助,我能够为绘图设置标题。是否有一种简单的方法可以为每个子图启用图例。

这是我的代码

import numpy as np
from numpy.random import randn,randint
import pandas as pd
from pandas import DataFrame
import pylab as pl

x=DataFrame(randn(100).reshape(20,5),columns=list('abcde'))
x['new']=pd.Series(randint(0,3,10))
x.hist(by='new')
pl.suptitle('hist by new')

在这里输入图片描述

1个回答

20

你几乎可以通过以下方式获得想要的内容:

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

我认为这可以满足你的需求:漂亮的直方图


更新 针对评论的回应(并且这个答案有几年历史了),我尝试将此答案简化到最简单的程度。可能现在已经有一种方法可以给groupby对象的绘图添加标签,但我不知道。

以下是最简单的方法:

axes = g.plot(kind='hist')
for i, (groupname, group) in enumerate(g):
    axes[i].set_title(groupname)

1
太棒了。所以,没有办法在不用真正的matplotlib api的情况下完成这个任务。这应该是pandas的限制,对吗? - vumaasha
我正在寻找直方图?如何将条形图转换为直方图? - vumaasha
2
我已经更新了答案,使用了直方图(使结果更加漂亮)。 - LondonRob
1
@LondonRob A. 我不是一个重度的Pandas用户,但我正在使用它来管理成绩册,并需要vumaasha的帮助。似乎现在,截至Pandas 0.20.3,这样的自动功能仍未实现。您是否知道这是否正确? - saintsfan342000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接