【问题标题】:Multiple Pandas DataFrame Bar charts on the same chart同一图表上的多个 Pandas DataFrame 条形图
【发布时间】:2017-02-28 03:52:38
【问题描述】:

如何在同一张图表上绘制多个 DataFrame 条形图?

我想绘制前三名(或前五名)的分数。因为我知道 1st >= 2nd >= 3rd,所以我想将图表中的前三个(或五个)绘制在同一个柱上,而不是将它们分散在三个(或五个)柱上。

视觉效果将与堆叠的条形图完全相同,但条形图并非相互堆叠,而是从底部开始测量。

更新: @DizietAsahi 建议改用堆叠条。我想这是最简单的解决方案。有人可以提供数据框操作代码来获得以下分数的差异吗?

源数据为TIDScore的形式,就像下面的CSV格式的数据一样,已经被过滤掉了,只剩下前3名。对于相同的 TID,原始数据的分数要高得多。这样做的挑战在于,我还需要绘制 MEAN 分数以及前三名。即,我个人认为不可能同时操纵 MEAN 得分和前三名来获得下面的差异。所以任何一种方式都有挑战(对我来说)。

这是一个 CSV 格式的示例数据:

TID,Score
06,510
06,472
06,441
07,630
07,619
07,574
08,617
08,589
08,560
09,610
09,595
09,553
10,593
10,550
10,542
11,442
11,404
11,381

DataFrame 格式(仅适用于多个 DataFrame 条形图的情况。对于使用堆积条形图,为每个 TID 生成一堆随机数作为 Score 就可以了):

Scores = [
{"TID":07,"ScoreRank":1,"Score":834,"Average":690},
{"TID":07,"ScoreRank":2,"Score":820,"Average":690},
{"TID":07,"ScoreRank":3,"Score":788,"Average":690},
{"TID":08,"ScoreRank":1,"Score":617,"Average":571},
{"TID":08,"ScoreRank":2,"Score":610,"Average":571},
{"TID":08,"ScoreRank":3,"Score":600,"Average":571},
{"TID":09,"ScoreRank":1,"Score":650,"Average":584},
{"TID":09,"ScoreRank":2,"Score":644,"Average":584},
{"TID":09,"ScoreRank":3,"Score":618,"Average":584},
{"TID":10,"ScoreRank":1,"Score":632,"Average":547},
{"TID":10,"ScoreRank":2,"Score":593,"Average":547},
{"TID":10,"ScoreRank":3,"Score":577,"Average":547},
{"TID":11,"ScoreRank":1,"Score":479,"Average":409},
{"TID":11,"ScoreRank":2,"Score":445,"Average":409},
{"TID":11,"ScoreRank":3,"Score":442,"Average":409},
{"TID":12,"ScoreRank":1,"Score":370,"Average":299},
{"TID":12,"ScoreRank":2,"Score":349,"Average":299},
{"TID":12,"ScoreRank":3,"Score":341,"Average":299},
{"TID":13,"ScoreRank":1,"Score":342,"Average":252},
{"TID":13,"ScoreRank":2,"Score":318,"Average":252},
{"TID":13,"ScoreRank":3,"Score":286,"Average":252},
{"TID":14,"ScoreRank":1,"Score":303,"Average":257},
{"TID":14,"ScoreRank":2,"Score":292,"Average":257},
{"TID":14,"ScoreRank":3,"Score":288,"Average":257},
{"TID":15,"ScoreRank":1,"Score":312,"Average":242},
{"TID":15,"ScoreRank":2,"Score":276,"Average":242},
{"TID":15,"ScoreRank":3,"Score":264,"Average":242},
{"TID":16,"ScoreRank":1,"Score":421,"Average":369},
{"TID":16,"ScoreRank":2,"Score":403,"Average":369},
{"TID":16,"ScoreRank":3,"Score":398,"Average":369},
{"TID":17,"ScoreRank":1,"Score":479,"Average":418},
{"TID":17,"ScoreRank":2,"Score":466,"Average":418},
{"TID":17,"ScoreRank":3,"Score":455,"Average":418},
{"TID":18,"ScoreRank":1,"Score":554,"Average":463},
{"TID":18,"ScoreRank":2,"Score":521,"Average":463},
{"TID":18,"ScoreRank":3,"Score":520,"Average":463}]
df = pandas.DataFrame(Scores)

谢谢

【问题讨论】:

  • 能否提供一个示例数据框?
  • @ShivamGaur,CSV 中的示例数据以及数据框格式现在可用。谢谢。
  • 只需做一个堆积图,计算每个级别作为以下分数的差异
  • @DizietAsahi,是的,我想这是最简单的解决方案。您能否提供数据框操作代码来获得以下分数的差异?我可以接受这个作为答案。谢谢。

标签: python matplotlib dataframe charts bar-chart


【解决方案1】:

这就是你要找的吗?

import pandas
import matplotlib.pyplot as plt
import numpy as np
Scores = [
{"TID":7,"ScoreRank":1,"Score":834,"Average":690},
{"TID":7,"ScoreRank":2,"Score":820,"Average":690},
{"TID":7,"ScoreRank":3,"Score":788,"Average":690},
{"TID":8,"ScoreRank":1,"Score":617,"Average":571},
{"TID":8,"ScoreRank":2,"Score":610,"Average":571},
{"TID":8,"ScoreRank":3,"Score":600,"Average":571},
{"TID":9,"ScoreRank":1,"Score":650,"Average":584},
{"TID":9,"ScoreRank":2,"Score":644,"Average":584},
{"TID":9,"ScoreRank":3,"Score":618,"Average":584},
{"TID":10,"ScoreRank":1,"Score":632,"Average":547},
{"TID":10,"ScoreRank":2,"Score":593,"Average":547},
{"TID":10,"ScoreRank":3,"Score":577,"Average":547},
{"TID":11,"ScoreRank":1,"Score":479,"Average":409},
{"TID":11,"ScoreRank":2,"Score":445,"Average":409},
{"TID":11,"ScoreRank":3,"Score":442,"Average":409},
{"TID":12,"ScoreRank":1,"Score":370,"Average":299},
{"TID":12,"ScoreRank":2,"Score":349,"Average":299},
{"TID":12,"ScoreRank":3,"Score":341,"Average":299},
{"TID":13,"ScoreRank":1,"Score":342,"Average":252},
{"TID":13,"ScoreRank":2,"Score":318,"Average":252},
{"TID":13,"ScoreRank":3,"Score":286,"Average":252},
{"TID":14,"ScoreRank":1,"Score":303,"Average":257},
{"TID":14,"ScoreRank":2,"Score":292,"Average":257},
{"TID":14,"ScoreRank":3,"Score":288,"Average":257},
{"TID":15,"ScoreRank":1,"Score":312,"Average":242},
{"TID":15,"ScoreRank":2,"Score":276,"Average":242},
{"TID":15,"ScoreRank":3,"Score":264,"Average":242},
{"TID":16,"ScoreRank":1,"Score":421,"Average":369},
{"TID":16,"ScoreRank":2,"Score":403,"Average":369},
{"TID":16,"ScoreRank":3,"Score":398,"Average":369},
{"TID":17,"ScoreRank":1,"Score":479,"Average":418},
{"TID":17,"ScoreRank":2,"Score":466,"Average":418},
{"TID":17,"ScoreRank":3,"Score":455,"Average":418},
{"TID":18,"ScoreRank":1,"Score":554,"Average":463},
{"TID":18,"ScoreRank":2,"Score":521,"Average":463},
{"TID":18,"ScoreRank":3,"Score":520,"Average":463}]

df = pandas.DataFrame(Scores)
f, ax1 = plt.subplots(1, figsize=(10,5))
bar_width = 0.75
bar_l = [i+1 for i in range(len(np.unique(df['TID'])))]
tick_pos = [i+(bar_width/2) for i in bar_l]
ax1.bar(bar_l,
        df['Score'][df['ScoreRank'] == 1],
        width=bar_width,
        label='Rank1',
        alpha=0.5,
        color='#eaff0a')

ax1.bar(bar_l,

        df['Score'][df['ScoreRank'] == 2],
        width=bar_width,
        label='Rank2',
        alpha=0.5,
        color='#939393')

ax1.bar(bar_l,
        df['Score'][df['ScoreRank'] == 3],
        width=bar_width,
        label='Rank3',
        alpha=0.5,
        color='#e29024')

ax1.bar(bar_l,
        df['Average'][df['ScoreRank'] == 3],
        width=bar_width,
        label='Average',
        alpha=0.5,
        color='#FF0000')

plt.xticks(tick_pos, np.unique(df['TID']))
ax1.set_ylabel("Score")
ax1.set_xlabel("TID")
plt.legend(loc='upper right')
plt.xlim([min(tick_pos)-bar_width, max(tick_pos)+bar_width])
plt.show()

结果:

【讨论】:

  • 绝对!非常感谢尤吉!!你介意把平均值也放在图表中吗?和ax1.bar(bar_l, df['Average'][df['ScoreRank'] == 1],一样简单吗?谢谢
  • 哇,我试图自己修复它,在我复制粘贴代码后,我注意到平均值已经在图表中,然后我在这里查看. 哇! 谢谢!!
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2016-12-01
  • 2014-01-18
  • 1970-01-01
  • 2020-09-18
  • 2018-06-04
相关资源
最近更新 更多