步骤1:安装必要的依赖
- 安装Node.js:使用
npm install nodejs。 - 安装D3.js:使用
npm install d3。
步骤2:创建一个简单的数据集合
const data = [
{ time: '223-1-1', value: 1 },
{ time: '223-1-2', value: 15 },
{ time: '223-1-3', value: 12 },
{ time: '223-1-4', value: 18 },
{ time: '223-1-5', value: 17 },
{ time: '223-1-6', value: 16 },
];
步骤3:初始化D3 canvas
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 设置尺寸
canvas.width = 1;
canvas.height = 4;
// 设置坐标轴
ctx.beginPath();
ctx.moveTo(, 3);
ctx.lineTo(canvas.width, 3);
ctx.stroke();
ctx.moveTo(15, 0);
ctx.lineTo(15, 3);
ctx.stroke();
步骤4:绘制折线图
const line = {
data,
width: 2,
stroke: '#925255',
strokeOpacity: 0.5,
strokeDasharray: '2,2'
};
const lineCtx = ctx.create('line', [, 3, canvas.width, 3]);
lineCtx.fillStyle = '#888';
lineCtx.fillRect(, 0, canvas.width, 2);
lineCtx.beginPath();
lineCtx.moveTo(, 3);
lineCtx.lineTo(canvas.width, 3);
lineCtx.stroke();
const colors = ['#925255', '#888'];
const markers = ['o', 's'];
lineData.forEach((value, index) => {
ctx.fillStyle = colors[index % 2];
ctx.beginPath();
ctx.arc(
(canvas.width / 2) + (value - 1) / 2,
3,
2,
0,
Math.PI * 2
);
ctx.fill();
ctx.fillStyle = markers[index % 2];
ctx.beginPath();
ctx.arc(
(canvas.width / 2) + (value - 1) / 2,
3,
2,
0,
18
);
ctx.fill();
});
const labels = ctx.getLines().getSymbols();
for (let i = 0; i < labels.length; i++) {
labels[i].textContent = data.map((item, index) => `${item.time} - ${item.value}`).slice(i, i + 1).join(' ');
}
步骤5:显示图表
<div class="container">
<h1>数据可视化</h1>
<canvas id="canvas"></canvas>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
// 代码加载
document.addEventListener('DOMContentLoaded', () => {
// 读取数据
const data = document.getElementById('data').value;
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 初始化D3
const d3Canvas = new D3Canvas(canvas);
const d3Ctx = d3Canvas.getContext('2d');
// 初始化D3
d3.init({
x: d3Canvas.width,
y: d3Canvas.height,
size: [, 1],
margin: [, 0],
plugins: {
'd3.polar': true
}
});
// 读取数据到D3
d3.p(data);
// 绘制图表
const line = d3.line({
data,
width: 2,
stroke: '#925255',
strokeOpacity: 0.5,
strokeDasharray: '2,2'
});
line(data.map((_, index) => ({
x: d3.polarAngle(index * 36 / data.length),
y: d3.polarRadius(index * 36 / data.length)
})));
// 设置坐标轴
d3.polar(ax, {
ticks: {
ticks.forEach(t => {
d3.line(t, { y: 0 }, {
stroke: '#888',
opacity: 0.8
}));
d3.line(, t, {
stroke: '#888',
opacity: 0.8
});
}),
ticks.forEach(t => {
d3.line(t, { y: 0 }, {
stroke: '#925255',
opacity: 0.8
}));
d3.line(, t, {
stroke: '#925255',
opacity: 0.8
});
}),
labels: {
labels.forEach(t => {
d3.line(t, { y: 0 }, {
stroke: '#888',
opacity: 0.8
}));
d3.line(, t, {
stroke: '#888',
opacity: 0.8
});
}),
grid: {
gridLines: {
ticks: {
ticks.forEach(t => {
d3.line(t, { y: 0 }, {
stroke: '#888',
opacity: 0.8
}));
d3.line(, t, {
stroke: '#888',
opacity: 0.8
});
}),
ticks.forEach(t => {
d3.line(t, { y: 0 }, {
stroke: '#925255',
opacity: 0.8
}));
d3.line(, t, {
stroke: '#925255',
opacity: 0.8
});
}),
}
}
});
d3.polar(ax, .then((p) => {
p.addMeaninglessSymbol('x');
p.addMeaninglessSymbol('y');
p.addMeaninglessSymbol('line', {
stroke: '#925255',
opacity: 0.5
}));
});
// 绘制图例
const legend = d3.line(ax, .then((p) => {
p.addMeaninglessSymbol('x');
p.addMeaninglessSymbol('y');
p.addMeaningfulSymbol('line', {
stroke: '#925255',
opacity: 0.5
}));
});
// 设置标签
legend.forEach((text, index) => {
text.textContent = data.map((item, i) => `${item.time} - ${item.value}`).slice(i, i + 1).join(' ');
});
// 绘制
d3.render(ax, canvas);
});
</script>
</body>
</html>
步骤6:运行项目
npm run build
步骤7:测试和优化
- 测试:在浏览器中打开项目,查看图表是否正确显示数据。
- 优化:如果图表不够好,可以调整颜色、宽度、标度等参数,或者添加更多的样式,使图表更专业。
通过以上步骤,你已经成功使用Node.js和D3.js构建了一个简单的折线图,展示了数据随时间的变化趋势,这是一次很好的实践,帮助你熟悉了Node.js的使用环境和基本功能。









