D3.js入門之比例尺的使用與繪制
中國這么大,要在一張小小地圖上畫上中國,那么就需要按一定的比例縮小。D3 可視化畫圖,也是如此,例如:一個(gè)柱狀圖的最大值為10000,但是畫布最大高度只有400,那么10000就只能被映射為400,那么8000、5000...又該映射成哪個(gè)值呢?
比例尺
D3中的比例尺大概有20多種(d3.scaleLinear
、d3.scalePow
、d3.scaleTime
、d3.scaleBand
等)。大體上可以分為三類:
- 連續(xù)輸入和連續(xù)輸出
- 連續(xù)輸入和離散輸出
- 離散輸入和離散輸出
常用比例尺
scaleLinear 線性比例尺
const scale = d3.scaleLinear() // 連續(xù)輸入和連續(xù)輸出 .domain([0, 500]) // 輸入域 0 ~ 500 .range([0, 300]); // 輸出域 0 ~ 300 console.log(scale(100)) // 60 console.log(scale(300)) // 180 console.log(scale(500)) // 300
scaleBand 有序序數(shù)比例尺
scaleBand
:有助于創(chuàng)建條形圖,同時(shí)考慮每個(gè)條形之間的間隔。域被指定為一組值(每個(gè)波段一個(gè)值),范圍為波段的最小和最大范圍(例如條形圖的總寬度)。
實(shí)際上scaleBand
會(huì)將范圍拆分為n 個(gè)帶區(qū)(其中n是域數(shù)組中的值的數(shù)量),并考慮在指定間隔的情況下計(jì)算條形圖的位置和寬度。
const scale = d3.scaleBand() .domain([1,2,3,4]) .range([0,100]) console.log(scale(1)) // 0 console.log(scale(3)) // 50 console.log(scale(4)) // 75 console.log(scale.bandwidth()) // 25 (100 分為4份,每份25(柱狀圖寬度))
d3.scaleTime() 時(shí)間比例尺
d3.scaleTime()
類似于d3.scaleLinear()
線性比例尺,只不過輸入域變成了一個(gè)時(shí)間軸。
const scale = d3.scaleTime() .domain([new Date(2022, 0, 1), new Date(2022, 0, 31)]) .range([0, 30]) console.log(scale3(new Date(2022, 0, 15))) // 14
scaleOrdinal 無序序數(shù)比例尺
const scale = d3.scaleOrdinal() // 離散輸入和離散輸出 .domain(['jack', 'rose', 'john', 'lucy']) .range([10, 20, 30]) console.log(scale("jack")); // 10 console.log(scale("lucy")); // 10 console.log(scale("rose")); // 20 console.log(scale("john")); // 30 console.log(scale("finget")) // 20 輸入域以外的值 const scale = d3.scaleOrdinal() .domain(['jack', 'rose', 'john', 'lucy']) .range([10, 20, 30]) .unknown(23) // 指定未知輸入域的輸出值 console.log(scale("finget")) // 23
如果輸入域大于輸出域,domain()
的值按照順序循環(huán)依次對(duì)應(yīng)range()
的值
scalePoint 點(diǎn)比例尺
// 創(chuàng)建從一組離散值映射到指定范圍內(nèi)等距的點(diǎn) const scale = d3.scalePoint() // 離散輸入和離散輸出 .domain(['jack', 'rose', 'john']) .range([0, 100]) console.log(scale4('jack')) // 0 console.log(scale4('rose')) // 50 console.log(scale4('john')) // 100 console.log(scale4.step()) // 訪問點(diǎn)之間的距離 50
scaleThreshold 閾值比例尺
// scaleThreshold 將連續(xù)數(shù)值輸入映射到范圍定義的離散值 let scaleThreshold = d3.scaleThreshold() // 連續(xù)輸入和離散輸出 .domain([0, 10, 20]) .range(['small', 'medium', 'large', 'xlarge']) console.log(scaleThreshold(5)) // medium console.log(scaleThreshold(15)) // large console.log(scaleThreshold(25)) // xlarge console.log(scaleThreshold(35)) // xlarge console.log(scaleThreshold(45)) // xxlarge
如果指定了 domain 則將比例尺的輸入范圍設(shè)置為指定的數(shù)組。數(shù)組必須是升序排序的。值通常是數(shù)值,也可以是能進(jìn)行排序的其他類型。如果輸出域的值個(gè)數(shù)為 N
+ 1, 則輸入域中值的個(gè)數(shù)必須為 N
. 如果比 N
少則對(duì)應(yīng)的輸出域中多余的值會(huì)被忽略。如果多于 N
則會(huì)出現(xiàn)返回 undefined
的情況。如果沒指定 domain 則返回比例尺當(dāng)前的輸入域。
// invertExtent 返回輸出域中的值 value 對(duì)應(yīng)的輸入范圍 console.log(scaleThreshold.invertExtent('small')) // [Infinity, 0] console.log(scaleThreshold.invertExtent('medium')) // [0, 10] console.log(scaleThreshold.invertExtent('large')) // [10, 20] console.log(scaleThreshold.invertExtent('xlarge')) // [20, Infinity]
scaleQuantize 量化比例尺
const scale = d3.scaleQuantize() // 連續(xù)輸入和離散輸出 .domain([0, 10]) .range(['red', 'green', 'blue', 'pink']) console.log(scale(-1)) // red console.log(scale(2)) // red console.log(scale(8)) // pink console.log(scale(20)) // pink console.log(scale.invertExtent('red')) // [0, 2.5] console.log(scale.invertExtent('green')) // [2.5, 5] console.log(scale.invertExtent('blue')) // [5, 7.5] console.log(scale.invertExtent('pink')) // [7.5, 10]
顏色比例尺
D3提供了一些顏色比例尺:點(diǎn)擊查看文檔
d3.schemeCategory10 d3.schemeAccent d3.schemeDark2 d3.schemePaired d3.schemePastel1 d3.schemePastel2 d3.schemeSet1 d3.schemeSet2 d3.schemeSet3 // 定義一個(gè)序數(shù)顏色比例尺 let color = d3.scaleOrdinal(d3.schemeCategory10) console.log(color(1)) // #1f77b4
總結(jié)
本章介紹了幾種常用的比例尺,D3 還有一些比例尺可以查看官方文檔了解:
d3.scaleIdentity() // 恒等比例尺 d3.scaleSqrt() // 乘方比例尺 d3.scalePow() // 類似scaleSqrt的乘方比例尺 d3.scaleLog() // 對(duì)數(shù)比例尺 d3.scaleQuantile() // 分位數(shù)比例尺
上述的各種使用比例尺的例子都相當(dāng)于一個(gè)正序的過程,從domain
的數(shù)據(jù)集映射到range
數(shù)據(jù)集中,那么有沒有逆序的過程呢?D3中提供了invert()
以及invertExtent()
方法可以實(shí)現(xiàn)這個(gè)過程。
到此這篇關(guān)于D3.js入門之比例尺的使用與繪制的文章就介紹到這了,更多相關(guān)D3.js比例尺內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS 實(shí)現(xiàn)雙色表格實(shí)現(xiàn)代碼
通過為<tr>元素添加屬性或類型選擇器,再通過CSS設(shè)置可以實(shí)現(xiàn)雙色表格,但如果表格很長,逐個(gè)元素添加可真麻煩。而且這樣的代碼維護(hù)起來不容易。所以比較好的方式是用JS實(shí)現(xiàn)。2009-11-11JS highcharts實(shí)現(xiàn)動(dòng)態(tài)曲線代碼示例
這篇文章主要介紹了JS highcharts實(shí)現(xiàn)動(dòng)態(tài)曲線代碼示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10動(dòng)態(tài)的創(chuàng)建一個(gè)元素createElement及刪除一個(gè)元素
本文用示例為大家介紹下動(dòng)態(tài)創(chuàng)建一個(gè)元素createElement及刪除一個(gè)元素,感興趣的朋友可以參考下2014-01-01js簡單實(shí)現(xiàn)HTML標(biāo)簽Select聯(lián)動(dòng)帶跳轉(zhuǎn)
Select聯(lián)動(dòng)帶跳轉(zhuǎn)的效果想必大家并不陌生吧,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-10-10JS隨機(jī)洗牌算法之?dāng)?shù)組隨機(jī)排序
這篇文章主要介紹了JS隨機(jī)洗牌算法之給數(shù)組隨機(jī)排序的相關(guān)資料,需要的朋友可以參考下2016-03-03webpack打包攜帶某個(gè)文件到dist目錄的配置方法
在 Webpack 配置文件?webpack.config.js 中,可以使用 CopyWebpackPlugin 插件實(shí)現(xiàn)將特定文件復(fù)制到dist目錄,這篇文章主要介紹了webpack打包攜帶某個(gè)文件到dist目錄的配置方法,需要的朋友可以參考下2024-04-04