1.1 为什么需要图形语法


文档摘要

1.1 为什么需要图形语法 图形语法是把统计图形分解为数据、映射、图层、细节等组件的组合式理论;Seaborn 的 API 设计几乎就是这套语法的 Python 翻译。掌握它,参数就不再需要背。 一个真实的翻车现场 先看一段典型的"词典式"代码。需求是:观察餐厅小费金额与总消费的关系,顺便区分午餐和晚餐。 能跑。但第二天需求变了:不按餐段分,按星期分,再用点的大小表示用餐人数。上面四行核心代码全部重写——切片逻辑、颜色列表、图例条目都要动。这就是没有语法的代价:每换一个维度,整段代码推倒重来。 同样的需求用映射语法写: 需求变化时只改映射:按星期分就 ,加吸烟区维度再补 。代码结构与需求结构对齐了。 拆解台:四层各管什么 把上面那张散点图放上拆解台,逐层看清楚。

1.1 为什么需要图形语法

图形语法是把统计图形分解为数据、映射、图层、细节等组件的组合式理论;Seaborn 的 API 设计几乎就是这套语法的 Python 翻译。掌握它,参数就不再需要背。

一个真实的翻车现场

先看一段典型的"词典式"代码。需求是:观察餐厅小费金额与总消费的关系,顺便区分午餐和晚餐。

import matplotlib.pyplot as plt # 词典式写法:手动切片、手动配色、手动图例 lunch = tips[tips['time'] == 'Lunch'] dinner = tips[tips['time'] == 'Dinner'] plt.scatter(lunch['total_bill'], lunch['tip'], c='blue', label='午餐') plt.scatter(dinner['total_bill'], dinner['tip'], c='orange', label='晚餐') plt.xlabel('总消费') plt.ylabel('小费') plt.legend() plt.show()

能跑。但第二天需求变了:不按餐段分,按星期分,再用点的大小表示用餐人数。上面四行核心代码全部重写——切片逻辑、颜色列表、图例条目都要动。这就是没有语法的代价:每换一个维度,整段代码推倒重来

同样的需求用映射语法写:

import seaborn as sns # 映射式写法:数据放前面,维度交给参数 ax = sns.scatterplot( data=tips, # 数据层:整张表直接进来,不用切片 x='total_bill', # 映射层:总消费 → x 位置 y='tip', # 映射层:小费 → y 位置 hue='time', # 映射层:餐段 → 颜色 size='size', # 映射层:用餐人数 → 点大小 ) ax.set_xlabel('总消费(美元)') ax.set_ylabel('小费(美元)')

需求变化时只改映射:按星期分就 hue='day',加吸烟区维度再补 style='smoker'。代码结构与需求结构对齐了。

拆解台:四层各管什么

把上面那张散点图放上拆解台,逐层看清楚。

数据层:输入是一张长表,每行一条观测(一桌客人),每列一个变量。Seaborn 的所有统计都建立在"整洁数据"假设上——一行一观测,一列一变量。第 1.3 节会专门处理不整洁的数据。

映射层:这是语法的核心。xy 是位置通道;hue 是颜色通道;size 是大小通道;style 是形状通道;colrow 是分面通道(把数据切成多个子图)。每个通道接收一个列名,Seaborn 根据该列的 dtype 自动决定刻度类型:数值列映射为连续渐变,类别列映射为离散色板。这个"自动"后面藏着坑,第 6 章会展开。

图层:一个坐标轴里可以叠多个统计图形。直方图上叠核密度曲线、散点上叠回归线、箱线图上叠散点,都属于图层层的操作。Seaborn 允许连续调用多个 axes 级函数往同一个坐标轴里加内容。

细节层:轴标签、标题、图例位置、去边框、调色板选择。这些不改变统计内容,却决定读者第一眼是否信任这张图。

# 图层叠加示例:直方图 + 核密度 + 地毯,三种图层表达同一个分布 ax = sns.histplot(data=tips, x='total_bill', stat='density', alpha=0.4) sns.kdeplot(data=tips, x='total_bill', ax=ax, color='crimson') # 复用同一个 ax sns.rugplot(data=tips, x='total_bill', ax=ax, color='gray', height=0.04) # 输出说明:三条语句各贡献一个图层,ax 参数保证它们落在同一坐标系

注意 ax=ax 这个细节:把已有的坐标轴对象传进去,就是图层叠加的钥匙。不传的话,figure 级函数会另开画布。

用拆解法反推陌生参数

四层分法真正的价值在遇到陌生函数时体现。比如某段代码里出现了 sns.violinplot(data=tips, x='day', y='total_bill', hue='sex', split=True, cut=0),逐个归类:

  • data / x / y / hue:数据层与映射层,和散点图里含义完全一致;
  • split=True:图层层的家族特有参数,让两组小提琴各占半边;
  • cut=0:细节层的安全参数,禁止密度曲线越过数据实际范围。

五个参数各归其位,不需要查文档也能猜个八九不离十。反过来说,当你不知道该去哪找参数时,四层也限定了搜索范围:颜色问题去查调色板文档,分面问题去查 FacetGrid 文档。

本节要点回顾

  • 映射是复用单位:hue、size、style、col 在所有图形家族里语义一致,学一次到处用;
  • 代码结构对齐需求结构:需求换维度时只改映射参数,不动数据处理逻辑;
  • dtype 决定刻度:同一列,数值型映射成渐变,类别型映射成离散色,必要时需要显式转换;
  • 图层靠 ax 传递:多个 axes 级函数共享一个坐标轴,就完成了叠加;
  • 四层是检索框架:遇到陌生参数先归类,再决定查哪部分文档。

把四层拆解法用在需求沟通上

拆解法不只服务写代码,也服务改需求。可视化需求方(业务、编辑、评审)的反馈几乎都能翻译成某一层的变更,翻译对了,改动范围就锁死了:

需求方原话 翻译 改动层
换成按星期分颜色 hue 换列 映射层
把两个图放到一张里 图层叠加 图层
太花了,颜色淡一点 palette 或 alpha 细节层
再按性别拆成两张 加 col 通道 映射层(分面)
纵轴换成占比 stat 或 estimator 图层(统计口径)

这张对照表在实践中价值极高:评审会上的每一句"能不能改一下",你都能立刻判断它是十秒的参数改动还是一小时的结构改动——前者的痛快和后者的谨慎,都建立在这层翻译上。反之,说不出"这句反馈属于哪一层"时,贸然动手往往改出一张统计含义已经变了的图,比如把 multiple 从 stack 换成 fill,视觉只差一点,y 轴的口径已经从计数变成了占比。

下一节把环境装好,从零跑通第一张图,并把 figure 级与 axes 级函数的分野放进拆解台。


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