比例尺与坐标轴
比例尺 (Scales) 是 D3 中非常强大且必不可少的功能,它将输入的值映射到输出的值。通常用于将数据空间 (Data Space) 映射到显示空间 (Display Space)。
什么是比例尺?
比例尺是一个函数,接收输入值,返回输出值。
- Domain (定义域): 输入值的范围(通常是数据的最小值到最大值)。
- Range (值域): 输出值的范围(通常是在网页上显示的像素范围,如 0 到 500)。
常用比例尺
D3 提供了多种类型的比例尺,以满足不同类型数据的需求。
1. 线性比例尺 (Linear Scale)
适用于数值型连续数据。
const scale = d3.scaleLinear()
.domain([0, 100]) // 数据范围
.range([0, 500]); // 像素范围
console.log(scale(50)); // 返回 250
2. 条形比例尺 (Band Scale)
适用于分类数据(如条形图的 x 轴)。
const scale = d3.scaleBand()
.domain(['苹果', '香蕉', '橙子'])
.range([0, 300])
.padding(0.1); // 条形之间的间隔
console.log(scale('香蕉')); // 返回 100
3. 序数比例尺 (Ordinal Scale)
适用于分类数据并将其映射到颜色或其他值。
const colorScale = d3.scaleOrdinal()
.domain(['A', 'B', 'C'])
.range(d3.schemeCategory10); // 使用 D3 的内置配色方案
坐标轴 (Axes)
坐标轴是基于比例尺自动生成的。D3 提供了一组现成的坐标轴生成器。
d3.axisBottom(scale): 生成位于底部的坐标轴。d3.axisLeft(scale): 生成位于左侧的坐标轴。d3.axisTop(scale)d3.axisRight(scale)
绘制坐标轴示例
// 假设创建了 x 和 y 比例尺
const xAxis = d3.axisBottom(xScale);
const yAxis = d3.axisLeft(yScale);
// 在 SVG 中绘制
const svg = d3.select("svg");
svg.append("g")
.attr("transform", "translate(0, 400)") // 移动到容器底部
.call(xAxis);
svg.append("g")
.attr("transform", "translate(50, 0)") // 移动到左侧留白处
.call(yAxis);
坐标轴属性定制
您可以通过 ticks() 方法调整刻度的数量,或者通过 tickFormat() 自定义刻度的文本格式:
const xAxis = d3.axisBottom(xScale)
.ticks(5) // 设置刻度数量
.tickFormat(d => `$${d}`); // 为数值增加美元符号
理解了比例尺和坐标轴,您就可以开始进行各种图表的精确绘制了。