2016-12-21 59 views
2
month cate_cnt1_members cate_cnt2_members cate_cnt3_members cate_cnt4_members cate_cnt5_members cate_cnt6_members cate_cnt7_members cate_cnt8_members cate_cnt9_members cate_cnt10_members cate_cnt11_members cate_cnt12_members cate_cnt13_members cate_cnt14_members 
201501 93.525692 5.989799 0.455098 0.027863 0.001548 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 
201502 90.515995 8.396707 0.971026 0.107892 0.008380 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 
201503 82.525162 14.066414 2.836065 0.505229 0.061750 0.005380 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 
201504 75.546295 18.279664 4.884050 1.102780 0.172282 0.013621 0.001199 0.000109 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 
201505 71.142107 20.954861 6.278794 1.401423 0.206386 0.015837 0.000593 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 
201506 63.783161 23.386509 9.241094 2.914457 0.601408 0.067921 0.005178 0.000273 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 
201507 62.361179 23.364693 9.888232 3.445630 0.812055 0.116408 0.010563 0.001240 0.000000 0.000000 0.000000 0.000000 0.000000 0.0 

熊猫数据框显示在上面,它显示了不同类别的百分比,每个月的百分比不尽相同。我想用seaborn来获得一个条形图,其条形由第2列的14个类别成员的百分比组成。 这是我的代码:如何防止使用seaborn的barplot重叠?

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"] 
f, ax = plt.subplots(figsize=(6, 15)) 
sns.barplot(x = df['month'], y = df['cate_cnt1_members'], label='cate_cnt1_members', color=sns.color_palette("Set2", 10)[0]) 
sns.barplot(x = df['month'], y = df['cate_cnt2_members'], label='cate_cnt2_members', color=sns.color_palette("Set2", 10)[1]) 
sns.barplot(x = df['month'], y = df['cate_cnt3_members'], label='cate_cnt3_members', color=sns.color_palette("Set2", 10)[2]) 
sns.barplot(x = df['month'], y = df['cate_cnt4_members'], label='cate_cnt4_members', color=sns.color_palette("Set2", 10)[3]) 
sns.barplot(x = df['month'], y = df['cate_cnt5_members'], label='cate_cnt5_members', color=sns.color_palette("Set2", 10)[4]) 
sns.barplot(x = df['month'], y = df['cate_cnt6_members'], label='cate_cnt6_members', color=sns.color_palette("Set2", 10)[5]) 
sns.barplot(x = df['month'], y = df['cate_cnt7_members'], label='cate_cnt7_members', color=sns.color_palette("Set2", 10)[6]) 
sns.barplot(x = df['month'], y = df['cate_cnt8_members'], label='cate_cnt8_members', color=sns.color_palette("Set2", 10)[7]) 
sns.barplot(x = df['month'], y = df['cate_cnt9_members'], label='cate_cnt9_members', color=sns.color_palette("Set2", 10)[8]) 
sns.barplot(x = df['month'], y = df['cate_cnt10_members'], label='cate_cnt10_members', color=sns.color_palette("Set2", 10)[9]) 
sns.barplot(x = df['month'], y = df['cate_cnt11_members'], label='cate_cnt11_members', color=sns.color_palette("Paired")[0]) 
sns.barplot(x = df['month'], y = df['cate_cnt12_members'], label='cate_cnt12_members', color=sns.color_palette("Paired")[1]) 
sns.barplot(x = df['month'], y = df['cate_cnt13_members'], label='cate_cnt13_members', color=sns.color_palette("Paired")[4]) 
sns.barplot(x = df['month'], y = df['cate_cnt14_members'], label='cate_cnt14_members', color=sns.color_palette(flatui)[0]) 
plt.ylabel("percentage of category scope count") 
plt.xlabel(" Month") 
ax.legend(ncol=7, loc="topper middle", frameon=True) 
sns.despine(left=True, bottom=True) 

结果如下。但我不希望他们互相重叠。我希望14分量的总和为100,并完全填充100。那么我怎么能做到这一点? enter image description here

回答

3

有一个平凡简单的方法来做到这一点大熊猫。首先,你必须将指数作为一个月,然后只需创建一个堆叠条形图

df = df.set_index('month') 
df.plot.bar(stacked=True) 

要seaborn做,这是一个有点棘手。您必须取每行的累积总和,然后绘制该图。

# set the index if you haven't 
df = df.set_index('month') 
df = df.cumsum(axis=1) 

然后对原始代码进行一些小的调整。然后以相反的顺序绘制,以便100%条形图首先绘制。

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"] 
f, ax = plt.subplots(figsize=(10, 15)) 
sns.barplot(x = df.index, y = df['cate_cnt14_members'], label='cate_cnt14_members', color=sns.color_palette("Set2", 10)[0]) 
sns.barplot(x = df.index, y = df['cate_cnt13_members'], label='cate_cnt13_members', color=sns.color_palette("Set2", 10)[1]) 
sns.barplot(x = df.index, y = df['cate_cnt12_members'], label='cate_cnt12_members', color=sns.color_palette("Set2", 10)[2]) 
sns.barplot(x = df.index, y = df['cate_cnt11_members'], label='cate_cnt11_members', color=sns.color_palette("Set2", 10)[3]) 
sns.barplot(x = df.index, y = df['cate_cnt10_members'], label='cate_cnt10_members', color=sns.color_palette("Set2", 10)[4]) 
sns.barplot(x = df.index, y = df['cate_cnt9_members'], label='cate_cnt9_members', color=sns.color_palette("Set2", 10)[5]) 
sns.barplot(x = df.index, y = df['cate_cnt8_members'], label='cate_cnt8_members', color=sns.color_palette("Set2", 10)[6]) 
sns.barplot(x = df.index, y = df['cate_cnt7_members'], label='cate_cnt7_members', color=sns.color_palette("Set2", 10)[7]) 
sns.barplot(x = df.index, y = df['cate_cnt6_members'], label='cate_cnt6_members', color=sns.color_palette("Set2", 10)[8]) 
sns.barplot(x = df.index, y = df['cate_cnt5_members'], label='cate_cnt5_members', color=sns.color_palette("Set2", 10)[9]) 
sns.barplot(x = df.index, y = df['cate_cnt4_members'], label='cate_cnt4_members', color=sns.color_palette("Paired")[0]) 
sns.barplot(x = df.index, y = df['cate_cnt3_members'], label='cate_cnt3_members', color=sns.color_palette("Paired")[1]) 
sns.barplot(x = df.index, y = df['cate_cnt2_members'], label='cate_cnt2_members', color=sns.color_palette("Paired")[4]) 
sns.barplot(x = df.index, y = df['cate_cnt1_members'], label='cate_cnt1_members', color=sns.color_palette(flatui)[0]) 
plt.ylabel("percentage of category scope count") 
plt.xlabel(" Month") 
ax.legend(ncol=7, loc="upper center", frameon=True) 
sns.despine(left=True, bottom=True) 

enter image description here

+0

感谢。看起来熊猫在视觉上比海鸟更容易。 – yanachen

+0

不,不是真的。它们都是matplotlib的包装,通常seaborn有一个非常直接的方式来制作复杂的情节。据我所知,你碰巧制作了一个堆积的酒吧情节,这是海鸥为你开箱制作的少数情节之一。 –

+0

两者之间有一个平衡点。随着时间的推移,你会学习使用哪一个来完成哪项任务 –

1

考虑从广角到长融数据,然后运行数据透视表作为堆积条形图来源:

from io import StringIO 
import pandas as pd 
from matplotlib import rc, pyplot as plt 
import seaborn 

data = """month,cate_cnt1_members,cate_cnt2_members,cate_cnt3_members,cate_cnt4_members,cate_cnt5_members,cate_cnt6_members,cate_cnt7_members,cate_cnt8_members,cate_cnt9_members,cate_cnt10_members,cate_cnt11_members,cate_cnt12_members,cate_cnt13_members,cate_cnt14_members 
201501,93.525692,5.989799,0.455098,0.027863,0.001548,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0 
201502,90.515995,8.396707,0.971026,0.107892,0.008380,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0 
201503,82.525162,14.066414,2.836065,0.505229,0.061750,0.005380,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0 
201504,75.546295,18.279664,4.884050,1.102780,0.172282,0.013621,0.001199,0.000109,0.000000,0.000000,0.000000,0.000000,0.000000,0.0 
201505,71.142107,20.954861,6.278794,1.401423,0.206386,0.015837,0.000593,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.0 
201506,63.783161,23.386509,9.241094,2.914457,0.601408,0.067921,0.005178,0.000273,0.000000,0.000000,0.000000,0.000000,0.000000,0.0""" 

df = pd.read_csv(StringIO(data)) 

dfm = pd.melt(df, id_vars="month") 

seaborn.set() 

dfm.pivot_table(values="value", columns="variable", index="month", aggfunc='sum').plot.bar(stacked=True) 
locs, labels = plt.xticks() 
plt.legend(loc='upper center', ncol=7, frameon=True, shadow=False, prop={'size':8}) 
plt.setp(labels, rotation=0, rotation_mode="anchor", ha="center") 
plt.show() 

Stacked Bar Graph