D3.js坐標軸的繪製方法、添加坐標軸的刻度和各比例尺的坐標軸(V3版本)

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

坐標軸(Axis) 坐標軸(Axis)在很多圖表中都可見到,例如柱形圖、折線圖、散點圖等。坐標軸由一組線段和文字組成,坐標軸上的點由一個坐標值確定。但是,如果使用SVG的直線和文字一筆一畫的繪製坐標軸,工作量將會極其的大。D3提供了坐標軸的製作方法,需要之前所給大家講的比例尺一起使用。開發者僅僅需要 ...


坐標軸(Axis)   坐標軸(Axis)在很多圖表中都可見到,例如柱形圖、折線圖、散點圖等。坐標軸由一組線段和文字組成,坐標軸上的點由一個坐標值確定。但是,如果使用SVG的直線和文字一筆一畫的繪製坐標軸,工作量將會極其的大。D3提供了坐標軸的製作方法,需要之前所給大家講的比例尺一起使用。開發者僅僅需要幾行代碼,就能夠生成各式各樣的坐標軸。   與坐標軸相關的方法有:   d3.svg.axis() : 創建一個預設的新坐標軸。   axis(selection) : 將此坐標軸應用到指定的選擇集上,該選擇集需要包含有<svg>或<g>元素。   axis.scale([scale]) : 設定或獲取坐標軸的比例尺。   axis.orient([orientation]) : 設定或獲取坐標軸的方向,有四個值:top、bottom、left、right。top表示水平坐標軸的刻度在直線下方。bottom表示水平坐標軸的刻度在直線上方。left表示垂直坐標軸的刻度在直線右方。right表示垂直坐標軸的刻度在直線左方。   axis.ticks([argument...]) : 設定或獲取坐標軸的分隔數,預設為10.例如設定為5,則坐標軸上的刻度數量為6,分段數為5.這個函數會調用比例尺的ticks()   axis.tickValues([values]) : 設定或獲取坐標軸的指定刻度。例如,參數為[1,2,3,6,7,8],則在這幾個值上會有刻度。   axis.tickSize([inner,outer]): 設定或獲取坐標軸的內外刻度的長度。預設都為6   axis.innerTickSize([size]) : 設定或獲取坐標軸的內刻度的長度。內刻度指不是兩端的刻度。   axis.outerTickSize([size]) : 設定或獲取坐標軸的外刻度的長度。外刻度指兩端的刻度。   asix.tickFormat([format]) : 設定或獲取刻度的格式。     坐標軸的繪製方法: 在之前給大家介紹過,在SVG中有<path>、<line>、<text>元素,D3所繪製的坐標軸就是由這三中元素組成的。其中,坐標軸的主直線是由<path>繪製的。刻度是由<line>繪製的。刻度文字是由<text>所繪製的。舉個例子:  
 1      var width = 600;
 2         var height = 600;
 3         var svg = d3.select("#body")
 4                     .append("svg")
 5                     .attr("width",width)
 6                     .attr("height",height)
 7 
 8         // 用於坐標軸的線性比例尺
 9         var xScale = d3.scale.linear()
10                             .domain([0,10])
11                             .range([0,300])
12 
13 
14         // 定義坐標軸
15         var axisBottom = d3.svg.axis()
16                              .scale(xScale)      //使用上面定義的比例尺
17                              .orient("bottom")   //刻度方向向下
18 
19 
20         //在svg中添加一個包含坐標軸各元素的g元素
21         var gAxis = svg.append("g")
22                     .attr("transform","translate(80,80)")    //平移到(80,80)
23                     .attr("class","axis")            24 
25         //在gAxis中繪製坐標軸
26         axisBottom(gAxis)

 

坐標軸的所有圖形元素需放入<svg>或<g>里,建議新建一個g元素來控制,而不要直接放在<svg>里,因為<svg>中通常還包含有其他的圖形元素。上面代碼中,先在<body>中添加了<svg>,然後再在<svg>中添加了<g>,坐標軸就繪製在這個<g>中。繪製之後body中的元素結構如圖所示:        class為tick的<g>元素就是刻度,每一個刻度里都包含有<line>和<text>。坐標軸的主直線是最下方的<path>,其class是demain。   xScale是一個線性比例尺,其定義域為[0,10],這是坐標軸刻度值的範圍。值域為[0,300],這是坐標軸實際的像素長度。定義坐標軸時。使用scale(sScale)指定比例尺。代碼的最後一行,axis(gAxis)表示的是在gAxis選擇集中繪製坐標軸,gAxis是在<svg>中新添加的分組元素。結果如圖:     看到圖後是不是覺得這坐標軸太醜了 ~ ~ 而且刻度直線都沒有顯示出來。這是因為還沒有為坐標軸定製樣式,首先定義class類名,上面代碼第23行處。然後寫css代碼:  
 1    .axis path{
 2         fill:none;
 3         stroke : black;
 4         shape-rendering:crispEdges;
 5     }
 6     .axis line{
 7         fill:none;
 8         stroke : black;
 9         shape-rendering:crispEdges;
10     }
11     .axis text{
12         font-family: sans-serif;
13         font-size: 11px;
14     }

 

現在再看一下效果圖:      現在比之前要美觀多了。上面使用了axis(gAxis)的方式來指定繪製的位置。除此之外,還有一種常用的方式。就是之前講過的call()gAxis.call(axis)。這種方式的調用以後會很常用的。   坐標軸 刻度 說到坐標軸的屬性,基本上是在說刻度,例如刻度的方向、間隔、長度、文字格式等。上次給大家講的坐標軸,設置了刻度的方向orientation("bottom"),因此刻度在直線的下方。如果要設置在什麼值上標出刻度,使用ticks()tickValues()。舉個例子:  
 1      var width = 600;
 2         var height = 600;
 3         var svg = d3.select("#body")
 4                     .append("svg")
 5                     .attr("width",width)
 6                     .attr("height",height)
 7         //用於坐標軸的線性比例尺
 8 
 9         var xScale = d3.scale.linear()
10                             .domain([0,10])
11                             .range([0,300])
12 
13 
14         //定義坐標軸
15         var axisLeft = d3.svg.axis()
16                             .scale(xScale)
17                             .orient("left")  //刻度方向向左
18                             .ticks(5)
19 
20 
21         //在svg中添加一個包含坐標軸各元素的g元素
22         var gAxis = svg.append("g")
23                     .attr("transform","translate(80,80)")    //平移到(80,80)
24                     .attr("class","axis")
25         //在gAxis中繪製坐標軸
26         axisLeft(gAxis)

 

效果圖:       再舉個例子:  
 1      var width = 600;
 2         var height = 600;
 3         var svg = d3.select("#body")
 4                     .append("svg")
 5                     .attr("width",width)
 6                     .attr("height",height)
 7         //用於坐標軸的線性比例尺
 8 
 9         var xScale = d3.scale.linear()
10                             .domain([0,10])
11                             .range([0,300])
12 
13 
14         //定義坐標軸
15         var axisRight = d3.svg.axis()
16                             .scale(xScale)       
17                             .orient("right")    //刻度方向向右
18                             .tickValues([3,4,5,6,7])            
19 
20 
21 
22         //在svg中添加一個包含坐標軸各元素的g元素
23         var gAxis = svg.append("g")
24                     .attr("transform","translate(80,80)")    //平移到(80,80)
25                     .attr("class","axis")
26         //在gAxis中繪製坐標軸
27         axisRight(gAxis)

 

效果圖:       比例尺scale的定義域為[0,10]。上面兩個例子定義了兩個坐標軸,刻度分別位於左邊和右邊,刻度值分別用ticks()tickValues()來指定。註意刻度的區別。   上面繪製的坐標軸,刻度的直線都是相同長度的:有時候也需要不同的長度的,最常見的是首位兩個刻度的長度比內部要長。此時需要用到tickSize(),舉個例子:  
 1      var width = 600;
 2         var height = 600;
 3         var svg = d3.select("#body")
 4                     .append("svg")
 5                     .attr("width",width)
 6                     .attr("height",height)
 7         //用於坐標軸的線性比例尺
 8 
 9         var xScale = d3.scale.linear()
10                             .domain([0,10])
11                             .range([0,300])
12 
13         //定義坐標軸
14         var axiosTop = d3.svg.axis()
15                         .scale(xScale)
16                         .orient("top")  //刻度方向向上
17                         .ticks(5)
18                         .tickSize(2,4)
19               .tickFormat(d3.format("$0.1f"))
20 
21 
22         //在svg中添加一個包含坐標軸各元素的g元素
23         var gAxis = svg.append("g")
24                     .attr("transform","translate(80,80)")    //平移到(80,80)
25                     .attr("class","axis")
26         //在gAxis中繪製坐標軸
27         axiosTop(gAxis)
28         

 

tickSize()的第一個參數是內部刻度的直線長度,第二個參數是首尾兩個刻度的直線長度。也可以用innerTickSize()outerTickSize()分別進行設置。如圖,兩端的刻度線比內部的要長。       刻度文字的格式通過tickFormat()設置,此外還需要用到d3.format(),它返回的對象作為tickFormat()的參數。在d3.format()的參數里,可指定刻度文字的格式。例如在上面代碼第19行處添加.tickFormat(d3.format("$0.1f")) ,然後看一下效果圖:
    文字格式的規則遵循迷你語言的格式規範。     各比例尺的坐標軸 坐標軸必須要設置一個比例尺,根據比例尺的不同可以得到不同的坐標軸。使用的最多的是線性比例尺。下麵來看看隨著比例尺的不同,坐標軸的刻度是怎樣變化的。   一 、 線性比例尺的坐標軸:   代碼 :   
 1      var width = 600;
 2         var height = 600;
 3         var svg = d3.select("#body")
 4                     .append("svg")
 5                     .attr("width",width)
 6                     .attr("height",height)
 7 
 8         //用於坐標軸的比例尺
 9 
10         // 線性比例尺
11         var xScaleLine = d3.scale.linear()
12                         .domain([0,1])
13                         .range([0,500])
14 
15         //定義坐標軸
16 
17         var axisBottomLine = d3.svg.axis()
18                              .scale(xScaleLine)      //使用上面定義的比例尺
19                              .orient("bottom")       //刻度方向向下
20 
21 
22         //在svg中添加一個包含坐標軸各元素的g元素
23         var gAxis = svg.append("g")
24                     .attr("transform","translate(80,80)")    //平移到(80,80)
25                     .attr("class","axis")
26 
27         //在gAxis中繪製坐標軸
28         axisBottomLine(gAxis)

 

效果圖:       二 、 指數比例尺的坐標軸:   代碼:  
 1      var width = 600;
 2         var height = 600;
 3         var svg = d3.select("#body")
 4                     .append("svg")
 5                     .attr("width",width)
 6                     .attr("height",height)
 7 
 8         //用於坐標軸的比例尺
 9 
10         // 指數比例尺
11         var xScalePow = d3.scale.pow()
12                         .exponent(2)
13                         .domain([0,1])
14                         .range([0,500])
15 
16 
17         //定義坐標軸
18 
19         var axisBottompPow = d3.svg.axis()
20                              .scale(xScalePow)      //使用上面定義的比例尺
21                              .orient("bottom")      //刻度方向向下
22 
23 
24         //在svg中添加一個包含坐標軸各元素的g元素
25         var gAxis = svg.append("g")
26                     .attr("transform","translate(80,80)")    //平移到(80,80)
27                     .attr("class","axis")
28 
29         //在gAxis中繪製坐標軸
30         axisBottompPow(gAxis)

 

效果圖:

 

三 、 對數比例尺的坐標軸:

 

代碼 :

 1      var width = 600;
 2         var height = 600;
 3         var svg = d3.select("#body")
 4                     .append("svg")
 5                     .attr("width",width)
 6                     .attr("height",height)
 7 
 8         //用於坐標軸的比例尺
 9 
10         var xScaleLog = d3.scale.log()
11                             .domain([0.01,1])
12                             .range([0,500])
13 
14 
15         //定義坐標軸
16         var axisBottomLog = d3.svg.axis()
17                              .scale(xScaleLog)      //使用上面定義的比例尺
18                              .orient("bottom")      //刻度方向向下
19 
20         //在svg中添加一個包含坐標軸各元素的g元素
21         var gAxis = svg.append("g")
22                     .attr("transform","translate(80,80)")    //平移到(80,80)
23                     .attr("class","axis")
24 
25         //在gAxis中繪製坐標軸
26         axisBottomLog(gAxis)

 

效果圖:

 

其他比例尺下的坐標軸大家可以自己去試一下。

 

下一章給大家做一個帶比例尺、坐標軸的柱形圖。

 

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

-Advertisement-
Play Games
更多相關文章
  • 註意點: 概念:圖片整合技術( css sprite 或 精靈圖)。通過將多個圖片融合到一張圖片,然後通過CSS background 背景定位技術技巧佈局網頁背景 優勢:減少 http iis 請求數,減少對伺服器的請求次數,提高頁面載入雖度,從而隱形提升網站性能。同時也減少圖片文件數目。 示例: ...
  • 語法:console.info(obj1 [, obj2, ..., objN]);console.info(msg [, subst1, ..., substN]); 參數obj1 ... objN要輸出的JavaScript對象列表。對象obj1,obj2,...列出順序和輸出順序一致。 msg ...
  • 代碼不多 用css寫的話簡單一點 @media (max-width: 1024px) { #hidden { display: none; } } max-width 是要檢測的寬度 ...
  • 跨站請求偽造如何體現出功能? 每個用戶的form表單都會生成一個字元串,當然(這個後端是肯定知道這個字元串是什麼,因為他們公用一套加密方案).假設現在有一個釣魚網站想模仿正經網站,比如A向B轉100元錢,但是釣魚網站卻不知道form表單的字元串是多少,即使偽造了一個網站(首頁顯示一模一樣),填寫了相 ...
  • 很詳細的IDEA導入Eclipse項目,配置tomcat並運行項目 1.把Eclipse項目複製一份,放到自己指定的位置 2.打開Idea,在進入工程前選擇,inmport Project 註意事項:config當中要把JavaEE的插件都給先安裝好 3.在彈出的對象話框中選擇,剛纔複製的eclis ...
  • 前言: 一段時間不用sublime,打開提示我更新,不知怎麼想的鬼使神差給點了~ 然後喵喵喵??? 取消 一會又出來了 受不了啦 搞事開整~ 正文: 本想直接找個註冊碼完事,奈何好多都用不了,想著再更新麻煩,於是找了個折中的辦法一勞永逸~ 步驟:hosts屏蔽——輸入激活碼——關閉更新 hosts輸 ...
  • 前言 現在的web網站都是非常講究用戶體驗,一般都會採用服務端渲染加客戶端渲染一起實現功能。服務端渲染有利於搜索引擎優化(SEO),利於被網頁爬蟲抓取數據,多見於電商網站商品信息獲取等。客戶端渲染不利於搜索引擎優化,網頁數據非同步獲取,首頁載入時間長,用戶體驗相對較好,常用於不需要對SEO友好的地方。 ...
  • 文章歸檔 <divclass="function"id="divArchives"> <h3><#ZC_MSG028#></h3> <ul> <#CACHE_INCLUDE_ARCHIVES#> </ul> </div> 搜索 <divclass="function"id="divSearchPan ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...