D3.js實(shí)現(xiàn)繪制折線圖的教程詳解
本章我們來實(shí)現(xiàn)一下折線圖,有了畫柱狀圖的經(jīng)驗(yàn),我們可以快速的分析出柱狀圖和折線圖的區(qū)別主要是x軸比例尺和繪制數(shù)據(jù)圖形,其余的畫布,坐標(biāo)軸等,本章就不過多的講解了。
x軸比例尺
根據(jù)折線圖x軸的特點(diǎn),可以分析出我們需要在x軸畫出間隔相同的N的點(diǎn),所以我們采用scalePoint
。
const xScale = d3.scalePoint() .domain(data.map((d) => d.name)) .range([0, dimensions.boundedWidth]);
如果使用scaleBand
就會是下圖的效果,刻度和數(shù)據(jù)點(diǎn)不能對齊。
數(shù)據(jù)折線
D3提供了一些圖形構(gòu)造器,例如d3.line
,d3.area
,d3.arc
,d3.pie
等,本章借著折線圖,我們介紹一下d3.line
和d3.area
。
d3.line
通過點(diǎn)位的二維數(shù)組自動(dòng)生成path:
// 構(gòu)建一個(gè)默認(rèn)為直線的線條繪制器 const lineGenerator = d3.line(); // 定義一下點(diǎn)位 const points = [ [0, 50], [100, 200], [300, 100], [400, 150], [300, 200] ]; // 生成一條path路徑 const linePath = lineGenerator(points); // 渲染line svg.append("path") .attr("d", linePath) .attr("fill", "none") .attr("stroke-width", 1) .attr("stroke", "red");
指定x,y的取值方式
const points = [ { x: 0, y: 50 }, { x: 100, y: 200 }, { x: 300, y: 100 }, { x: 400, y: 150 }, { x: 300, y: 200 } ]; const lineGenerator = d3 .line() .x((d) => d.x) .y((d) => d.y); const linePath = lineGenerator(points);
在實(shí)際開發(fā)中,我們基本上都是需要通過x軸和y軸的比例尺去計(jì)算,每個(gè)數(shù)據(jù)對應(yīng)點(diǎn)的位置信息。
圓滑的曲線
const lineGenerator = d3 .line() .x((d) => d.x) .y((d) => d.y) .curve(d3.curveBasis) // 曲線插值
D3提供了很多插值,例如:curveBasis
,curveCardinal
,curveCatmullRom
,curveStep
,curveStepBefore
,curveStepAfter
都可以試試效果
初步了解了d3.line
,我們就可以輕松的繪制我們的折線圖了:
const line = d3.line() .x((d) => xScale(xValue(d))) .y((d) => yScale(yValue(d))); chartG.append("g") .append("path") .style("fill", "none") .style("stroke", "rgb(51, 209, 243)") .style("stroke-width", 1) .datum(data) .attr("d", line); 復(fù)制代碼
這里我們使用的是datum
,因?yàn)橹恍枰粭l折線,而且需要在這條折線上生成所有的數(shù)據(jù)的點(diǎn)位以構(gòu)成path路徑,如果忘了datum
和data
的區(qū)別,可以回顧一下DataJoin。
d3.area
除了可以繪制一條折線,我們還可以繪制一個(gè)填充的折線區(qū)域,這也是比較常見的使用場景,這就需要用到d3.area
。
d3.area
用來設(shè)置坐標(biāo)的屬性有六個(gè)x
,y
,x0
,y0
,x1
,y1
,它們通常分為兩組來使用即:x, y0, y1
,y, x0, x1
分別代表兩個(gè)方向水平和垂直。
水平方向
const areaGenerator = d3.area() .x((d) => d.x) .y1((d) => d.y) .y0(10); const areaPath = areaGenerator(points); svg .append("path") .attr("d", areaPath) .attr("fill", "none") .attr("stroke-width", 1) .attr("stroke", "red");
我們打印一下areaPath
:
M0,50L100,200L300,100L400,150L400,10L300,10L100,10L0,10Z
翻譯一下:
移動(dòng)到(0,50)->繪制線到(100,200)->繪制線到(300,100)->繪制線到(400,150)
->繪制線到(400,10)->繪制線到(300,10)->繪制線到(100,10)
->繪制線到(0,10)->閉合(將起點(diǎn)與終點(diǎn)連接)
其實(shí)理解起來就像是小學(xué)的拼音連線題一樣:
垂直方向
const points = [ // y 是遞增的 { x: 20, y: 50 }, { x: 100, y: 100 }, { x: 300, y: 150 }, { x: 200, y: 200 }, { x: 300, y: 230 } ]; const areaGenerator = d3.area() .y((d) => d.y) .x0(10) .x1((d) => d.x);
值得注意的是,水平方向的area,points的特點(diǎn)是按x
遞增的,垂直方向的area,points的特點(diǎn)是按y
遞增的。
不排序的話,你可能會得到一個(gè)意料之外的圖形:
最后就可以完成我們的折線圖area模式了:
const area = d3.area() .x((d) => xScale(xValue(d))) .y1((d) => yScale(yValue(d))) .y0(yScale(0)); chartG.append("g") .append("path") .style("fill", "none") .style("fill", "green") .style("stroke", "rgb(51, 209, 243)") .style("stroke-width", 1) .datum(data) .attr("d", area);
總結(jié)
不同的圖表可能需要不同的比例尺,這個(gè)需要我們根據(jù)比例尺的特性和圖表的特征相互對照來選擇適合的比例尺。本章我們只簡單介紹了line
和area
的一些特性,更詳細(xì)的api還是需要參考官方文檔,最后建議打開demo調(diào)試一下,改改數(shù)據(jù),樣式,比例尺等看看效果。
到此這篇關(guān)于D3.js實(shí)現(xiàn)繪制折線圖的教程詳解的文章就介紹到這了,更多相關(guān)D3.js繪制折線圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
純js實(shí)現(xiàn)頁面返回頂部的動(dòng)畫(超簡單)
下面小編就為大家?guī)硪黄僯s實(shí)現(xiàn)頁面返回頂部的動(dòng)畫(超簡單)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08基于javascript實(shí)現(xiàn)根據(jù)身份證號碼識別性別和年齡
這篇文章主要介紹了基于javascript實(shí)現(xiàn)根據(jù)身份證號碼識別性別和年齡的相關(guān)資料,需要的朋友可以參考下2016-01-01JavaScript原生對象之Number對象的屬性和方法詳解
這篇文章主要介紹了JavaScript原生對象之Number對象的屬性和方法詳解,本文講解了創(chuàng)建 Number 對象的語法、MAX_VALUE、MIN_VALUE、NaN等屬性或方法,需要的朋友可以參考下2015-03-03詳解如何使用Flutter動(dòng)畫魔法使UI元素活起來
這篇文章主要為大家介紹了如何使用Flutter動(dòng)畫魔法使UI元素活起來方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04JavaScript中定時(shí)控制Throttle、Debounce和Immediate詳解
大家可能都知道JavaScript遵循事件驅(qū)動(dòng)的編程范例,這意味著一些行為可以激活一些響應(yīng),并且這些響應(yīng)僅在發(fā)生特定的行為時(shí)才被激活。這篇文章將給大家詳細(xì)介紹JavaScript中的定時(shí)控制Throttle、Debounce和Immediate,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-11-11一文概述ES7~12的語法及其相關(guān)使用規(guī)則
隨著JavaScript這門語言越來越流行,使得JavaScript這門語言越來越完善,這篇文章主要介紹了一文概述ES7~12的語法及其相關(guān)使用規(guī)則,需要的朋友可以參考下2023-01-01Layui實(shí)現(xiàn)數(shù)據(jù)表格中鼠標(biāo)懸浮圖片放大效果,離開時(shí)恢復(fù)原圖的方法
今天小編就為大家分享一篇Layui實(shí)現(xiàn)數(shù)據(jù)表格中鼠標(biāo)懸浮圖片放大效果,離開時(shí)恢復(fù)原圖的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09