返回
初识 D3.js,零基础绘制柱形图,轻松玩转数据可视化
前端
2023-10-09 19:23:07
踏入数字时代的我们,身边充斥着海量的数据,这些数据蕴含着丰富的知识和洞见,等待着我们去挖掘和呈现。数据可视化应运而生,它将复杂的数据转化为直观易懂的图表,帮助人们快速理解信息,做出明智决策。
D3.js(Data-Driven Documents)作为一款强大的 JavaScript 数据可视化库,正受到越来越多开发者的青睐。D3.js 提供了一系列强大的函数,可以帮助你轻松创建各种各样的交互式数据可视化图表。
在这个入门系列教程中,我们将从绘制一个简单的柱形图开始,一步步带你领略 D3.js 的强大功能。本教程适合所有想要学习 D3.js 的新手,无需任何编程基础。
首先,让我们先来了解一下 D3.js 的基本概念。
- 数据驱动(Data-Driven): D3.js 以数据为核心,通过数据来驱动图表的外观和行为。
- 文档对象模型(Document Object Model,DOM): D3.js 使用 DOM 来创建和操作可视化元素。
- 可缩放矢量图形(Scalable Vector Graphics,SVG): D3.js 使用 SVG 来绘制可视化元素。SVG 是一种基于 XML 的矢量图形格式,具有良好的可扩展性和交互性。
掌握了这些基本概念后,我们就可以开始绘制我们的第一个柱形图了。
- 导入 D3.js 库
在 HTML 文件中导入 D3.js 库:
<script src="https://d3js.org/d3.v7.min.js"></script>
- 加载数据
我们将使用一个包含国家及其人口数据的 JSON 文件作为数据源。
const data = [
{
country: '中国',
population: 1444000000
},
{
country: '印度',
population: 1393000000
},
{
country: '美国',
population: 332400000
},
{
country: '印度尼西亚',
population: 273500000
},
{
country: '巴基斯坦',
population: 220800000
}
];
- 创建 SVG 元素
在 HTML 文件中创建一个 SVG 元素:
<svg id="chart"></svg>
- 设置 SVG 元素的宽高
使用 D3.js 的 select()
方法选择 SVG 元素,并设置其宽高:
const svg = d3.select('svg');
svg.attr('width', 500)
.attr('height', 500);
- 设置比例尺
比例尺用于将数据值映射到 SVG 元素的坐标。这里我们使用线性比例尺将人口数据映射到柱形图的柱高:
const yScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d.population)])
.range([0, 400]);
- 创建柱形图
使用 D3.js 的 selectAll()
方法选择所有数据,并使用 enter()
方法创建柱形图:
const bars = svg.selectAll('rect')
.data(data)
.enter()
.append('rect');
- 设置柱形图的属性
使用 attr()
方法设置柱形图的属性,包括位置、大小和颜色:
bars.attr('x', (d, i) => i * 100)
.attr('y', d => 400 - yScale(d.population))
.attr('width', 80)
.attr('height', d => yScale(d.population))
.attr('fill', 'steelblue');
- 添加轴线和标签
为了让图表更加易于理解,我们可以添加轴线和标签:
// X 轴
svg.append('g')
.attr('transform', 'translate(0, 400)')
.call(d3.axisBottom(d3.scaleBand().domain(data.map(d => d.country)).range([0, 400])))
.selectAll('text')
.attr('transform', 'translate(-10, 0) rotate(-45)')
.style('text-anchor', 'end');
// Y 轴
svg.append('g')
.call(d3.axisLeft(yScale));
至此,我们就完成了一个简单的柱形图。通过这个教程,你已经初步了解了 D3.js 的基本用法。后续,我们将继续学习其他更复杂的图表类型,并探索 D3.js 的更多功能。