Python中Seaborn histplot堆叠条形图未按预期堆叠及配色不生效问题
Seaborn实现分组堆叠获胜数条形图方案
核心问题原因
- 你当前使用的
histplot是统计类图表,默认对原始数据做频数计数,无法直接识别你传入的预聚合wins字段作为堆叠高度,所以无法生成预期的堆叠条形图 - palette未生效通常是因为颜色列表顺序与
winner列的唯一值分类顺序不匹配,或者长度和分类数量不一致
实现方案
方案1:使用pandas直接绘制堆叠条形图(推荐,适配预聚合数据)
该方案不需要额外调整seaborn参数,对汇总后的数据适配性更高:
import pandas as pd import matplotlib.pyplot as plt # 1. 将长表转换为宽表,索引为分组维度x轴,列名为hue分类,值为堆叠高度 stack_df = black_fmr_summary_low.pivot( index="black_first_move", columns="winner", values="wins" ).fillna(0) # 2. 确认winner分类顺序,调整颜色列表顺序对应 # 可先执行 print(stack_df.columns) 查看分类顺序,再调整color color = ['white', 'lightgrey', 'black'] # 3. 绘制堆叠条形图 ax = stack_df.plot( kind="bar", stacked=True, color=color, edgecolor="black" # 增加边框避免白色块和画布背景融合 ) ax.set_ylabel("获胜数") ax.set_xlabel("黑方先手走法") plt.legend(title="获胜方") plt.show()
方案2:调整histplot参数适配需求
如果需要继续使用seaborn histplot,新增weights参数指定堆叠高度为wins字段,删除原有y参数:
import seaborn as sns import matplotlib.pyplot as plt color = ['white', 'lightgrey', 'black'] sns.histplot( data=black_fmr_summary_low, multiple="stack", x="black_first_move", hue="winner", weights="wins", # 核心参数:指定每个分类的堆叠高度为预计算的获胜数 palette=color, edgecolor="black" ) plt.ylabel("获胜数") plt.show()
内容的提问来源于stack exchange,提问作者Justin123
相关产品推荐
相关产品推荐

