ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 准备数据(CSV格式) ``` year,month,average 2020,8,22.15 2020,9,72.52 2020,10,82.53 2020,11,90.45 2020,12,92.65 2021,1,100.71 2021,2,102.21 2021,3,111.44 2021,4,121.41 2021,5,132.55 2021,6,132.55 2021,7,132.55 2021,8,132.55 2021,9,132.55 2021,10,132.55 2021,11,132.55 2021,12,132.55 ``` ## 加载 CSV 数据 ``` //定义svg的宽和高 var w = 800; var h = 300; // 加载数据,并转换数据 d3.csv("/shop/visual/pathData", d => { return { date: new Date(+d.year, (+d.month - 1)), average: parseFloat(d.average) }; }).then(function (dataset) { console.table(dataset, ['date', 'average']); } ``` ![](https://img.kancloud.cn/ba/fc/bafc05bcfed1e19d8fdca17232afe9e4_585x220.png) ## 定义用于横坐标的时间比例尺 ``` xScale = d3.scaleTime() .domain([ d3.min(dataset, function (d) { return d.date; }), d3.max(dataset, function (d) { return d.date; }) ]) .range([0, w]); ``` 上面求最大值和最小值的方法可以简写。 ``` .domain(d3.extent(dataset, d=>d.date)) ``` ## 建立线性纵坐标 ``` //纵坐标 yScale = d3.scaleLinear() .domain(d3.extent(dataset, d => d.average)) .range([h, 0]); ``` ## 定义线条生成器 ``` //定义线条生成器 line = d3.line() .defined(function (d) { return d.average >= 0 && d.average <= 100; }) //过滤数据,只绘制0-100间的数据 .x(function (d) { return xScale(d.date); }) .y(function (d) { return yScale(d.average); }); //定义危险区域的线条生成器 dangerLine = d3.line() .defined(function (d) { return d.average >= 100; }) //过滤数据,只绘制不小于100的数据 .x(function (d) { return xScale(d.date) }) .y(function (d) { return yScale(d.average) }) ``` 如果想让折线变成区域,只需修改一个方法`d3.area()`即可。后面的章节后讲到。 ## 提供样式表 ``` <style type="text/css"> .line { fill: none; stroke: teal; stroke-width: 0.5; } .danger { stroke: red; } </style> ``` 下面是完整的d3代码 ``` //定义svg的宽和高 var w = 800; var h = 500; //留白 var padding = 40; // 加载数据,并转换数据 d3.csv("/shop/visual/pathData", d => { return { date: new Date(+d.year, (+d.month - 1)), average: parseFloat(d.average) }; }).then(function (dataset) { //横坐标 xScale = d3.scaleTime() .domain(d3.extent(dataset, d => d.date)) .range([padding, w - padding]); //纵坐标 yScale = d3.scaleLinear() .domain(d3.extent(dataset, d => d.average)) .range([h - padding, padding]); //定义线条生成器 line = d3.line() .defined(function (d) { return d.average >= 0 && d.average <= 100; }) //过滤数据,只绘制0-100间的数据 .x(function (d) { return xScale(d.date); }) .y(function (d) { return yScale(d.average); }); //定义危险区域的线条生成器 dangerLine = d3.line() .defined(function (d) { return d.average >= 100; }) //过滤数据,只绘制不小于100的数据 .x(function (d) { return xScale(d.date) }) .y(function (d) { return yScale(d.average) }) var svg = d3.select("body") .append("svg") .attr("width", w) .attr("height", h); svg.append("path") .datum(dataset) .attr("class", "line") .attr("d", line); svg.append("path") .datum(dataset) .attr("class", "line danger") .attr('d', dangerLine); }); ``` 下面给出浏览器的效果图。 ![](https://img.kancloud.cn/9a/3e/9a3e1163416c95a6599b00accc23a2e5_771x472.png)