簡體   English   中英

同一張圖表上有多個Pandas DataFrame條形圖

[英]Multiple Pandas DataFrame Bar charts on the same chart

如何在同一圖表上繪制多個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)

謝謝

這是你想要的?

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()

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM