具有堆叠组件的直方图

时间:2014-03-06 13:44:33

标签: python matplotlib pandas seaborn

假设我有一个我过去90天每天测量的值。我想绘制值的直方图,但我希望观察者能够轻松查看测量在过去90天的某些非重叠子集上累积的位置。我想通过将直方图的每个条“细分”成块来实现这一点。最早观察的一个块,一个用于最近的观察,一个用于最近的观察。

这听起来像是df.plot(kind='bar', stacked=True)的工作,但我无法正确掌握细节。

这是我到目前为止所拥有的:

import numpy as np
import pandas as pd
import seaborn as sbn

np.random.seed(0)

data = pd.DataFrame({'values': np.random.randn(90)})
data['bin'] = pd.cut(data['values'], 15, labels=False)
forhist = pd.DataFrame({'first70': data[:70].groupby('bin').count()['bin'],
                         'next15': data[70:85].groupby('bin').count()['bin'],
                         'last5': data[85:].groupby('bin').count()['bin']})

forhist.plot(kind='bar', stacked=True)

这让我:

poor result

此图表有一些缺点:

  • 条形码以错误的顺序堆叠。 last5应排在最前面,next15位于中间位置。即它们应按forhist中列的顺序堆叠。
  • 栏之间有水平空间
  • x轴标有整数,而不是指示箱所代表的值的东西。我的“第一选择”是将x轴标记为与我刚刚运行data['values'].hist()时完全相同的标记。我的“第二选择”是将x轴标记为“bin名称”,如果我pd.cut(data['values'], 15),我会得到。在我的代码中,我使用labels=False,因为如果我不这样做,它会使用bin边缘标签(作为字符串)作为条形标签,并且它将按字母顺序放置这些,使图形基本没用。

最好的方法是什么?到目前为止,我觉得我正在使用非常笨拙的功能。

1 个答案:

答案 0 :(得分:7)

好的,这是攻击它的一种方法,使用matplotlib hist函数本身的功能:

fig, ax = plt.subplots(1, 1, figsize=(9, 5))
ax.hist([data.ix[low:high, 'values'] for low, high in [(0, 70), (70, 85), (85, 90)]],
         bins=15,
         stacked=True,
         rwidth=1.0,
         label=['first70', 'next15', 'last5'])
ax.legend()

给出了:

better