Seaborn箱线图绘图:是否存在类似relplot、displot的分面实现?
分类图专用分面接口
Seaborn内置的catplot()就是和relplot()、displot()定位完全一致的分面绘图接口,三者属于同一层级的图形级接口,覆盖的绘图类型各有区分:
relplot:面向关系类可视化,支持散点图、折线图displot:面向数据分布类可视化,支持直方图、核密度估计图、经验累积分布函数图catplot:面向分类统计类可视化,支持箱线图、小提琴图、条形图、点图、分类散点图等全部分类绘图类型,原生支持分面网格排布、col_wrap自动换行参数,所有参数逻辑和前两个接口完全统一
代码实现优化
你原本通过循环过滤数据、手动创建子图的逻辑,都可以通过catplot的内置参数完成,不需要编写冗余的循环逻辑:
基础场景实现(对应Lunch/Dinner两个分面)
import seaborn as sns sns.set(style="ticks") tips = sns.load_dataset("tips") # 直接按time变量的取值拆分网格,绘制箱线图 g = sns.catplot( data=tips, x="sex", y="total_bill", hue="day", col="time", kind="box", height=5, aspect=1.2, )
多取值分面的适配
当分面变量的取值超过2个时,这种实现方式的优势会更突出:
- 不需要手动遍历变量取值、逐次过滤数据、计算子图位置和网格行列数
- 直接传入
col_wrap参数即可实现和relplot、displot一致的自动排版,比如分面变量有6个取值时,设置col_wrap=2就会自动排成3行2列的规整网格 - 自动对齐所有子图的坐标轴范围、合并重复图例、优化子图间距,避免手动循环经常出现的刻度不统一、每个子图重复显示图例的问题
比如需要按day的4个取值分面,自动排成2列网格的代码:
g = sns.catplot( data=tips, x="sex", y="total_bill", hue="time", col="day", col_wrap=2, kind="box", height=6, )
灵活度说明
catplot返回标准的FacetGrid对象,后续可以完全按照业务需求对单个子图做自定义调整,比如修改子图标题、调整坐标轴刻度、更换配色方案,灵活度和手动编写循环的方式没有差异,同时代码更简洁规范,适配不同分面取值数量的场景时不需要修改核心逻辑。
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

