📅  最后修改于: 2023-12-03 15:30:21.323000             🧑  作者: Mango
D3.js是一个基于数据的JavaScript库,可以用来操纵文档、创建交互式图表和动画等。它可以与HTML、CSS和SVG等标准Web技术共同工作,方便地处理数据,并将其转换为漂亮的数据可视化图表。
D3.js可以通过npm安装,也可以直接在HTML文件中引入它的cdn链接:
<script src="https://d3js.org/d3.v6.min.js"></script>
以下是一个将数据展示成一个简单柱状图的基本示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v6.min.js"></script>
</head>
<body>
<script>
var data = [4, 8, 15, 16, 23, 42];
d3.select("body")
.selectAll("div")
.data(data)
.enter().append("div")
.style("width", function(d) { return d*10 + "px"; })
.text(function(d) { return d; });
</script>
</body>
</html>
结果如下所示:
在上面的代码中,我们使用了d3.select()选择器来选择文档中的body标签。接着,我们使用了selectAll()方法选择所有的div元素。接下来,我们将我们的数据(data)与选择的div元素绑定在一起,使用enter()方法创建了一个占位符的div。然后,我们使用了style()方法来定义每个div元素的宽度,并使用text()方法来设置每个元素的文本。
使用D3.js进行数据可视化最重要的一步是将数据绑定到对应的HTML标签上。下面是一个例子:
var dataset = [2.5, 2.1, 1.7, 1.3, 0.9];
d3.select("body")
.selectAll("p")
.data(dataset)
.enter()
.append("p")
.text(function(d) { return d; });
在上面的代码中,我们将一个包含五个数字的数组dataset绑定到了五个p元素上。我们首先使用d3.select()选择器来选取body元素,接着使用selectAll("p")选择所有的p元素,并使用data()方法将数组绑定到p元素上。enter()方法则会在p元素不足五个的情况下创建占位符的p元素。
D3.js可以绘制多种类型的图表,包括折线图、散点图,饼图等。以下是几个常见的图表的绘制方法:
var margin = {top: 10, right: 30, bottom: 30, left: 60},
width = 400 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
var svg = d3.select("body")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")");
var data = [
{date: new Date("2021-01-01"), value: 10},
{date: new Date("2021-01-02"), value: 15},
{date: new Date("2021-01-03"), value: 5},
{date: new Date("2021-01-04"), value: 20},
{date: new Date("2021-01-05"), value: 8},
];
var x = d3.scaleTime()
.domain(d3.extent(data, function(d) { return d.date; }))
.range([0, width]);
svg.append("g")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(x));
var y = d3.scaleLinear()
.domain([0, d3.max(data, function(d) { return d.value })])
.range([height, 0]);
svg.append("g")
.call(d3.axisLeft(y));
svg.append("path")
.datum(data)
.attr("fill", "none")
.attr("stroke", "steelblue")
.attr("stroke-width", 1.5)
.attr("d", d3.line()
.x(function(d) { return x(d.date) })
.y(function(d) { return y(d.value) })
);
结果如下所示:
在上面的代码中,我们定义了一个包含5个日期和数值的data数组。接着,我们使用d3.scaleTime()和d3.scaleLinear()创建了一个x和y的比例尺。我们将它们用于添加坐标轴,并使用d3.line()方法创建了一条折线路径。
var data = [10, 20, 30, 40, 50];
var width = 400,
height = 400,
radius = Math.min(width, height) / 2;
var color = d3.scaleOrdinal()
.range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56"]);
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var arc = d3.arc()
.innerRadius(0)
.outerRadius(radius);
var pie = d3.pie()
.sort(null)
.value(function(d) { return d; });
var g = svg.selectAll(".arc")
.data(pie(data))
.enter()
.append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data); });
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.text(function(d) { return d.data; });
结果如下所示:
在上面的代码中,我们定义了一个包含5个数字的data数组。接着,我们创建了一个颜色比例尺(color)、一个饼图生成器(pie)以及一个圆弧生成器(arc),并绑定了data数组的数据。接下来,我们创建了一个用于存放每个圆弧和文字的g元素。我们使用append("path")方法添加了每个圆弧的路径,并使用append("text")方法添加了每个圆弧对应数字的文本到圆弧上方。
var data = [4, 8, 15, 16, 23, 42];
var svg = d3.select("body")
.append("svg")
.attr("width", 420)
.attr("height", 120);
svg.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("x", function(d, i) { return i * 70; })
.attr("y", function(d) { return 120 - (d * 5); })
.attr("width", 65)
.attr("height", function(d) { return d * 5; })
.attr("fill", "steelblue");
svg.selectAll("text")
.data(data)
.enter()
.append("text")
.text(function(d) { return d; })
.attr("x", function(d, i) { return i * 70 + 32; })
.attr("y", function(d) { return 120 - (d * 5) - 3; })
.attr("text-anchor", "middle");
结果如下所示:
在上面的代码中,我们定义了一个包含6个数字的data数组。接着,我们创建了一个SVG元素(svg)。我们使用selectAll("rect")方法和append("rect")方法添加6个矩形元素,将它们绑定到data数组上,并使用每个数字作为高度和x/y坐标。接下来,我们使用selectAll("text")方法和append("text")方法添加6个文本元素,并将它们绑定到data数组上。我们使用每个数字作为文本,并使用它们的x/y坐标将它们置于每个矩形上方的中心点。
D3.js是一个非常强大的工具,可以用于创建各种数据可视化图表。本文仅提供了一些基本示例,你可以根据自己的需要扩展和修改这些示例。在使用D3.js时,最重要的是了解绑定数据的方法以及创建比例尺和生成器的方法。希望本文能够为你提供一些参考。