【D3.js in Action 3 精譯_044】5.1 餅圖和環形圖的創建(四):數據標簽的添加

當前內容所在位置:

  • 第五章 餅圖布局與堆疊布局 ??
    • 5.1 餅圖和環形圖的創建 ??
      • 5.1.1 準備階段(一)
      • 5.1.2 餅圖布局生成器(二)
      • 5.1.3 圓弧的繪制(三) ??
      • 5.1.4 數據標簽的添加(四)

文章目錄

      • 5.1.4 數據標簽的添加 Adding labels

《D3.js in Action》全新第三版封面

《D3.js in Action》全新第三版封面

譯者按
繼上一小節利用全新的 D3 餅圖布局實現圓弧的繪制后,這一節再趁熱打鐵,看看如何從增強圖表的可讀性出發,再進行一些細節調整。

5.1.4 數據標簽的添加 Adding labels

第四章曾經提過,餅圖理解起來偶爾也會很費勁,因為人的大腦并不擅長將角度值轉為對應的比例大小。為此,可以通過在每段圓弧的中心添加一個表示對應百分數的數據標簽,旨在增強環形圖的可讀性,就像之前在第四章中實現的環形圖那樣。

如代碼清單 5.5 所示,我們稍微修改了一下用于生成圓弧部分的代碼(根據代碼清單 5.4)。首先利用 D3 數據綁定機制新增一個 SVG 分組而非路徑元素 path。然后再將 path 元素(用于繪制圓弧)和 SVG 文本元素(代表標簽)添加到剛才的分組元素內。由于父級元素會將綁定的數據傳給它的子級,因此在繪制圓弧與數據標簽時可以直接訪問到綁定的數據項。

與上一章類似,這里同樣通過調用圓弧生成器來繪制圓弧。至于數據標簽的具體內容,則需要算出每段圓弧對應的比例或百分比。該比值可以通過圓弧終止角減去起始角、并將結果除以 (即一個整圓的弧度值)算得。注意,這里用到了括號表示法(即 d["percentage"])將百分比值存入綁定數據項。當需要對不同屬性進行相同的計算時,這個操作技巧會非常實用,可以避免大量的重復運算。要返回數據標簽的文本內容,需要將算得的百分數傳入格式化函數 d3.format(".0%") 中,得到一個四舍五入后的結果,然后在末尾追加一個百分號即可。

每段圓弧的形心,即數據標簽放置的具體位置,也是應用與上一章相同的方法求取。在設置數據標簽的 x 屬性(attribute)時,需要提前算出對應形心的坐標(具體用法詳見第 4 章)并存入綁定數據項中(即 d[""centroid])。這樣在設置 y 屬性的值時,就能直接通過 d.centroid 拿到圓弧形心的坐標數組了。

為了確保數據標簽在圓弧形心位置居中對齊(包括水平及垂直方向),需要分別將其 text-anchor 屬性和 dominant-baseline 屬性指定為 middle。同時還要利用 fill 屬性將文字顏色設置為白色、字號設為 16px、字體粗細為 500,以進一步提高文本標簽的可讀性。

保存代碼并重新加載示例頁面,會發現數據標簽在大段圓弧上顯示良好,但在圓弧較短時根本看不清楚讀數。在專業級可視化項目中,可以通過將圓弧較短的標簽移至環形圖外圍來解決這個問題。在本例中,我們只需在百分比值小于 5% 時,將其 fill-opacity 的屬性值設為 0 即可,這樣就實現了數據標簽的隱藏。最終效果如圖 5.8 所示。

代碼清單 5.5 在每段圓弧的形心位置添加數據標簽(詳見 donut-charts.js 文件)

const arcs = donutContainer.selectAll(`.arc-${year}`).data(annotatedData).join("g") // 利用數據綁定機制添加 SVG 分組元素而非 path 元素.attr("class", `arc-${year}`);arcs // 在每個分組內添加一個 path 元素,并調用圓弧生成器來繪制圓弧。然后利用顏色比例尺設置其 fill 屬性值.append("path")                                 .attr("d", arcGenerator)                       .attr("fill", d => colorScale(d.data.format)); arcs.append("text") // 再給每個分組添加一個 text 文本元素.text(d => {d["percentage"] = (d.endAngle - d.startAngle) // 計算每段圓弧的百分數占比作為文本標簽的值,并存入綁定數據項中(d["percentage"])/ (2 * Math.PI);                                             return d3.format(".0%")(d.percentage);                         }).attr("x", d => { // 獲取每段圓弧的形心位置并存入綁定數據項,然后分別用于數據標簽 x 與 y 屬性的賦值d["centroid"] = arcGenerator.startAngle(d.startAngle).endAngle(d.endAngle).centroid();return d.centroid[0];})                             .attr("y", d => d.centroid[1]).attr("text-anchor", "middle").attr("dominant-baseline", "middle").attr("fill", "#f6fafc")// 隱藏圓弧上百分比小于 5% 的數據標簽.attr("fill-opacity", d => d.percentage < 0.05 ? 0 : 1)                       .style("font-size", "16px").style("font-weight", 500);

圖 5.8 添加了百分比數據標簽的環形圖效果

【圖 5.8 添加了百分比數據標簽的環形圖效果】

最后,還需要將環形圖的中心位置用一個文本標簽來顯示其代表的年份。同理,這可以通過給每個環形圖容器添加一個 text 文本元素來實現。由于當前仍處于年份數組的 For 循環中,因此可以直接將當前年份設為標簽的文本內容。此外,由于環形圖容器已經位于圖標的中心位置,文本元素會自動定位到指定為止,我們要做的僅僅是將其 text-anchor 屬性和 dominant-baseline 屬性指定為水平和垂直居中即可。最終效果如圖 5.9 所示。

donutContainer.append("text").text(year).attr("text-anchor", "middle").attr("dominant-baseline", "middle").style("font-size", "24px").style("font-weight", 500);

至此,示例頁環形圖部分的實現就大功告成啦!

圖 5.9 繪制完成的帶年份標簽的環形圖最終效果

【圖 5.9 繪制完成的帶年份標簽的環形圖最終效果】

最后再來復盤一下 D3 餅圖或環形圖的繪制流程,如圖 5.10 所示。首先,利用 D3 的布局函數 d3.pie() 對數據進行預處理,得到含有各片段角度值信息的帶注解的數據集;其次,利用圓弧生成器來繪制圓弧,該函數會從帶注解的數據集中提取相關的角度值信息,并返回每個路徑元素的 d 屬性值;最后,我們通過添加數據標簽來提高圖表的可讀性,需要用到 SVG 的 text 文本元素。

圖 5.10 創建 D3 餅圖或環形圖的主要步驟

【圖 5.10 創建 D3 餅圖或環形圖的主要步驟】



另附:專欄文章連載期間 完全免費,后續 不排除 調整為收費專欄。對 D3.js 感興趣、或者想要從零開始徹底掌握 D3 的朋友們強烈建議及時關注本專欄,一起學習交流,共同進步!

目前譯好的其他章節內容如下(可進入專欄查看詳情):

  • 第一部分 D3.js 基礎知識
    • 第一章 D3.js 簡介(已完結)
      • 1.1 何為 D3.js?
      • 1.2 D3 生態系統——入門須知
      • 1.3 數據可視化最佳實踐(上)
      • 1.3 數據可視化最佳實踐(下)
      • 1.4 本章小結
    • 第二章 DOM 的操作方法(已完結)
      • 2.1 第一個 D3 可視化圖表
      • 2.2 環境準備
      • 2.3 用 D3 選中頁面元素
      • 2.4 向選擇集添加元素
      • 2.5 用 D3 設置與修改元素屬性
      • 2.6 用 D3 設置與修改元素樣式
      • 2.7 本章小結
    • 第三章 數據的處理(已完結)
      • 3.1 理解數據
      • 3.2 準備數據
      • 3.3 將數據綁定到 DOM 元素
        • 3.3.1 利用數據給 DOM 屬性動態賦值
      • 3.4 讓數據適應屏幕
        • 3.4.1 比例尺簡介(上篇)
        • 3.4.2 線性比例尺(中篇)
          • 3.4.2.1 基于 Mocha 測試 D3 線性比例尺(DIY 實戰)
        • 3.4.3 分段比例尺(下篇)
          • 3.4.3.1 使用 Observable 在線繪制 D3 條形圖(DIY 實戰)
      • 3.5 加注圖表標簽(上篇)
        • 3.5.1 人物專訪:Krisztina Sz?cs(下篇)
      • 3.6 本章小結
    • 第四章 直線、曲線與弧線的繪制
      • 4.1 坐標軸的創建(上篇)
        • 4.1.1 D3 中的邊距約定(中篇)
        • 4.1.2 坐標軸的生成(中篇)
          • 4.1.2.1 比例尺的聲明(中篇)
          • 4.1.2.2 坐標軸的添加(下篇)
          • 4.1.2.3 軸標簽的添加(下篇)
      • 4.2 D3 折線圖的繪制
        • 4.2.1 直線生成工具的使用
        • 4.2.2 對數據點作曲線插值處理
      • 4.3 D3 面積圖的繪制
        • 4.3.1 面積圖生成工具的用法
        • 4.3.2 用標簽提高圖表的可讀性
      • 4.4 D3 弧形圖的繪制
        • 4.4.1 D3 中的極坐標系
        • 4.4.2 圓弧生成器的使用
        • 4.4.3 圓弧形心的計算
        • 4.4.4 人物專訪:Francis Gagnon、Patricia Angkiriwang 和 Olivia Gélinas
      • 4.5 本章小結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62605.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java全棧day13-后端Web實戰2

接上述查詢部門實現&#xff0c;完成后續要求 一、統一響應結果 1.1步驟 資料如下 對一開始的代碼修改如下 結果如下 1.2測試 指定請求方式 結果 小結 二、前后端聯調測試 資料如下&#xff1a; (不行&#xff0c;一定要不帶空格和不帶中文&#xff0c;要不然啟動不了試了半天…

AWS sdk for s3 - S3 client

背景 在產品環境上通過 http 的方式訪問 aws s3 是不安全的&#xff0c;需要使用aws sdk 提供的接口來訪問 技術實現 項目中使用的是java 1. 在gradel 中引用對應的aws 包 implementation ‘software.amazon.awssdk:s3:2.20.80’ // aws sdk implementation ‘software.am…

Android的SurfaceView和TextureView介紹

文章目錄 前言一、什么是SurfaceView &#xff1f;1.1 SurfaceView 使用示例1.2 SurfaceView 源碼概述1.3 SurfaceView 的構造與初始化1.4 SurfaceHolder.Callback 回調接口1.5 SurfaceView 渲染機制 二、什么是TextureView&#xff1f;2.1 TextureView 使用示例2.2 TextureVie…

vscode 排除文件夾搜索

排除的文件夾 node_modules/,dist/

優雅的@ObservedV2和@Trace裝飾器

Hello&#xff0c;大家好&#xff0c;我是 V 哥。在HarmonyOS NEXT開發中&#xff0c;ObservedV2裝飾器和Trace裝飾器是用于狀態管理的兩個裝飾器&#xff0c;它們在HarmonyOS應用開發中用于增強對類對象中屬性的觀測能力。如果你學過觀察者模式的原理&#xff0c;你會更容易理…

備戰藍橋第一天 驗證回文串 楊輝三角

LCR 018. 驗證回文串 - 力扣&#xff08;LeetCode&#xff09; 涉及的函數&#xff1a; int isalnum ( int c ); 檢查字符是否為字母數字 int tolower ( int c ); 將大寫字母轉換為小寫 void reverse (BidirectionalIterator first, BidirectionalIterator last); 反轉區域中…

【實戰】提升List性能方法有幾何

在內存中的 List<T> 上使用 LINQ 查詢時&#xff0c;加索引并不像數據庫那樣有內置支持&#xff0c;但可以通過以下方式提高查詢性能&#xff1a; 1. 手動構建索引 可以手動構建一個字典 (Dictionary<TKey, TValue>)&#xff0c;將需要查詢的字段作為鍵&#xff0…

一款免費、簡單、快速的JS打印插件,web 打印組件,基于JavaScript開發,支持數據分組,快速分頁批量預覽,打印,轉pdf,移動端,PC端

前言 在數字化辦公時代&#xff0c;打印需求呈現多樣化和復雜化的趨勢。現有的打印軟件往往存在cao作繁瑣、兼容性差、功能單一等問題&#xff0c;難以滿足現代企業高效、靈活的打印需求。 為了解決這些痛點&#xff0c;一款簡單、高效、多功能的打印插件成為了迫切需求。 介…

Python pywin32庫詳解

一、引言 在Python編程中&#xff0c;有時候需要與Windows操作系統進行交互&#xff0c;執行一些特定的系統操作或操作 Windows 應用程序。這時&#xff0c;pywin32庫就成為了一個非常強大的工具。pywin32庫提供了對Windows API的訪問&#xff0c;使得Python開發者能夠在Windo…

Uniapp的vue、nvue、uvue后綴名區別

在 UniApp 中&#xff0c;.vue、.nvue 和 .uvue 是不同的文件后綴名&#xff0c;每個文件格式的使用場景和兼容性略有不同。下面是每個文件后綴的詳細解釋以及它們的兼容性&#xff1a; 1. .vue 文件 定義&#xff1a;.vue 是標準的 Vue 單文件組件格式&#xff0c;主要用于基…

TCP/IP雜記

TCP三次握手、四次揮手 從應用角度&#xff0c;不用多考慮為什么有三次&#xff0c;遵循標準即可。 ubuntu 下 wireshark安裝&#xff1a; sudo add-apt-repository universe sudo apt install wireshark 三次握手實證&#xff1a; 第一次握手的情況如下&#xff1a;&#…

Vue前端開發-接收跳轉參數

路由攜帶參數跳轉到目標頁面后&#xff0c;頁面組件可以接收到攜帶傳入的參數&#xff0c;接收的方式與攜帶的方式相關&#xff0c;如果是采用查詢字符串方式攜帶&#xff0c;那么可以通過路由中的query對象獲取到參數&#xff0c;如果是其他方式&#xff0c;通常都是通過路由中…

力扣--LCR 177.撞色搭配

題目 整數數組 sockets 記錄了一個襪子禮盒的顏色分布情況&#xff0c;其中 sockets[i] 表示該襪子的顏色編號。禮盒中除了一款撞色搭配的襪子&#xff0c;每種顏色的襪子均有兩只。請設計一個程序&#xff0c;在時間復雜度 O(n)&#xff0c;空間復雜度O(1) 內找到這雙撞色搭配…

[ComfyUI]批量生成圖片的節點:輸入一個prompt列表批量生成圖像

文章目錄 1.參考資料2.兩個節點的部署FizzNodes節點comfyui-mixlab-nodes 生成的結果展示 1.參考資料 如何使用ComfyUI一次批量生成不同內容的圖片 ComfyUI工作流】隨機提示詞批量出圖&#xff0c;懶人刷圖福音&#xff0c;根據提示 2.兩個節點的部署 FizzNodes節點 fizzn…

【實操GPT-SoVits】聲音克隆模型圖文版教程

項目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速實操GPT-SoVits項目&#xff0c;不闡述技術原理&#xff08;后期如果有時間研究&#…

5G模組AT命令腳本-關閉模組的IP過濾功能

關閉模組的IP過濾功能 關閉模組的IP過濾功能 5G 模組通常使用nat方式為 下掛設備或上位機提供上網服務&#xff0c;默認情況&#xff0c;不做NAt的包無法經由 模組轉發&#xff0c;如果禁掉這個限制 &#xff0c;可使用本文中的配置命令本腳本用于關閉模組的IP過濾功能&#xf…

JAVA (Springboot) i18n國際化語言配置

JAVA i18n國際化語言配置 一、簡介二、功能三、Java配置國際化步驟四、Java國際化配置工具類五、Spring Boot配置六、測試 一、簡介 在Java中&#xff0c;國際化&#xff08;Internationalization&#xff0c;通常簡稱為i18n&#xff09;是一個過程&#xff0c;它允許應用程…

如何創建基于udp的客戶端和服務端

1.先創建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…

【上線文檔】系統上線方案模板,計算機系統上線保障計劃,系統運維信息系統運行保障方案,系統上線方案模板(Word原件)

一、項目背景和目標 二、項目需求分析 2.1 功能需求 2.2 非功能需求 三、系統設計 3.1 系統架構設計 3.2 數據庫設計 3.3 接口設計 3.4 用戶界面設計 四、系統開發 4.1 開發環境搭建 4.2 業務邏輯開發 4.3 數據庫實現 4.4 接口實現 4.5 用戶界面實現 五、系統測…

大模型應用的數字能源數據集

除了尚須時日的量子計算解決算力效率和能源問題&#xff0c;以及正在路上的超越transformer的全新模型架構外&#xff0c;無疑是“數據集”&#xff0c;準確講是“高質量大規模多樣性的數據集”。數據集是大模型發展的核心要素之一&#xff0c;是大計算的標的物&#xff0c;是實…