【问题标题】:Cumulative histogram plot from dataframe数据框的累积直方图
【发布时间】:2021-03-30 01:12:34
【问题描述】:

我们的目标是创建一个这样的情节

虚拟df:

columns = ['number_of_words', 'occurrences']
data = [[1, 2312252],
       [2,1000000],
       [3,800000],
        [4, 400000],
        [5, 100000],
        [6, 70000],
        [7, 40000],
        [8, 10000],
        [9, 4000],
        [10, 50]]
dummy_df = pd.DataFrame(columns=columns, data=data)

y 轴表示出现次数,x 轴表示来自 dummy_df 的单词列数。

x 轴应该是累积的,以便将值堆叠在一起。

示例:number_of_words = 1 我们有大约 230 万次出现。 number_of_words = 2 我们有大约 1m occurrences,因此它应该在 occurrences = 2 处绘制 2.3m + 1m。 在number_of_words 的最终条目处,直方图应达到总和(出现次数)。

我确实想要规范化它。

【问题讨论】:

  • 您想要 1 个小节,还是应该拆分以显示哪些部分对 cumsum 有贡献,就像您的插图中一样?
  • 分成几部分

标签: pandas dataframe matplotlib


【解决方案1】:

既然你已经计算出频率,只需将其累加即可:

dummy_df['acc'] = dummy_df.occurrences.cumsum()                                                                                                                                                                                       
ax = dummy_df['acc'].plot('bar', width=1, color='b')
dummy_df['acc'].shift().plot('bar', alpha=0.7, width=1, color='r', ax=ax)

【讨论】:

  • FWIW 我在两个图上添加了一种略有不同的方法。
【解决方案2】:

要将其拆分为多个部分,请绘制两次。第一个是正常的 cumsum,然后第二个只是值,移位的 cumsum 设置底部(这与之前绘制的 cumsum 的顶部重叠)。

在绘图前使用.iloc[1:] 对系列进行切片会删除您要排除的第一个条形。

fig, ax = plt.subplots()

df['occurrences'].cumsum().iloc[1:].plot(kind='bar', width=1, ec='k', ax=ax)
df['occurrences'].iloc[1:].plot(kind='bar', width=1, ec='k', 
                       bottom=df['occurrences'].cumsum().shift().fillna(0).iloc[1:], ax=ax, color='red')

plt.show()

【讨论】:

  • 太好了,谢谢!如何在 0 处跳过第一个小节? ax.set_xlim(1, ) 似乎不起作用
  • 谢谢,工作。现在 1 处的下半部分是红色,上半部分是蓝色。有机会摆脱第一列中的红色吗?
  • @Exa 查看更新,我没有这个问题。也许您将.iloc[1:] 添加到了错误的位置?
  • 确实!感谢更新。如果我没记错的话,更新后的图现在已经显示出现次数 = 1,出现次数 = 2 时应该是什么,对吧?我希望出现次数 = 1 约为 2.3m,因此不应该有任何红条。
猜你喜欢
  • 1970-01-01
  • 2013-08-23
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2018-10-25
相关资源
最近更新 更多