You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为seaborn countplot按hue分组单独设置hatch填充图案

实现方法

seaborn的countplot生成的柱子集合ax.patches默认按hue类别分组排列:假设你有n个y轴的行程模式分类、4个收入分类(hue),那么ax.patches的前n个元素是第一个收入类别的所有柱子,接下来n个是第二个收入类别的,以此类推。利用这个分组规律就可以给同一个收入分类的所有柱子设置统一的填充图案,同时需要给图例句柄也同步设置图案,保证图例显示正确。

修正后的完整可运行代码如下:

ax = sns.countplot(
    data=data, y='M_pattern', hue='HHFAMINC',
    palette=color_palette, lw=0.5, ec='black',
)
plt.yticks(rotation=45, ha='right')

# 按收入分类顺序定义对应的填充图案
hatches = ['-', '+', 'x', '\\']
# 统计行程模式分类数量,用于对patches分组
n_pattern = data['M_pattern'].nunique()

# 按hue分组设置填充图案
for hue_idx, hatch in enumerate(hatches):
    # 提取当前hue对应的所有柱子
    for bar in ax.patches[hue_idx * n_pattern : (hue_idx + 1) * n_pattern]:
        bar.set_hatch(hatch)

# 给图例句柄同步设置填充图案
handles, _ = ax.get_legend_handles_labels()
for handle, hatch in zip(handles, hatches):
    handle.set_hatch(hatch)

# 自定义图例
plt.legend(
    handles, 
    [
        'Less than 10,000$ to 50,000$',
        '50,000$ to 100,000$',
        '100,000 to 150,000$',
        'More than 150,000'
    ],
    title='Income categories'
)

plt.ylabel('Mandatory trip pattern')
plt.show()

注意事项

  • 你原代码中bar.patches为笔误,需改为ax.patches才能正常运行
  • 如果hue的分类顺序和你预期的不匹配,可以提前将HHFAMINC列设置为有序分类类型,指定好顺序后再绘图,即可保证填充图案和收入分类一一对应

内容的提问来源于stack exchange,提问作者ali bakhtiari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:57:02