6.2 主题风格与绘图上下文


文档摘要

6.2 主题风格与绘图上下文 style(主题) 控制背景、网格、轴脊等非数据元素的外观;context(绘图上下文) 控制字号与线宽的缩放档位。一个决定"长什么样",一个决定"多大声",两者共同构成成图交付的全局开关。 6.1 管完了"数据墨水"(颜色刻度),本节管"非数据墨水"。原教程把风格与上下文拆在两节,这里合并是因为它们共享同一个入口函数、服务同一个问题:让图适配交付媒介。 settheme:一个入口管三件事 五套内置主题的差异集中在背景与网格: 选择逻辑一句话:网格为读数服务。读者需要频繁对坐标读数值(探索、核对)就留网格;图只传达趋势与形态(汇报封面、幻灯)就去掉网格减干扰。

6.2 主题风格与绘图上下文

style(主题) 控制背景、网格、轴脊等非数据元素的外观;context(绘图上下文) 控制字号与线宽的缩放档位。一个决定"长什么样",一个决定"多大声",两者共同构成成图交付的全局开关。

6.1 管完了"数据墨水"(颜色刻度),本节管"非数据墨水"。原教程把风格与上下文拆在两节,这里合并是因为它们共享同一个入口函数、服务同一个问题:让图适配交付媒介。

set_theme:一个入口管三件事

import seaborn as sns import matplotlib.pyplot as plt sns.set_theme( style='whitegrid', # 主题:背景与网格 context='talk', # 上下文:字号线宽档位 palette='colorblind', # 默认调色板 font_scale=1.0, ) # 此后所有绘图自动套用,直到下次 set_theme tips = sns.load_dataset('tips') ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='time') plt.show()

五套内置主题的差异集中在背景与网格:

# 并排对比四套常用主题 fig, axes = plt.subplots(2, 2, figsize=(9, 6)) for ax, style in zip(axes.flat, ['darkgrid', 'whitegrid', 'white', 'ticks']): sns.set_theme(style=style) sns.scatterplot(data=tips, x='total_bill', y='tip', ax=ax) ax.set_title(f'style = {style}') plt.show() # 输出说明:darkgrid 灰底细网格,数据探索默认; # whitegrid 白底网格,统计报告常用;ticks 白底加刻度短线,出版风; # white 纯白,配合 despine 做极简风格 sns.set_theme() # 恢复默认,后续代码不受影响

选择逻辑一句话:网格为读数服务。读者需要频繁对坐标读数值(探索、核对)就留网格;图只传达趋势与形态(汇报封面、幻灯)就去掉网格减干扰。

context:同一张图的三种音量

for ctx in ['paper', 'notebook', 'talk', 'poster']: sns.set_theme(context=ctx) ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day') ax.set_title(f'context = {ctx}') plt.show() # 输出说明:paper 字号最小线最细(论文插图,缩印后仍清晰); # notebook 默认档;talk 放大约一倍半(演讲投影); # poster 最大(海报远看)。数据与代码完全不变,只有非数据元素缩放

四个档位不是随便放大字号——线宽、刻度长度、图例字号按比例联动,保证放大后视觉平衡不散架。手动只调 plt.rcParams 的字号常犯的错就是字大了线没变,成图头重脚轻;context 的联动缩放就是为避免这个问题。

临时切换用上下文管理器,出作用域自动还原:

with sns.plotting_context('talk'): ax = sns.scatterplot(data=tips, x='total_bill', y='tip') # 出了 with 块,设置自动回到之前状态——生成多媒介版本时不用来回改全局

despine 与边框裁剪

sns.set_theme(style='ticks') ax = sns.boxplot(data=tips, x='day', y='total_bill') sns.despine(ax=ax) # 默认去掉上、右两条边 sns.despine(ax=ax, left=True, bottom=False) # 再去掉左边,只留底部刻度线 # offset 参数让边框与数据脱开一点距离,呼吸感更好 sns.despine(offset=8, trim=True) # trim:边框裁剪到数据实际范围

出版风格的惯用组合是 ticks 加 despine:只留左下两条边框加刻度线,非数据墨水降到最低。trim=True 在 y 轴范围留白很大时特别有用——箱线图下方的空白轴段直接裁掉。

案例:一份分析的三个交付版本

背景:同一张小费分析图要交付到三个场合——论文正文(黑白缩印)、周报网页(彩色屏幕)、部门例会幻灯(远距投影)。

操作

def delivery_version(context, style, palette): """同一映射与图层,按媒介切换细节层""" sns.set_theme(style=style, context=context, palette=palette) ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', style='time') ax.set_xlabel('总消费(美元)') ax.set_ylabel('小费(美元)') sns.despine(offset=6) return ax paper = delivery_version('paper', 'ticks', 'deep') # 论文:细线小字 web = delivery_version('notebook', 'whitegrid', 'colorblind') # 网页:默认档 slide = delivery_version('talk', 'white', 'colorblind') # 幻灯:大字无边框

结果解读:三个版本的映射层一行未改——数据、通道、图层完全一致,差异全部收在 set_theme 一个调用里。这就是拆解台分层的实际收益:媒介适配被隔离在细节层,不会污染分析代码。变式:批量出图时把 delivery_version 挂到循环里对配置字典迭代,十几行就能产出整套多媒介图库。

⚠️ 常见坑:set_theme 是全局副作用,写在脚本中段会让前后两半的图风格不一致。惯例是把全局设置集中在脚本开头;或每个出图函数内部用 with 上下文管理器包住,彻底消除顺序依赖。

💡 关键直觉:style 改"长相"、context 改"音量"、palette 改"语义"——三个维度正交,一次只动一个,出问题才好归因。

06-02-fig01

本节要点回顾

  • set_theme 三合一:style、context、palette 一个入口,写在脚本开头;
  • 网格为读数服务:探索留网格、汇报去网格;
  • context 四档联动缩放:paper 到 poster,比手改 rcParams 稳;
  • with 临时切换:plotting_context 的作用域用法消除全局副作用;
  • ticks 加 despine:出版风最低非数据墨水的标准组合。

下一节完成细节层最后一环:标签、图例、标题与坐标参考线的交付级打磨。


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