如何使用Seaborn绘制与Pandas效果一致的多索引数据分组占比图
实现代码及说明
你需要先将多层索引的DataFrame转为普通列结构,再使用seaborn的barplot方法,通过hue参数实现分组效果,完整可运行代码如下:
# 导入依赖库 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # ---------------------- # 可选:如果你需要重建示例数据,可运行这段代码,已有数据可跳过 data = [ 0.777506, 0.222494, 0.846252, 0.153748, 0.734029, 0.265971, 0.709066, 0.290934, 0.855556, 0.144444, 0.763403, 0.236597, 0.780488, 0.219512, 0.755072, 0.244928, 0.751009, 0.248991, 0.743750, 0.256250 ] index = pd.MultiIndex.from_product( [['IT', 'RandD', 'accounting', 'hr', 'management', 'marketing', 'product_mng', 'sales', 'support', 'technical'], [0,1]], names=['Department', 'left'] ) df = pd.DataFrame(data, index=index, columns=['rate']) # ---------------------- # 数据预处理:将多层索引转为普通列 df_plot = df.reset_index() # 绘图配置 sns.set_style("whitegrid") plt.figure(figsize=(14, 7)) # 绘制分组柱状图 sns.barplot( x="Department", y="rate", hue="left", data=df_plot, palette=["#1f77b4", "#ff7f0e"] # 这里用常见的蓝橙配色,可自行调整匹配参考图 ) # 样式调整 plt.xticks(rotation=45, ha="right", fontsize=10) plt.title("各部门人员留存/离职占比", fontsize=15) plt.xlabel("部门", fontsize=12) plt.ylabel("占比", fontsize=12) plt.legend(title="人员状态", labels=["留存", "离职"], fontsize=10) plt.tight_layout() # 展示图表 plt.show()
补充说明
- 如果你已持有对应的多层索引DataFrame,直接跳过重建数据的步骤,对自己的DataFrame执行
reset_index()即可,注意将数值列的列名替换为代码中对应的rate即可正常运行。 - 若需要和参考图样式完全匹配,可调整
palette配色、figsize画布大小、字体等参数。
内容的提问来源于stack exchange,提问作者Haru Harshu
相关产品推荐
相关产品推荐

