【发布时间】:2014-04-09 04:48:40
【问题描述】:
假设我有一个过去 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)
这给了我:
这个图有一些缺点:
- 条形图的堆叠顺序错误。
last5应该在顶部,next15在中间。 IE。它们应该按照forhist中的列顺序堆叠。 - 条之间有水平空间
- x 轴标有整数,而不是表示 bin 所代表的值。我的“第一选择”是将 x 轴标记为与我刚刚运行
data['values'].hist()时完全相同的标签。我的“第二选择”是让 x 轴标有“bin 名称”,如果我这样做了pd.cut(data['values'], 15)。在我的代码中,我使用了labels=False,因为如果我不这样做,它将使用 bin 边缘标签(作为字符串)作为条形标签,并且它会将这些按字母顺序排列,从而使图表基本上没用.
解决这个问题的最佳方法是什么?到目前为止,我觉得我正在使用非常笨拙的功能。
【问题讨论】:
标签: python matplotlib pandas seaborn