D3.js(Data-Driven Documents)是一个JavaScript库,用于使用数据来操作文档。它允许开发者使用SVG、Canvas和HTML来创建复杂的可视化效果。线形图是一种常见的图表类型,用于展示数据随时间或其他连续变量的变化。
D3.js中的线形图可以分为以下几种类型:
线形图广泛应用于各种场景,如股票价格、温度变化、销售数据等。
以下是一个简单的示例,展示如何在D3.js中创建一个带网格的线形图。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>D3.js Line Chart with Grid</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
.grid line {
stroke: lightgrey;
stroke-opacity: 0.7;
shape-rendering: crispEdges;
}
.line {
fill: none;
stroke: steelblue;
stroke-width: 2px;
}
</style>
</head>
<body>
<svg width="800" height="400"></svg>
<script src="script.js"></script>
</body>
</html>
const margin = { top: 20, right: 30, bottom: 30, left: 40 };
const width = 800 - margin.left - margin.right;
const height = 400 - margin.top - margin.bottom;
const svg = d3.select("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", `translate(${margin.left},${margin.top})`);
const x = d3.scaleLinear()
.domain([0, 10])
.range([0, width]);
const y = d3.scaleLinear()
.domain([0, 100])
.range([height, 0]);
const line = d3.line()
.x(d => x(d.x))
.y(d => y(d.y));
const data = [
{ x: 0, y: 20 },
{ x: 1, y: 30 },
{ x: 2, y: 50 },
{ x: 3, y: 70 },
{ x: 4, y: 60 },
{ x: 5, y: 40 },
{ x: 6, y: 30 },
{ x: 7, y: 50 },
{ x: 8, y: 80 },
{ x: 9, y: 90 },
{ x: 10, y: 70 }
];
svg.append("g")
.attr("class", "grid")
.attr("transform", `translate(0,${height})`)
.call(g => g.selectAll(".tick")
.data(x.ticks())
.enter().append("line")
.attr("class", "tick")
.attr("x1", d => x(d))
.attr("x2", d => x(d))
.attr("y1", 0)
.attr("y2", -5));
svg.append("g")
.attr("class", "grid")
.call(g => g.selectAll(".tick")
.data(y.ticks())
.enter().append("line")
.attr("class", "tick")
.attr("x1", 0)
.attr("x2", 5)
.attr("y1", d => y(d))
.attr("y2", d => y(d)));
svg.append("path")
.datum(data)
.attr("class", "line")
.attr("d", line);
svg.append("g")
.attr("transform", `translate(0,${height})`)
.call(d3.axisBottom(x));
svg.append("g")
.call(d3.axisLeft(y));
x1
, x2
, y1
, y2
属性设置正确。d3.line()
的插值方法,如d3.curveMonotoneX
或d3.curveCatmullRom
。const line = d3.line()
.x(d => x(d.x))
.y(d => y(d))
.curve(d3.curveMonotoneX);
svg.append("g")
.attr("transform", `translate(0,${height})`)
.call(d3.axisBottom(x).tickFormat(d3.format(".0f")).ticks(10).tickSize(-height).tickPadding(10));
svg.append("g")
.call(d3.axisLeft(y).tickFormat(d3.format(".0f")).ticks(10).tickSize(-width).tickPadding(10));
通过以上步骤和示例代码,你可以创建一个带网格的线形图,并解决常见的绘制问题。
领取专属 10元无门槛券
手把手带您无忧上云