6.1 调色板体系


文档摘要

6.1 调色板体系 Seaborn 的调色板分定性(类别无次序)、顺序(数值有大小)、发散(数据有零点)三类尺度;色板类型与数据语义对齐,是颜色映射的第一原则。 第 5 章把颜色推上唯一数值通道的位置,本节把"数值到颜色"的刻度体系完整拆开。 三类尺度对应三种数据语义 尺度类型 | 数据语义 | 代表色板 | 典型通道 定性 | 类别,无次序 | deep、muted、pastel、Set2、colorblind | hue=物种、星期 顺序 | 数值,只有大小 | Blues、viridis、mako、rocket | hue=年龄、连续数值 发散 | 数值,有零点或基准 | RdBur、coolwarm、vlag | 相关系数、涨跌幅 连续与离散:同一色板的两种形态 无障碍与自定义色板

6.1 调色板体系

Seaborn 的调色板分定性(类别无次序)、顺序(数值有大小)、发散(数据有零点)三类尺度;色板类型与数据语义对齐,是颜色映射的第一原则。

第 5 章把颜色推上唯一数值通道的位置,本节把"数值到颜色"的刻度体系完整拆开。

三类尺度对应三种数据语义

import seaborn as sns import matplotlib.pyplot as plt # color_palette 是色板的通用入口,返回颜色列表 print(sns.color_palette('deep', 3)) # 输出:[(0.122, 0.467, 0.706), (1.0, 0.498, 0.055), ...] RGB 元组列表 # 用 palplot 检查任何色板的样子 sns.palplot(sns.color_palette('Set2', 8)) # 定性:类别变量 sns.palplot(sns.color_palette('Blues', 8)) # 顺序:数值由浅到深 sns.palplot(sns.color_palette('RdBu_r', 8)) # 发散:两端对立、中点居中 plt.show()
尺度类型 数据语义 代表色板 典型通道
定性 类别,无次序 deep、muted、pastel、Set2、colorblind hue=物种、星期
顺序 数值,只有大小 Blues、viridis、mako、rocket hue=年龄、连续数值
发散 数值,有零点或基准 RdBu_r、coolwarm、vlag 相关系数、涨跌幅
tips = sns.load_dataset('tips') # 语义对齐示范:类别用定性,数值用顺序 ax1 = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', palette='Set2') # 正确:类别 x 定性 ax2 = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='size', palette='viridis') # 正确:数值 x 顺序 # 反面教材:类别配渐变,读者会追问"周六比周四深多少"——没有答案 bad = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', palette='Blues')

连续与离散:同一色板的两种形态

# 数值列较少取值时,可以让顺序色板离散化 ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='size', palette=sns.color_palette('mako', 6)) # 6 档离散色阶,图例变成 6 个色块——人数这种小整数语义比连续色带更准确 # 端点自定义:亮端压暗,投影仪上不泛白 cmap = sns.color_palette('crest', as_cmap=True) ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='total_bill', palette=cmap)

无障碍与自定义色板

# colorblind:三种常见色觉障碍下仍可区分的安全色板 ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', palette='colorblind') # 手动色表:与品牌或期刊规范对齐 brand = ['#2C5F9E', '#E15759', '#59A14F', '#F28E2B'] ax = sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', palette=brand) # 从单色出发构造两端:light_palette 与 dark_palette sns.palplot(sns.light_palette('#2C5F9E', 6)) # 向白渐变,适合面积填充 sns.palplot(sns.dark_palette('#E15759', 6)) # 向黑渐变,适合线与点 # 输出说明:同色系明度梯度在黑白打印后仍保持可分辨——单色渐变的隐藏优势

diverging_palette 则是发散色板的构造器,两端各给一个色相即得:

# 230 与 8 是两端色相角度,s 控制饱和度,as_cmap 返回连续刻度 cmap = sns.diverging_palette(230, 8, s=60, as_cmap=True) ax = sns.heatmap(tips.select_dtypes('number').corr(), cmap=cmap, center=0, annot=True)

案例:一张图挽救一次汇报

背景:季度汇报的散点图被同事吐槽"看不清哪些是哪些"——原图用了默认色板配四个类别加一条连续色带,投影后绿蓝难分。

操作

tips['bill_band'] = pd.cut(tips['total_bill'], [0, 15, 30, 60], labels=['低', '中', '高']) ax = sns.scatterplot( data=tips, x='total_bill', y='tip', hue='day', palette='colorblind', # 类别:无障碍定性色 style='bill_band', # 消费档位改用形状,不再叠加第二条颜色通道 markers=['o', 's', 'D'], alpha=0.75, ) sns.move_legend(ax, 'upper left', title='星期') ax.set_xlabel('总消费(美元)') ax.set_ylabel('小费(美元)')

结果解读:颜色只服务星期一个通道,四色在低饱和投影下依然可分;消费档位交给形状,黑白打印也不丢信息。变式:若消费档位必须用颜色表达(如热力图场景),三档离散的 mako 色阶比连续色带更利于口头汇报("深色档"是明确的三选一,"偏深那一段"是模糊的连续区间)。

06-01-fig01-2

⚠️ 常见坑:hue 通道的取值是数值型(如 0/1 编码)时,palette 参数会被忽略且无警告——因为连续刻度不接色板名。先把列转 category,色板才生效。

本节要点回顾

  • 三类尺度三句话:类别定性、大小顺序、有零发散,语义对齐是第一原则;
  • color_palette 是检查入口:任何拿不准的色板先 palplot 看一眼;
  • 小整数离散化:palette 传色列表即得档位色阶,图例更可谈;
  • 单色明度渐变抗降级:黑白打印后仍可分辨,报告场景优先;
  • 数值型 hue 不吃色板名:转 category 再配色。

下一节从颜色升到全局:主题与上下文如何让一套代码适配三种交付媒介。


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