Seaborn barplot使用dodge参数表现异常,hue分类缺失问题排查
Seaborn barplot设置dodge=False丢失hue分类问题说明与解决
问题复现
- 基础嵌套条形图绘制(正常显示)
代码如下:
sns.barplot(data=pos_data, x='bin', y='%', hue='POS')
- 添加dodge=False后出现分类丢失
需要将四个POS分类的条形堆叠展示时,添加dodge=False参数的代码如下:
sns.barplot(data=pos_data, x='bin', y='%', hue='POS', dodge=False)
运行后v类别的条形消失,但仍在图例中正常显示。
数据说明
每个bin对应的n、v、a、r四个POS类别的%值之和为1,测试用数据集构造代码如下:
import pandas as pd data = {'bin': [0.16, 0.16, 0.16, 0.16, 0.28, 0.28, 0.28, 0.28, 0.38, 0.38, 0.38, 0.38, 0.5, 0.5, 0.5, 0.5, 0.62, 0.62, 0.62, 0.62, 0.73, 0.73, 0.73, 0.73, 0.84, 0.84, 0.84, 0.84, 0.94, 0.94, 0.94, 0.94], '%': [0.55, 0.15, 0.26, 0.05, 0.46, 0.12, 0.33, 0.09, 0.46, 0.12, 0.36, 0.06, 0.43, 0.1, 0.44, 0.03, 0.39, 0.06, 0.53, 0.02, 0.34, 0.07, 0.58, 0.01, 0.3, 0.11, 0.58, 0.01, 0.41, 0.1, 0.49, 0.0], 'POS': ['n', 'v', 'a', 'r', 'n', 'v', 'a', 'r', 'n', 'v', 'a', 'r', 'n', 'v', 'a', 'r', 'n', 'v', 'a', 'r', 'n', 'v', 'a', 'r', 'n', 'v', 'a', 'r', 'n', 'v', 'a', 'r']} df = pd.DataFrame(data)
问题原因
dodge参数的作用是控制不同hue分类的条形是否在x轴上错位排列:
dodge=True(默认值):每个x位置的不同hue条形会水平错开,不会重叠,因此所有分类都能正常显示dodge=False:所有同一x位置的hue条形共享同一个x坐标,按hue的默认字母排序(a、n、r、v)依次绘制,后绘制的条形会覆盖在先绘制的条形上方。由于v类别的%值在所有bin中均小于a、n类别的数值,其条形会被完全遮挡,仅能看到上层的a、n、r类别的条形,因此视觉上呈现“丢失”状态。
Seaborn实现堆叠条形图方案
Seaborn未原生支持堆叠条形图参数,可以通过多次调用barplot、逐层指定bottom参数的方式实现预期效果,代码如下:
import seaborn as sns import matplotlib.pyplot as plt # 指定POS分类的堆叠顺序 pos_order = ['n', 'v', 'a', 'r'] # 获取所有bin的唯一值,用于计算每层的底部高度 bins = df['bin'].unique() bottom = pd.Series([0]*len(bins), index=bins) palette = sns.color_palette() plt.figure(figsize=(9, 5)) for idx, pos in enumerate(pos_order): # 筛选当前分类的子集 pos_subset = df[df['POS'] == pos].sort_values('bin') # 绘制当前分类的条形,bottom指定底部高度 sns.barplot( data=pos_subset, x='bin', y='%', color=palette[idx], label=pos, bottom=bottom.loc[pos_subset['bin']].values ) # 更新下一层的底部高度 bottom += pos_subset.set_index('bin')['%'] plt.legend(title='POS') plt.ylabel('占比(%)') plt.show()
内容的提问来源于stack exchange,提问作者Oxana Verkholyak
相关产品推荐
相关产品推荐

