D3.js比例尺 序數比例尺(v3版本)

来源:https://www.cnblogs.com/littleSpill/archive/2019/05/07/10827374.html
-Advertisement-
Play Games

上一章介紹了閾值比例尺:https://www.cnblogs.com/littleSpill/p/10825038.html。到目前所有的定量比例尺已經介紹完了。 現在給大家介紹一下序數比例尺。 定量比例尺的定義域都是連續的,值域有連續的也有離散的。序數比例尺(Ordinal Scale)的定義域 ...


上一章介紹了閾值比例尺:https://www.cnblogs.com/littleSpill/p/10825038.html。到目前所有的定量比例尺已經介紹完了。

現在給大家介紹一下序數比例尺

定量比例尺的定義域都是連續的,值域有連續的也有離散的。序數比例尺(Ordinal Scale)的定義域和值域都是離散的。   現實中會有這樣的需求,通過輸入一些離散的值(如名稱、序號、ID等),要得到另一些離散的值(如顏色等),這種時候就要考慮序數比例尺了。 序數比例尺的方法有:   d3.scaleBand.ordinal() //構建一個序數比例尺   ordinal(x) //輸入定義域內一個離散值,返回值域內一個離散值。   ordinal.domain([values]) //設定或獲取定義域   ordinam.range([values]) //設定或獲取值域   ordinal.rangePoints(interval[,padding]) //代替range()設定的值域。接受一個連續的區間,然後根據定義域中離散值的數量將其分段,分段值即作為值域的離散值。   ordinal.rangeRoundPoints(interval,[,padding]) //和rangePoints()一樣,但是結果會取整數。   ordinal.rangeBands(interval[,padding[,outerPadding]]) //代替range()設定值域。與rangePoints()一樣,也是接收一個連續的區間,然後根據定義域中離散值得數量將其分段,但是其分段方法是不同的。   ordinal.rangeRoundBands(interval[,padding,outerPadding]) //和rangeBands()一樣,但是會將結果取整。   ordinal.rangBand() //返回使用rangeBands()設定後每一段的寬度、   ordinal.rangeExtend() //返回一個數組,數組裡存有值域的最大值和最小值   首先舉個例子,定義一個序數比例尺,定義域設置為[1,2,3,4,5]五個離散值,值域設置為[10,20,30,40,50]五個離散值。看代碼:  
 1 var ordinal = d3.scale.ordinal()
 2                         .domain([1,2,3,4,5])
 3                         .range([10,20,30,40,50])
 4 
 5         console.log(ordinal(1))         //輸出10
 6 
 7         console.log(ordinal(3))         //輸出30
 8 
 9         console.log(ordinal(5))         //輸出50
10         
11         console.log(ordinal(8))         //輸出10

 

由此可見,1對應10,3對應30,5對應50,與定義域和值域排列次序一致。但是最後一行輸入值為8,不在定義域內,輸出值為10.先不管其輸出值有沒有道理,總之不要輸入超過定義域的值。   但是,如果一個一個地設定值域的值,使其對應到定義域上,比較麻煩。D3提供了rangePoints()rangRoundPoints()用於解決此問題:只要接收一個連續的區間,即可自動計算出相應的離散值。這兩個方法都有兩個參數:intervalpaddinginterval是區間,padding是邊界部分留下的空白。可省略,預設為0。意義如圖:     如上圖,rnage.interval就是rangePoints()的第一個參數interval的值,是一個範圍,如[0,100]。padding是第二個參數:step是根據定義域的數值計算得到的值。圖中圓圈所代表的點,就是計算得到的離散值。看代碼:  
 1  var ordinal2 = d3.scale.ordinal()
 2                         .domain([1,2,3,4,5])
 3                         .rangePoints([0,100])
 4 
 5         console.log(ordinal2.range())        //輸出 [0, 25, 50, 75, 100]
 6 
 7         console.log(ordinal2(1))             //輸出0
 8 
 9         console.log(ordinal2(3))             //輸出50
10         
11         console.log(ordinal2(5))             //輸出100

 

上面代碼的序數比例尺中,rangePoints()的第一個參數為[0,100],第二個參數省略。對應到上圖的話,則range interval等於[0,100],padding等於0,step等於25.因此,得到了 上面輸出的5個離散值,與定義域的5個值是一一對應的。下麵來看看padding有設定值的情況:  
1    ordinal2.rangePoints([0,100],5)
2         
3         console.log(ordinal2.range())        //輸出[27.77777777777778, 38.888888888888886, 50, 61.11111111111111, 72.22222222222223]

 

這樣設定後,padding等於5,step等於11.111111。則step*padding/2等於27.77777,正是輸出數組的第一個值。這樣,有時輸出的數組是無窮小數,如果希望其都是整數,可用rangeRoundPoints()。代碼 :  
1    ordinal2.rangeRoundPoints([0,100],5)
2         
3         console.log(ordinal2.range())        //輸出[28, 39, 50, 61, 72]結果被四捨五入取整了

 

D3還提供了rangeBands()rangRouondBands()。與rangePoints()稍有不同的是,其接收三個參數:intervalpaddingouterPadding。各參數的意義如下圖。range interval是範圍。paddingouterPadding分別是內部和邊界的空白的參數,預設為0。rangePoints方框中的rangBand,表示一個區間。而該區間的起點,就是得到的離散值。圖:

 

rangeBand()可返回rangeBand的值。要註意函數名的區別。rangBands()後面有s,用於設置值域。rangeBand()後面沒有s,用於返回圖中rangBand的值,舉個例子:  
1 var bands = d3.scale.ordinal()
2                     .domain([1,2,3,4,5])
3                     .rangeBands([0,100])
4 
5         console.log(bands.range())          //輸出[0, 20, 40, 60, 80]
6         
7         console.log(bands.rangeBand())      //輸出20

 

這段代碼中,paddingouterPadding都沒有設定,預設為0.計算可得,rangeBand為20,值域有五個離散的值,分別是每一個rangeBand區域的起點,即[0,20,40,60,80]。下麵試一下設定了空白的情況:  
1 bands.rangeBands([0,100],0.5,0.2)
2 
3         console.log(bands.range())          //輸出[4.081632653061225, 24.489795918367346, 44.89795918367347, 65.3061224489796, 85.71428571428571]
4         
5         console.log(bands.rangeBand())      //輸出10.204081632653061

 

這段代碼中,padding為0.5,outerPadding為0.2.對應上圖中,step計算的值約等於20,因此左右邊界的空白step*outerPadding約等於4即輸出數組的第一個值。step*padding約等於10,即每個rangBand之間的空白長度。   D3提供了幾個獲取顏色的序數比例尺。製作圖標時,經常需要設定各圖形元素的顏色,每次都要手動設定很麻煩,如果對顏色沒有特殊要求直接使用這些顏色比例尺即可。並且,它們的顏色都經過精心的色彩搭配,相當美觀。顏色比例尺有4個:   d3.scale.category10() : //10種顏色   d3.scale.category20() : //20種顏色   d3.scale.category20b() : //20種顏色   d3.scale.category20c() : //20種顏色   這四個都是序數比例尺,輸入離散值後返回也是離散值。例如category10()提供了10種顏色,分別為#1f77b4,#ff7f0e,#2ca02,#d62728,#9467bd,#8c564b,#c377c2,#7f7f7f,#bcbd22,#17becf。看代碼:  
1 var color = d3.scale.category10();
2 
3         console.log(color(1))                    //輸出#1f77b4
4         
5         console.log(color("zhangsan"))           //輸出#ff7f0e

 

可以看到,無論輸入值是什麼樣的離散值,該比例尺都按照顏色順序返回:先返回了#1f77b4,再返回#ff7f0e,如果後面還有則繼續返回後面的值。使用這四個比例尺來設定顏色以後會經常見到,比如以下應用:  
 1      var width = 600;                //svg繪製區域的寬度
 2         var height = 600;               //svg繪製區域的高度
 3         var dataset = d3.range(5);      //返回[0,1,2,3,4,5]
 4        
 5         var color2 = d3.scale.category10();             //定義表示顏色的序數比例尺
 6         
 7         var svg = d3.select("#body")                    //選擇id為body的div
 8                     .append("svg")                      //在<body>中添加<avg>
 9                     .attr("width",width)                //設定<svg>的寬度屬性
10                     .attr("height",height)              //設定<svg>的高度屬性
11                     
12         //繪製圓
13          svg.selectAll("circle")        //選擇所有的圓
14             .data(dataset)              //綁定數據
15             .enter()                    //獲取enter部分
16             .append("circle")           //添加ciecle元素,使其與綁定數組的長度一致
17             .attr("cx",function(d,i){return 30 + i*80})     //設定圓的x方向的位置
18             .attr("cy",100)             //設定圓的y方向的位置
19             .attr("r",30)               //設定圓的半徑
20             .attr("fill",function(d,i){ //設定圓的顏色
21                 return color2(i)
22             })

 

d3.range()返回一個等差數列,但是此處僅使用其長度,不使用數組的各項值。以上代碼繪製了5個圓,再給每個圓設置顏色的時候,使用了color2(i)。color2是顏色比例尺。i是被綁定數據的索引號,被當做color2的參數使用。但是不一定非得用索引號,別的離散值也可以,顏色都會按順序返回。效果圖:       到這一章,比例尺都介紹完了。下一章給大家介紹坐標軸的繪製方法、添加坐標軸的刻度和各比例尺的坐標軸。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雙向數據綁定: 所謂雙向數據綁定是指View(視圖)與Model(模型)之間的綁定:View<=>Model。 View的改變: 通過界面交互使視圖發生改變,如Input框的輸入,Select元素的選擇,scrollBar滾動,瀏覽器視窗大小改變等等。 Model的改變: 如在Ajax, promi ...
  • 首先,我們要瞭解Node.js不是一種語言,它只是一個除了瀏覽器之外的,可以運行js的環境。 其次,Node能做些什麼 ? web伺服器、 命令行工具、 網路爬蟲、 桌面應用程式開發等 3.接下來使用Node.js創建簡單的伺服器 第一種寫法: 第二種寫法: 個人推薦:第二種寫法,可以很好的瞭解。 ...
  • 註意點: position屬性 定義建議元素佈局所用的定位機制 {position:static/absolute/relative/fixed;} static:預設值,沒有定位 absolute:絕對定位元素,相對於static定位以外的第一個父元素進行定位。可以通過left、top、right ...
  • 說起迭代器, 那就要先瞭解迭代模式 迭代模式: 提供一種方法可以順序獲得聚合對象中的各個元素, 是一種最簡單, 也是最常見的設計模式,它可以讓用戶通過特定的介面尋訪集合中的每一個元素 而不用瞭解底層的實現。 迭代器 : 依照迭代模式的思想而實現, 分為內部迭代器和外部迭代器, 內部迭代器: 本身是函 ...
  • 頁面效果: 只是測試了一部分功能,因篇幅有限,不能測試全面,有什麼問題,歡迎留言一起學習! 裡面的正則表達式,參考小編的前幾篇文章,有資源連接的 ...
  • 註意點: 元素類型分為 塊級元素 和 行內元素 塊級元素: 在網頁中以塊的形式顯示,預設情況都會占據一行,兩個相鄰的塊級元素不會出現併列顯示的元素,按照順序自上而下排列。 塊級元素可以定義自己的寬度和長度。 div: dl:與dt、dd搭配使用 form:交互表單 h1-h6:標題 hr:水平線 o ...
  • 示例代碼托管在: "http://www.github.com/dashnowords/blogs" 博客園地址: "《大史住在大前端》原創博文目錄" 華為雲社區地址: "【你要的前端打怪升級指南】" [TOC] 一. 粒子特效 粒子特效一般指密集點陣效果,它並不是canvas獨有的,這個名詞更多出 ...
  • 移動佈局 1.移動設備有 手機和ipad 安卓系統 ios系統 安卓系統的內置瀏覽器是谷歌 ios內置 safari瀏覽器 他們的內核都是web,不考慮相容性,需要考慮的問題是安卓和ios的區別? 2.佈局(寫頁面) 要考慮以下幾點 設置的寬度 設備的實際大小(設備的解析度)廠家給的 頁面的大小 設 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...