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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...