1.2 第一张图的语法解剖


文档摘要

1.2 第一张图的语法解剖 axes 级函数画在单个坐标轴上,返回 Matplotlib 的 Axes 对象;figure 级函数自建整个画布与面板网格,返回 FacetGrid 对象。分清这两级,是看懂 Seaborn 报错和做图层叠加的前提。 承接 1.1 的四层拆解法,本节把它用在一张从安装到出图的完整图上,顺便回答一个早晚会撞上的问题:为什么 能和 配合, 却经常报 AttributeError。 从安装到第一张图 Seaborn 会连带装好 NumPy、Pandas、Matplotlib 依赖,无需单独安装。 按拆解台读这段代码:数据层是 tips 长表;映射层只有一条 (单变量图,y 轴自动统计计数);图层只有一个直方图层;细节层是 和标题。第一次出图,四层里三层都可以先不管。

1.2 第一张图的语法解剖

axes 级函数画在单个坐标轴上,返回 Matplotlib 的 Axes 对象;figure 级函数自建整个画布与面板网格,返回 FacetGrid 对象。分清这两级,是看懂 Seaborn 报错和做图层叠加的前提。

承接 1.1 的四层拆解法,本节把它用在一张从安装到出图的完整图上,顺便回答一个早晚会撞上的问题:为什么 sns.histplot 能和 plt.title 配合,sns.displot 却经常报 AttributeError。

从安装到第一张图

# 命令行安装(三选一,任选其一即可) pip install seaborn conda install seaborn # 验证版本,本教程基于 0.13.x python -c "import seaborn as sns; print(sns.__version__)" # 输出示例:0.13.2

Seaborn 会连带装好 NumPy、Pandas、Matplotlib 依赖,无需单独安装。

import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset('tips') # 加载小费数据集:244 行 7 列 print(tips.head(3)) # 输出说明:total_bill、tip 为数值列,sex、smoker、day、time 为类别列,size 为整数列 # total_bill tip sex smoker day time size # 0 16.99 1.01 Female No Sun Dinner 2 # 1 10.34 1.66 Male No Sun Dinner 3 # 2 21.01 3.50 Male No Sun Dinner 3 # 第一张图:axes 级直方图 ax = sns.histplot(data=tips, x='total_bill', bins=20) ax.set_title('总消费分布') plt.show()

按拆解台读这段代码:数据层是 tips 长表;映射层只有一条 x='total_bill'(单变量图,y 轴自动统计计数);图层只有一个直方图层;细节层是 bins=20 和标题。第一次出图,四层里三层都可以先不管。

axes 级与 figure 级的分野

Seaborn 的绘图函数分两级,行为差异贯穿全书:

# axes 级:返回 Axes,可与其他图层自由叠加 ax = sns.histplot(data=tips, x='total_bill') print(type(ax)) # 输出:<class 'matplotlib.axes._axes.Axes'> # figure 级:返回 FacetGrid,自带画布,换 kind 切换图层类型 g = sns.displot(data=tips, x='total_bill', kind='kde', height=4, aspect=1.5) print(type(g)) # 输出:<class 'seaborn.axisgrid.FacetGrid'>

两者的语法地位不同:

对比项 axes 级(histplot、scatterplot、boxplot…) figure 级(displot、relplot、catplot…)
返回对象 Axes FacetGrid
图层叠加 直接连续调用,配合 ax 参数 通过 kind 参数切换内部图层
分面能力 无 col / row 支持 col、row、col_wrap
画布尺寸 依赖 plt.figure 或 set_size_inches height 与 aspect 参数直接控制
典型用途 精细组合、报告单图 快速探索、多维分面

01-02-fig01-2

一个完整案例:从需求到成图

背景:你想知道小费比例(tip / total_bill)在不同餐段是否有差异,这张图要放进周报。

操作:先派生比例列(数据层加工),再选箱线图(类别 x 数值的标准映射),最后打磨细节。

# 步骤一:数据层加工——派生小费比例列 tips['tip_rate'] = tips['tip'] / tips['total_bill'] # 步骤二:映射与图层——day 为类别轴,tip_rate 为数值轴,time 用颜色区分 ax = sns.boxplot(data=tips, x='day', y='tip_rate', hue='time') # 步骤三:细节层——参考线、标签、去上右边框 ax.axhline(0.15, color='gray', linestyle='--', linewidth=1) # 15% 小费参考线 ax.set_xlabel('星期') ax.set_ylabel('小费占消费比例') ax.set_title('不同餐段的小费比例分布') sns.despine(ax=ax)

结果解读:成图后能看到周日午餐样本很少(图例里 Thursday 至 Sunday 顺序由数据出现顺序决定),小费比例中位数普遍落在 0.13 到 0.17 之间,少数极端值超过 0.4——这些点不是错误,是真实存在的慷慨客人,报告里值得单独点名。

变式:如果周报版面只放得下一张小图,把 hue='time' 换成 hue='smoker' 可以回答另一个问题;想看分布形状而不只是分位数,把函数换成 sns.violinplot,映射参数一字不改。

⚠️ 常见坑:sns.displot(...) 之后调用 plt.title() 标题位置经常错乱甚至看不到——因为 figure 级函数的标题要用 g.fig.suptitle()g.set_titles() 管理,直接走 plt 接口操作的是"当前坐标轴",未必是你想标注的那个。

本节要点回顾

  • 两级函数看返回值:Axes 归 plt 管,FacetGrid 自带画布,报错时先想返回类型;
  • 映射参数跨级通用:从 axes 级迁到 figure 级,x、y、hue 原样照搬;
  • 数据层加工先行:派生列(如小费比例)在绘图前完成,图内不做计算;
  • 细节层用 axes 方法:参考线、标签、去边框都挂在 Axes 对象上。

下一节补齐最后一块地基:数据从哪来、为什么长表是 Seaborn 的母语。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U