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

vum*_*sha 11 matplotlib pandas

我试图绘制由另一个属性分组的多个属性的直方图,所有属性都在数据框中.

在这个问题的帮助下,我能够为情节设定标题.是否有一种简单的方法可以为每个子图切换图例.

这是我的代码

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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Lon*_*Rob 11

几乎可以通过这样做获得你想要的东西:

g.plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

但它每组产生一个图(并没有在组之后命名图,所以它有点无用的IMO.)

这里的东西看起来很漂亮,但确实涉及很多"手工" 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()
Run Code Online (Sandbox Code Playgroud)

我认为这给你你想要的东西: 美丽的直方图


更新 响应评论(并且这个答案已经有几年了)我试图将这个答案剥离到最简单的骨头.有可能现在是标签地块的方式groupby对象,但我不知道它.

这是最简单的方法:

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

  • 我已经更新了使用直方图的答案(并使结果更漂亮.) (2认同)