堆叠组件的直方图

发布于 2021-01-29 15:57:21

假设我有一个过去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中间。也就是说,它们应按中的列顺序堆叠forhist
  • 条之间有水平空间
  • x轴标有整数,而不是表示垃圾箱表示的值的东西。我的“第一选择”是将x轴标记为与刚运行时完全相同的标记data['values'].hist()。我的“第二选择”是将x轴标记为如果我这样做会得到的“ bin名称” pd.cut(data['values'], 15)。在我的代码中,我labels=False之所以使用它是因为,如果不这样做,它将使用bin边缘标签(作为字符串)作为条形标签,并且会将它们按字母顺序放置,从而使该图基本无用。

解决此问题的最佳方法是什么?到目前为止,我感觉自己在使用非常笨拙的功能。

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    好的,这是一种使用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()
    

    这使:

    更好



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看