熊猫:如何用带标签的数据框绘制barchar?

时间:2015-11-24 13:31:09

标签: python pandas matplotlib visualization seaborn

我有以下数据框$error_reporting

"E_ALL | E_STRICT"

我想实现类似以下Picture taken from here http://pandas.pydata.org/pandas-docs/stable/visualization.html的条形图 如果df列中的标签不是 timestamp objectId result 0 2015-11-24 09:00:00 Stress 3 1 2015-11-24 09:00:00 Productivity 0 2 2015-11-24 09:00:00 Abilities 4 3 2015-11-24 09:00:00 Challenge 0 4 2015-11-24 10:00:00 Productivity 87 5 2015-11-24 10:00:00 Abilities 84 6 2015-11-24 10:00:00 Challenge 58 7 2015-11-24 10:00:00 Stress 25 8 2015-11-24 11:00:00 Productivity 93 9 2015-11-24 11:00:00 Abilities 93 10 2015-11-24 11:00:00 Challenge 93 11 2015-11-24 11:00:00 Stress 19 12 2015-11-24 12:00:00 Challenge 90 13 2015-11-24 12:00:00 Abilities 96 14 2015-11-24 12:00:00 Stress 94 15 2015-11-24 12:00:00 Productivity 88 16 2015-11-24 13:00:00 Productivity 12 17 2015-11-24 13:00:00 Challenge 17 18 2015-11-24 13:00:00 Abilities 89 19 2015-11-24 13:00:00 Stress 13 ,则y轴应与列a,b,c,d对应,而x轴应为列{{1}的分组值}}。

我尝试了几件事,但没有任何效果。这是最接近的,但ObjectID方法不会通过参数进行任何自定义(例如result无效)。

timestamp

还有其他想法吗?

2 个答案:

答案 0 :(得分:3)

import seaborn as sns

In [36]:
df.timestamp = df.timestamp.factorize()[0]

In [39]:
df.objectId = df.objectId.map({'Stress' : 'a' , 'Productivity' : 'b' , 'Abilities' : 'c' , 'Challenge' : 'd'})

In [41]:
df
Out[41]:
   timestamp    objectId    result
0       0           a           3
1       0           b           0
2       0           c           4
3       0           d           0
4       1           b           87
5       1           c           84
6       1           d           58
7       1           a           25
8       2           b           93
9       2           c           93
10      2           d           93
11      2           a           19
12      3           d           90
13      3           c           96
14      3           a           94
15      3           b           88
16      4           b           12
17      4           d           17
18      4           c           89
19      4           a           13

In [40]:
sns.barplot(x = 'timestamp' , y = 'result' , hue = 'objectId' , data = df );

enter image description here

答案 1 :(得分:1)

@NaderHisham的答案是一个非常简单的解决方案!
但仅作为参考,如果由于某种原因不能使用seaborn,这是一个纯粹的pandas / matplotlib解决方案:

您需要重塑数据,因此不同的objectIds成为列:

In [20]: df.set_index(['timestamp', 'objectId'])['result'].unstack()
Out[20]:
objectId   Abilities  Challenge  Productivity  Stress
timestamp
09:00:00           4          0             0       3
10:00:00          84         58            87      25
11:00:00          93         93            93      19
12:00:00          96         90            88      94
13:00:00          89         17            12      13

如果你制作一个条形图,你会得到所需的结果:

In [24]: df.set_index(['timestamp', 'objectId'])['result'].unstack().plot(kind='bar')
Out[24]: <matplotlib.axes._subplots.AxesSubplot at 0xc44a5c0>

enter image description here