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

如何使用sns.boxplot或sns.catplot为箱线图添加hatch填充图案

为seaborn分类箱线图添加hatch填充图案

问题现状

当前代码运行效果:
当前实现效果
目标效果(需保留默认中位数线样式):
期望实现效果
现有实现代码:

exercise = sns.load_dataset("exercise")
g = sns.catplot(x="time", y="pulse", hue="kind", data=exercise, kind="box")
bars = g.axes[0][0].patches
hatches=['//','..','xx','//','..','xx','//','..','xx']
for pat,bar in zip(hatches,bars):
    bar.set_hatch(pat)

上述代码运行后无法得到目标效果。现有实现逻辑参考了柱状图hatch设置、FacetGrid元素获取的相关方案,但catplot生成的FacetGrid对象未直接暴露patches、containers属性,且箱线图的元素构成和柱状图不同,直接套用柱状图的元素遍历逻辑无法正确给分类箱线图按分组添加hatch。

已验证无法解决问题的参考方向

  • 基础matplotlib箱线图箱体面图案设置方法

可行实现方案

核心逻辑:箱线图的箱体属于matplotlib的Patch对象,按hue分组的箱体在坐标轴patches列表中按固定周期排列,遍历所有patch按周期匹配hatch样式即可,不会影响中位数线、须线、离群点等其他箱线图元素。
完整可运行代码:

import seaborn as sns
import matplotlib.pyplot as plt

# 加载示例数据绘制分类箱线图
exercise = sns.load_dataset("exercise")
g = sns.catplot(x="time", y="pulse", hue="kind", data=exercise, kind="box")

# 按hue类别顺序定义对应hatch样式,顺序需和图例中hue类别顺序一致
group_hatches = ['//', '..', 'xx']
ax = g.axes.flat[0]

# 遍历所有箱体patch,按分组匹配hatch
for idx, patch in enumerate(ax.patches):
    current_hatch = group_hatches[idx % len(group_hatches)]
    patch.set_hatch(current_hatch)
    # 可选:调整箱体填充透明度,让hatch纹理更清晰
    patch.set_alpha(0.8)

plt.show()

适配说明

  • 无需硬编码全量箱体的hatch列表,通过索引取模的方式自动匹配不同x分组下的同类别箱体,适配任意x轴分组数量、任意hue类别数量的场景。
  • 若绘制的是多面子图,只需在外层增加对g.axes.flat的遍历,即可给所有子图的箱线图统一添加hatch样式。
  • 该实现不会修改箱线图默认的中位数线、上下须、边界线、离群点的样式,完全保留原生箱线图的线条展示效果。

内容的提问来源于stack exchange,提问作者Nara Begnini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:54:32