D3.js比例尺 定量比例尺 之 線性比例尺(v3版本)

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

定量比例尺 : 數學上有函數的概念,不是編程中所說的函數,如線性函數、指數函數、對數函數等,而指的是一個量隨著另一個量的變化而變化。例如有一下線性函數 : y=2x+1該函數在二維坐標系中繪製出來的圖形是一條直線,如果限制x的範圍為[0,2],則可計算得到y的範圍為[1,5]。x的範圍[0,2]稱為 ...


定量比例尺 : 數學上有函數的概念,不是編程中所說的函數,如線性函數、指數函數、對數函數等,而指的是一個量隨著另一個量的變化而變化。例如有一下線性函數 : y=2x+1該函數在二維坐標系中繪製出來的圖形是一條直線,如果限制x的範圍為[0,2],則可計算得到y的範圍為[1,5]。x的範圍[0,2]稱為該函數的定義域,y的範圍稱為該函數的值域。根據x計算得到y的方法稱為對應法則。定義域、值域、對應法則稱為函數的三要素。   在數據可視化中,常需要像上述函數一樣,將一個量轉換為另一個量。D3提供了這樣的轉換方法,稱為比例尺(scale)。   我們現在所說的定量比例尺,是指當定義域是連續的情況。從0~2之間的所有值,稱為連續的值。類似0、1、2這樣的值,稱為離散的值   定量比例尺包括 : 線性比例尺指數比例尺對數比例尺量子比例尺分位比例尺閾值比例尺   按上面順序,首先先介紹線性比例尺 。   線性比例尺 線性比例尺(Linear Scale)是常用比例尺,與線性函數類似,計算線性的對應關係。相關方法有:   d3.scaleBand.linear()         //創建一個比例尺。   linear(x)              //輸入一個在定義域內的值x,返回值域內對應的值。   linear.invert(y)           //輸入一個在值域內的值,返回定義域內對應的值。   linear.domain([numbers])        //設定或獲取定義域   linear.range([values])         //設定或獲取值域   linear.rangeRound([values])     //代替range()使用的話,比例尺的輸出值會進行四捨五入的運算,結果為整數。   linear.clamp([boolean])          //預設被設置為false,當該比例尺接受一個超出定義域範圍內的值時,依然能夠按照同樣的計算方法計算得到一個值,這個值可能是超出值域範圍的,如果設置為true,則任何超出值域的範圍的值,都會被收縮到值域範圍內。   linear.nice([count])            //將定義域的範圍擴展成比較理想的形式。例如,定義域為[0.50000543,0.899995433221],則使用nice()之後,其定義域變為[0.5,0.9]。對於[0.500000543,69.99998888]這樣的定義域,則自動將其變為[0,70].   linear.ticks([count])           //設定或獲取定義域內具有代表性的值得數目。count預設為10,如果定義域[0,70],則該函數返回[0,10,20,30,40,50,60,70]。如果count設置為3,則返回   [0,20,40,60]。該方法主要用於選取坐標軸刻度。   linear.tickFormat(count,[format])    //用於設置定義域內具有代表性的值得表示形式,如顯示到小數點後兩位,使用百分比的形式顯示,主要用於坐標軸上。
  以上方法中,linear(x)、invert()、domain()、range()是基礎方法,使用形式看代碼:  
1 var linear = d3.scale.linear()
2                     .domain([0,20])     //設置定義域為[0,20]
3                     .range([0,100])     //設置值域為[0,100]
4                     
5         console.log(linear(10))         //返回值50
6         console.log(linear(30))         //返回值150
7         console.log(linear.invert(80))  //返回值16

 

  用linear()計算的結果是,輸出都是輸入值得5倍。而使用linear.invert()時,輸出都是輸入值得五分之一。要註意的是,倒數第二行,linear()接收了一個超出定義域範圍的值30,結果還是正常輸出其乘以5之後的值150.此輸出值也超過了值域的範圍如果不希望其超出範圍,可以使用clamp(),代碼如下:  
1 linear.clamp(true)
2 console.log(linear(30))         //返回值100
  將clamp()設置為true後,超出值域的值會取值域的上下限作為輸出。對於輸出的數值,如果希望對其進行四捨五入,要使用rangRound()來設置:  
1  linear.rangeRound([0,100]);
2  console.log(linear(13.33))      //返回值67
  如果不用rangeRound()重新設置值域,則輸出值為66.649999999999,其四捨五入後值為67.如果定義域中有無窮小數,可用nice(),代碼:  
1 linear.domain([0.123000000,0.488888888])
2             .nice()
3         console.log(linear.domain())    //返回值[0.1,0.5]
4 
5 
6         linear.domain([33.611111,45.97745])
7             .nice()
8         console.log(linear.domain())    //返回值[33,46]

 

應用nice()後,定義域變成了比較工整的形式,但是並不是四捨五入。最後講解ticks()和tickFormat()的用法,它們主要是用在坐標軸上的。看代碼:  
 1 var linear2 = d3.scale.linear()
 2                         .domain([-20,20])
 3                         .range([0,100])
 4         var ticks = linear2.ticks(5);
 5         console.log(ticks)              //返回值[-20, -10, 0, 10, 20]
 6 
 7         var tickFormat = linear2.tickFormat(5,"+");
 8         for (var i = 0; i < ticks.length ; i++){
 9             //ticks數組中的每一個值,都使用一次tickFormat()函數
10             ticks[i] = tickFormat(ticks[i])
11         }
12         console.log(ticks)              //返回值["-20", "-10", "+0", "+10", "+20"]

 

  這段代碼中,比例尺的定義域為[-20,20],調用ticks(5)之後返回一個數組,分別是該定義域內具有代表性的值。然後,調用tickFormat(),返回值是一個函數,因此調用時要使用函數的調用方式。最終結果是,ticks變成了設定的格式。此外設定的格式為"+":表示如果是正數,則在前面添加一個加號,負數則添加一個減號。除此之外,常用的格式還有%、$等,遵循迷你語言格式規範。   比例尺的domain()和range()最少放入兩個數,可以超過兩個數,但兩者的數量必須相等,放入三個數的情況如下,代碼:
1 var scale = d3.scale.linear();
2         scale.domain([0,20,40])
3             .range([0,100,150]);
4         console.log(scale(30))          //返回值125

 

  這表示有兩個線性函數,當輸入的值為30時,屬於domain的20~40的範圍,那麼輸出為100~150範圍。   下一文章介紹指數比例尺和對數比例尺。            
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一章給大家介紹了線性比例尺,https://www.cnblogs.com/littleSpill/p/10821332.html 現在給大家介紹一下指數比例尺和對數比例尺。 指數比例尺(Power Scale)和對數比例尺(Log Scale) : 指數比例尺(Power Scale)和對數比例 ...
  • js 跨域 為什麼會出現跨域。瀏覽器有同源策略,所謂同源是指:功能變數名稱、協議、埠相同。網上有很多介紹跨域的介紹,這裡不做詳細解析 解決跨域請求的方式有很多種: 當我們正常去請求一個跨域的介面是會出現錯誤,如下代碼 1. jsonp的方式,原生的利用script標簽 src 可以請求到任何資源, jqu ...
  • 很多同學在新建vue項目時,會遇到 incorrect 'only available in ES6' warning (W119) with options `moz: true, esversion: 6` 得報錯,原因是裝了jshint插件,對ES6語法進行了檢查 下麵貼出解決辦法 方法一:在 ...
  • 好久沒寫東西了,過了一段鹹魚生活,無意中想起了脈脈上面一句話: 始終保持自己的競爭力。所以,繼續開寫! 一般的JavaScript源碼看的已經沒啥意思了,我也不會寫什麼xx入門新手教程,最終決定還是啃原來的硬骨頭,從外層libuv => node => v8一步步實現原有的目標吧。 libuv核心還 ...
  • VS做簡歷的第三天(將文件中的樣式保存並且導入) 1.先在文件欄新建一個CSS文件 如 2.將第二天如下代碼,刪除保留中間部分,複製在CSS文件並且去掉縮進 3.刪除第二天代碼中的stype部分代碼並且在開頭加入修改後的代碼如下 效果圖 本人python的初學者,但很喜歡編程,希望大佬們多多指點 關 ...
  • 1.什麼是CSS? CSS 是層疊樣式表(Cascading Style Sheets)的縮寫,它用於定義 HTML 元素的顯示形式,是一種格式化網頁內容的技術。 2.CSS的優點 1.實現表現和結構、內容相分離。2.提高頁面瀏覽速度。3.縮短改版時間,降低維護費用。4.更好的控制頁面佈局。5.強大 ...
  • 一、表單的獲取方式 document.getElementById() document.forms[index]; document.forms[form_name] document.form_name function testGetForm() { var frm = document.ge ...
  • 從事web前端工作七年時間,因為一直是非常熱愛編程的,從小就有興趣,大學就是學電腦的,技術應該比一般同齡的都要好一些,今天我想給大家講述一下,目前想要做web前端開發,面試成功應該如何去學習,要具備哪些技術。 很多人說我們這行飽和了,說了至少有五六年了,但是以我的從業經驗來看,我們這行永遠都不會飽 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...