假设我有一个过去 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](https://i.stack.imgur.com/8mse5.png)
该图有一些缺点:
- 条形图的堆叠顺序错误。
last5
应该在顶部并且next15
在中间。 IE。它们应该按照列的顺序堆叠forhist
.
- 条之间有水平空间
- x 轴用整数标记,而不是指示 bin 代表的值。我的“第一选择”是将 x 轴标记为与我刚刚运行时完全相同的标记
data['values'].hist()
。我的“第二选择”是在 x 轴上标上“bin 名称”,如果我这样做的话,我会得到pd.cut(data['values'], 15)
。在我的代码中,我使用了labels=False
因为如果我不这样做,它就会使用 bin 边缘标签(作为字符串)作为条形标签,并且会将它们按字母顺序排列,从而使图表基本上毫无用处。
解决这个问题的最佳方法是什么?我觉得到目前为止我使用的功能非常笨拙。
好的,这是攻击它的一种方法,使用来自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](https://i.stack.imgur.com/It0Ld.png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)