D3.js v3 系列教程
D3.js(Data-Driven Documents)是一个基于数据操作文档的JavaScript库,广泛用于创建动态、交互式的数据可视化,虽然D3.js目前已经迭代到更高版本(如v5、v6),但v3版本依然被许多遗留项目使用,本教程将系统讲解D3.js v3的核心功能、用法及实践技巧,帮助开发者高效掌握这一经典版本。
D3.js v3 奠定了数据可视化的基础框架,具备以下特点:
以下示例演示如何用D3.js v3 绘制柱状图:
// 数据定义 var dataset = [30, 50, 80, 120, 200]; // 创建SVG画布 var svg = d3.select("body") .append("svg") .attr("width", 500) .attr("height", 300); // 绘制矩形柱 svg.selectAll("rect") .data(dataset) .enter() .append("rect") .attr("x", function(d, i) { return i * 60; }) .attr("y", function(d) { return 300 - d; }) .attr("width", 50) .attr("height", function(d) { return d; }) .attr("fill", "steelblue");
代码解析:
d3.select()
选择DOM元素并绑定数据。 enter()
处理数据与元素数量不匹配的情况。 attr
)动态设置图形位置、尺寸和颜色。 D3的核心是数据与DOM元素的绑定:
d3.selectAll("p") .data([4, 8, 15, 16, 23, 42]) .text(function(d) { return d; });
selectAll()
选择元素集合。 data()
将数据集绑定到元素。 enter()
追加,多余数据通过exit()
移除。 比例尺将数据映射为视觉属性(如位置、颜色):
var xScale = d3.scale.linear() .domain([0, d3.max(dataset)]) .range([0, 500]);
d3.scale.linear()
d3.scale.ordinal()
力导向图用于展示复杂关系网络:
var nodes = [{name: "A"}, {name: "B"}, {name: "C"}]; var links = [{source: 0, target: 1}, {source: 1, target: 2}]; var force = d3.layout.force() .nodes(nodes) .links(links) .size([500, 300]) .start(); // 绘制连线 var link = svg.selectAll(".link") .data(links) .enter().append("line") .attr("class", "link"); // 绘制节点 var node = svg.selectAll(".node") .data(nodes) .enter().append("circle") .attr("class", "node") .attr("r", 10) .call(force.drag);
通过事件监听实现交互效果:
d3.select("rect") .on("mouseover", function() { d3.select(this).attr("fill", "orange"); }) .on("mouseout", function() { d3.select(this).attr("fill", "steelblue"); });
transition()
实现平滑过渡: d3.select("circle") .transition() .duration(1000) .attr("r", 20);
attr
或style
调用。 ease("elastic")
提升动画效果。 尽管v3功能稳定,但建议升级至v6+以享受以下特性:
d3-selection
代替部分v3语法。 Q:D3.js v3 兼容哪些浏览器?
A:支持IE9+、Chrome、Firefox、Safari。
Q:如何处理动态数据更新?
A:通过data().enter().exit()
生命周期管理元素。
Q:为何新版D3不再支持某些v3功能?
A:新版优化了API设计,建议查看官方迁移指南。