2016-10-18 3 views
0

Как построить несколько диаграмм DataFrame на одной диаграмме?Несколько диаграмм DataFrame Pandas на одном графике

Я хочу построить три верхние оценки (или первую пятерку). Поскольку я знаю 1st> = 2nd> = 3rd, я хочу отобразить первую тройку (или пять) в диаграмме на одной и той же полосе, вместо того, чтобы распространять их в трех (или пяти) барах.

Визуальный эффект будет точно подобен штабелированному стержню, но стержни не складываются друг на друга, а измерены снизу.

stacked bar

UPDATE: @DizietAsahi предложил использовать столбчатую вместо. Я думаю, это самое простое решение. Может ли кто-то предоставить код манипуляции с файлами данных, чтобы получить разницу ниже, пожалуйста?

Исходные данные представлены в виде TID и Score, так же как и следующие данные в формате 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 столбчатых диаграмм случае Для использования столбчатой, создавая кучу случайных чисел как Score для каждого TID будет штраф):

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) 

Благодаря

+0

было бы возможно предоставить пример dataframe? –

+0

@ShivamGaur, данные образца в CSV, а также формат данных. Благодарю. – xpt

+0

Просто сделайте сложный сюжет, вычисляющий каждый уровень, как разность баллов ниже –

ответ

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

результат:

enter image description here

+0

Абсолютно! Большое спасибо Юги! Не могли бы вы также поместить среднее значение в диаграмму? это так же просто, как 'ax1.bar (bar_l, df ['Average'] [df ['ScoreRank'] == 1],'? Спасибо – xpt

+0

@ xpt не проблема. Проверьте обновленный ответ – Yugi

+0

Вау, я был пытаясь исправить это сам, и после того, как я скопирую-скопирую код, я заметил, что среднее значение уже находится на графике *, а затем я проверил здесь. * WOW! * Спасибо! – xpt

Смежные вопросы