熊猫堆积了与分组的酒吧的barplot

时间:2015-04-21 10:49:57

标签: python pandas seaborn

我的数据如下:

   topic  positive  negative     type
0     88  0.080000  0.030000   source
1     36  0.010000  0.200000   source
2    101  0.350000  0.040000   source
3     78  0.110000  0.090000   source
4     99  0.110000  0.010000   source
5     79  0.000000  0.050000   source
6     24  0.000000  0.160000   source
7     17  0.000000  0.410000   source
8     14  0.090000  0.050000   source
9     29  0.060000  0.030000   source
0     14  0.207071  0.085859  summary
1     17  0.000000  0.738889  summary
2     24  0.000000  0.219349  summary
3     29  0.000000  0.094907  summary
4     36  0.000000  0.255808  summary
5     78  0.108333  0.194444  summary
6     79  0.000000  0.106443  summary
7     88  0.089286  0.041667  summary
8     99  0.098496  0.050877  summary
9    101  0.444444  0.055556  summary

我需要绘制一个条形图,比较每个type的不同topic的正/负值。我看到它像在x轴上带有topic的堆积(正/负)条形图,并使用type列对条形图进行分组。但我找不到建立分组和堆积条形图的方法。

对于单身类型,看起来像这样(对不起,我没有足够的声誉来发布图片):

polar_data.set_index(['type', 'topic']).xs('summary').plot(kind='bar', stacked=True)

目前我唯一可以比较两种不同类型的方法是使用seaborn.factorplot并排放置两个图,但这并不能清楚地注意到趋势。而且我也不知道如何使用seaborn建立堆积条形图。

print_data = pd.melt(polar_data, id_vars=['topic', 'type'], value_name='percent', var_name='polarity')
sns.factorplot("topic", 'percent', 'polarity', row="type", data=print_data, margin_titles=True, kind='bar')

所以有一种方法可以合并"他们而不是并排放置?

1 个答案:

答案 0 :(得分:5)

这是使用matplotlib完成它的一种方法。我猜seaborn会使用相同的结构。

In [3]: polar_data.pivot('topic', 'type')
Out[3]:
       positive            negative
type     source   summary    source   summary
topic
14         0.09  0.207071      0.05  0.085859
17         0.00  0.000000      0.41  0.738889
24         0.00  0.000000      0.16  0.219349
29         0.06  0.000000      0.03  0.094907
36         0.01  0.000000      0.20  0.255808
78         0.11  0.108333      0.09  0.194444
79         0.00  0.000000      0.05  0.106443
88         0.08  0.089286      0.03  0.041667
99         0.11  0.098496      0.01  0.050877
101        0.35  0.444444      0.04  0.055556

所以,现在你可以做正值 -

polar_data.pivot('topic', 'type')['positive'].plot(kind='bar', stacked=True)

enter image description here

对于你可以做的负值 -

polar_data.pivot('topic', 'type')['negative'].plot(kind='bar', stacked=True)

enter image description here