Seaborn多子图柱状图单个子图分类柱顺序与其他不一致如何解决
问题成因
Seaborn的barplot函数在未显式指定hue排序规则时,每个子图的hue分类顺序由当前传入的独立数据集决定,默认取数据集里hue字段值的出现顺序/默认排序。你用到的df_2017中DCA_COMMON字段的两个取值的出现顺序与其他年份数据集相反,就会出现仅2017年子图柱子顺序颠倒的情况,你自定义的palette仅能保证颜色和分类对应正确,不会影响分类的排列顺序。
修复方案
方案1:绘图时显式指定hue顺序(修改成本最低)
在sns.barplot的入参中添加hue_order参数,直接固定所有子图的hue分类排列顺序,修改后循环段代码如下:
for axeloc, df, label in zip(axelocs, dfs, labels): palette = {'Spruce Beetle': '#97BC62FF', 'Mountain Pine Beetle': '#2C5F2D'} sns.barplot( ax=axeloc, x='SURVEY_YEA', y='Hectares', hue='DCA_COMMON', hue_order=['Spruce Beetle', 'Mountain Pine Beetle'], # 新增指定hue顺序的参数 linewidth=0, data=df, palette=palette ).set(title=label, ylabel=None, xlabel=None) axeloc.legend([],[], frameon=False)
方案2:提前统一设置字段分类顺序(适合多场景复用)
如果后续还有其他针对该字段的绘图需求,可以提前把所有数据集的DCA_COMMON字段转换为有序分类类型,后续所有绘图操作默认都会沿用该顺序,不需要每次传参指定:
import pandas as pd # 定义固定的分类顺序 beetle_cat = pd.CategoricalDtype(categories=['Spruce Beetle', 'Mountain Pine Beetle'], ordered=True) # 批量修改所有年份数据集的字段类型 for df in dfs: df['DCA_COMMON'] = df['DCA_COMMON'].astype(beetle_cat)
完成上述修改后再运行原绘图代码即可。
内容的提问来源于stack exchange,提问作者prime90
相关产品推荐
相关产品推荐

