我的数据如下:
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')
所以有一种方法可以合并"他们而不是并排放置?
答案 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)
对于你可以做的负值 -
polar_data.pivot('topic', 'type')['negative'].plot(kind='bar', stacked=True)