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
上面显示了pandas数据框,它显示了不同类别的百分比,每个月都有所不同。我想用seaborn得到一个条形图,它的条形图由14个类别成员从第2列到最后的百分比组成。
这是我的代码:
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完全填满。那我怎么才能做到这一点呢?
最佳答案
在熊猫身上有一个简单的方法。首先必须将索引设置为“月”,然后创建一个堆积条形图
df = df.set_index('month')
df.plot.bar(stacked=True)
在西伯恩做这件事有点难。必须取每行的累计和,然后绘制
# 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)
关于python - 如何使用Seaborn防止Barplot中的重叠?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41260284/