Chapter 12 — Lab 5

Lab 5 · 视觉编码

比例尺 · 视觉通道 · 数据编码

01

掌握比例尺 d3.scaleLinear()、d3.scaleBand() 的使用

02

理解视觉通道与数据类型的对应关系

03

学会将数据维度映射到合适的视觉通道

04

了解 Bertin 视觉编码层次与 Tufte 图形原则

核心概念
d3.scaleLinear()d3.scaleBand()Color ScalePosition EncodingBertin Semiology

视觉编码是数据到图形属性的映射规则。本阶段你需要为项目中的核心图表建立完整的视觉编码系统——包括比例尺配置、颜色映射、位置映射,将数据维度转换为可读的图形元素。

01 比例尺基础

D3 比例尺是将数据的数学域(domain)映射到视觉范围(range)的函数:

// 连续型比例尺
const xScale = d3.scaleLinear()
  .domain([0, d3.max(data, d => d.value)])
  .range([0, width]);

// 带宽比例尺(分类)
const colorScale = d3.scaleBand()
  .domain(['Cat A', 'Cat B', 'Cat C'])
  .range([0, width])
  .padding(0.1);
02 位置编码

位置是最强的视觉通道。x 轴和 y 轴分别编码一个数据维度:

const xScale = d3.scaleBand()
  .domain(data.map(d => d.category))
  .range([0, width]).padding(0.05);

const yScale = d3.scaleLinear()
  .domain([0, d3.max(data, d => d.value)])
  .range([height, 0]); // SVG y轴向下,所以反转

svg.append('g')
  .attr('transform', `translate(0,${height})`)
  .call(d3.axisBottom(xScale));

svg.append('g')
  .call(d3.axisLeft(yScale));
03 颜色编码

颜色编码分为色相(分类区分)和饱和度/明度(数值大小):

// 分类颜色(色相不同)
const catColor = d3.scaleOrdinal()
  .domain(['A', 'B', 'C'])
  .range(d3.schemeTableau10);

// 连续颜色(数值大小 → 颜色深浅)
const numColor = d3.scaleSequential()
  .domain([minVal, maxVal])
  .interpolator(d3.interpolateBlues);

// 分段颜色(数值 → 离散色阶)
const quantColor = d3.scaleQuantize()
  .domain([0, 100])
  .range(['#fee5d9', '#fcae91', '#fb6a4a', '#cb181d']);
04 尺寸编码与视觉编码表

尺寸(大小)和透明度适合编码次要信息:

// 尺寸编码(面积与数据成正比,而非半径)
const rScale = d3.scaleSqrt()
  .domain([0, maxVal])
  .range([2, 20]);

// 透明度编码(适合展示重叠/密度)
const opacityScale = d3.scaleLinear()
  .domain([0, maxVal])
  .range([0.2, 0.9]);

在实验报告中填写完整的视觉编码表:

| 数据字段 | 数据类型 | 视觉通道 | D3 方法 |

| category | 分类 | 颜色 | d3.scaleOrdinal |

| value | 连续 | 纵轴位置 | d3.scaleLinear |

| count | 连续 | 圆半径 | d3.scaleSqrt |

💡 提示

Bertin 视觉通道层次(从强到弱):位置 > 颜色(色相)> 颜色(饱和度)> 大小 > 形状。最重要的数据维度用最强的通道——不要用颜色编码最重要的变量,用位置编码。

📦 交付物

实验报告(Word 填写): ① 视觉编码总表(含字段、类型、通道、D3 方法) ② 各比例尺配置代码截图 ③ 编码效果截图