d3.js 入門指南

  說到數據可視化,我們會行到很多優秀的框架,像echarts、highcharts,這些框架很優雅,健壯,能滿足我們對可視化的大部分需求,但是缺點也很明顯,就是這些框架幾乎是不可定制化的,當遇到特殊的需求,那就太難了。這個時候,聰明的小伙伴會轉而學習一些基礎的,定制化程度更高的框架,而其中最杰出的就是D3.js,由于我是專為北京地鐵定制化軟件,經常會用到數據可視化,廢話不多說先上北京地鐵路網,因為今天是入門教程,但是我不想講svg基礎知識,只講一點基礎內容餅圖,大佬請繞行。

1.繪制餅圖的預備知識

  1. 1.比例尺的使用
  2. 2.餅圖布局的使用
  3. 3.弧生成器的使用

1.比例尺的使用

  d3中有很多種比例尺,其中有四種經常使用,分別是scaleLinear線性比例尺,scaleOrdinal序數比例尺,scaleBand序數段比例尺,scaleTime時間比例尺。今天我們只介紹序數比例尺。

const colorList = ["#ffa39e", "#eaff8f", "#87e8de", "#ffd591", "#91d5ff", "#ffadd2", "#ffe58f"];
const color = d3.scaleOrdinal().domain(colorList.map((d,i) => i)).range(colorList)

使用序數比例尺將索引和顏色對應,如color(1) --> "#eaff8f"

2.餅圖布局的使用

d3中同樣有很多種布局,布局并沒有繪制的作用,他只是將原始數據轉換成繪制圖形所需要的數據的方法。餅圖布局就是將數據轉換成繪制餅圖所需要的數據,如startAngle,endAngle,index,data等數據。

let pie = d3.pie().sort(null).value(d => d.number);

  sort方法是先將傳入方法的數據做排序處理,默認降序,null參數,即保留原數據局順序。
  value方法是選擇布局要處理的數據,即按照傳入對象的number屬性值排序。既然布局是一個方法,那么試用起來非常簡單

var pieData = pie(dataset);

  這里pieData就是我們需要的數據

3.弧生成器的使用

  d3中大部分圖形都是通過path繪制的,弧生成器,就是將數據繪制出path的d屬性。

let arc = d3.arc().innerRadius(100).outerRadius(200);

  innerRadius為繪制弧的內徑,outerRadius為繪制弧的內徑,使用方式如下

arc({startAngle: 0, endAngle: 2})

  因為我們的布局就是將數據處理成startAngle,endAngle這種形式,那么畫出餅圖就變得非常簡單

selection.data(pieData).enter().append('path').attr('d', (d) => arc(d))

  這就生成了一個餅圖。

2.完整的畫一個餅圖

1.分組

  想做好一個d3的項目,分析必不可少,好的分組能代碼更簡潔優雅。餅圖大致分四個部分

  1. 弧形部分
  2. 虛線部分
  3. 文字部分
  4. 中心詳情部分
group.append('g').attr('class', 'pies');
group.append('g').attr('class', 'lines');
group.append('g').attr('class', 'texts');
const centersT = group.append('g').append('text').attr('x', 0).attr('y', 0).attr('text-anchor', 'middle').attr('dy', '-1.6em').attr('font-size', 30).attr('fill', 'none').attr('stroke', '#888').text('');
const centersC = group.append('g').append('text').attr('x', 0).attr('y', 0).attr('text-anchor', 'middle').attr('dy', '0em').attr('font-size', 30).attr('fill', 'none').attr('stroke', '#888').text('');
const centersB = group.append('g').append('text').attr('x', 0).attr('y', 0).attr('text-anchor', 'middle').attr('dy', '1.6em').attr('font-size', 30).attr('fill', 'none').attr('stroke', '#888').text('');

  這里中心詳情部分我為了簡單就沒有分組。只把三大塊分了組。

2.生成數據方法

const initData = () => {dataset = dataset.map( d => {return {name: d.name,number: Math.floor(Math.random() * 1000 + 100)}})
}

3.使用merge()方法將數據更新。

  merge()方法可以把update和enter部分的操作合一,更加方便數據更新。

let pathUpdate = group.select('.pies').selectAll('path.pie').data(pieData)
let pathEnter = pathUpdate.enter().append('path');
pathEnter.merge(pathUpdate).attr('fill', (d,i) => color(i)).attr('class', 'pie').attrTween('d', function (d) {return arc(d)})

4.繪制折線

  因為每次數據的變化勢必會影響折線的位置,這里要做一些計算

let polylineUpdate = group.select('.lines').selectAll('polyline').data(pieData);
let polylineEnter = polylineUpdate.enter().append('polyline');polylineEnter.merge(polylineUpdate).attr('fill', 'none').attr('stroke', '#333').attr('stroke-dasharray', '5,5').attr('points', d => {let direction = (d.startAngle + d.endAngle < Math.PI * 2 ? 1 : -1);return [arc.centroid(d), arc.centroid(d)[0] * 1.6, arc.centroid(d)[1] * 1.6, (innerRadius + outerRadius) * direction, arc.centroid(d)[1] * 1.6]})

  這里的arc.centroid(d)為當前扇形的中心坐標,arc.centroid(d)[0]為x坐標,arc.centroid(d)[1]為y坐標。

(d.startAngle + d.endAngle < Math.PI * 2 ? 1 : -1);

  這段代碼是判斷扇形是屬于左半面還是右半面。

5.加入一些動畫。

  transition(動畫)能讓圖形更加優雅的變化。這里主要是學習一下attrTween,直接看文檔我就不多說了。具體代碼請移步至餅圖。

  后續將發布更多的教程。

?

原創博客:轉載請注明d3.js 入門指南

?

?

轉載于:https://www.cnblogs.com/vadim-web/p/11270850.html

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

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

相關文章

【LeetCode】200. 島嶼的個數

題目 給定一個由 1&#xff08;陸地&#xff09;和 0&#xff08;水&#xff09;組成的的二維網格&#xff0c;計算島嶼的數量。一個島被水包圍&#xff0c;并且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。你可以假設網格的四個邊均被水包圍。 示例 1:輸入: 11110 110…

AI 模擬退火算法

模擬退火算法轉載于:https://www.cnblogs.com/yangwenhuan/p/10548171.html

keep用法

keep 是英語中用法靈活的動詞之一&#xff0c;下面筆者就其用法歸納如下&#xff1a; 一、用作系動詞&#xff0c;意為“保持&#xff08;某種狀態&#xff09;”&#xff0c;其后常接形容詞作表語。如&#xff1a; Please keep quiet / silent! 請保持安靜&#xff01; Aft…

Kubernetes系列之Helm介紹篇

本次系列使用的所需部署包版本都使用的目前最新的或最新穩定版&#xff0c;安裝包地址請到公眾號內回復【K8s實戰】獲取 介紹 Helm 是 Deis 開發的一個用于 Kubernetes 應用的包管理工具&#xff0c;主要用來管理 Charts。有點類似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。Helm…

HTNL筆記整合

簡述概括了HTML 的部分內容&#xff0c;不是很完善&#xff0c;希望能給予你們相對的幫助。 一下文件的整合百度云鏈接&#xff1a;HTML整合筆記 第一章 HTML入門 課時1&#xff1a;HTML初識 1、英文名&#xff08;Hyper Text Markup Language&#xff09;超文本標簽語言 對…

EXCEL 圖表 只在拐點的時候顯示數字

EXCEL圖表只在折線的拐點顯示數值&#xff0c;中間不需要顯示。同時往下拐的&#xff0c;顯示在上方&#xff0c;往上的顯示在下方&#xff0c;這樣數值不會擋住線。 首先&#xff0c;做一些模擬數據 因為起點和終點數值必須顯示&#xff0c;所以單元格&#xff0c;C2 D2 C19 D…

淺談Vue之雙向綁定

VUE實現雙向數據綁定的原理就是利用了 Object.defineProperty() 這個方法重新定義了對象獲取屬性值(get)和設置屬性值(set)的操作來實現的。那么Object.defineProperty究竟是該如何使用的呢&#xff1f;先看個例子 <!DOCTYPE html> <html lang"en"><h…

【AtCoder】AGC017

A - Biscuits dp[i][0/1]表示當前和是偶數還是奇數&#xff0c;直接轉移即可 #include <bits/stdc.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar( ) #define enter putchar…

SQL語法(1、安裝操作)

1、數據庫的系統概述及安裝與基本使用 bilibili可查找安裝視頻百度了解一下 – 使用超級管理員登錄 CONN sys/change_on_install AS SYSDBA ; – 創建c##scott用戶 CREATE USER c##scott IDENTIFIED BY tiger ; – 為用戶授權 GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE…

java 中文字符和unicode編碼值相互轉化

java 中文字符和unicode編碼值相互轉化 https://blog.csdn.net/u011366045/article/details/79235217 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/u011366045/article/details/792352171、引用工具 import com.alibaba.…

Object 及toString() 方法的重寫

Object: 是所有的類的父類 &#xff0c;Object中所有的方法 &#xff0c; 子類都能使用 &#xff0c; 接口不是Object子類。 Person: /*將父類的equals方法 重寫* 不改變父類的源代碼 equals 比較內存地址* 比較兩個成員變量 變量值相等 返回true 不等 返回false* 重…

SQL語法練習

SQL語法練習https://blog.csdn.net/qq_30764991/article/details/81952197員工表建表語句: CREATE TABLE EMP ( ENAME VARCHAR2(30), EMPNO NUMBER(5), DEPTNO NUMBER(5), JOB VARCHAR2(20), HIREDATE DATE, COMM NUMBER(6,2), SAL NUMBER(6,2) ); 部門表建表語句: CREATE TA…

第22章:MongoDB-聚合操作--聚合管道--$out

①$out$out&#xff1a;利用此操作可以將查詢結果輸出到指定的集合里面。②范例&#xff1a;將投影的結果輸出到集合里③④⑤⑥⑦⑧⑨⑩??????????轉載于:https://www.cnblogs.com/Lucky-stars/p/10555296.html

SQL簡單查詢

1、簡單查詢 使用Oracle sql developer使用前&#xff0c;必須開啟的服務&#xff1a; 查詢emp表上的數據&#xff1a; select * from emp; Null為空&#xff0c;空不代表等于沒有&#xff0c;null&#xff01;0. 重新連接后&#xff0c;注意大小寫及空格位&#xff01; 簡…

實用小技巧(一):UIScrollView中上下左右滾動方向的判斷

https://www.jianshu.com/p/93e8459b6dae 2017.06.01 01:13* 字數 674 閱讀 1201評論 0喜歡 12017.06.01 01:13* 字數 674 閱讀 1201評論 0喜歡 1 版本記錄 版本號 時間 V1.0 2017.05.31 前言 ios中又很多實用的小技巧&#xff0c;實現不難很實用&#xff0c;以后我會慢慢的…

less.js

1.變量 2.混入 3.帶參的混入 4.選擇器的繼承&#xff0c;貌似還不支持 5.嵌套規則 6.運算 7.顏色函數 8.條件語句與控制&#xff0c;貌似不支持 9.命名空間 10.注釋 11.作用域 12.字符的插入 13.轉義 14.JavaScript 的賦值轉載于:https://www.cnblogs.com/I-am-fine/archive/20…

SQL限定查詢

1、限定查詢與排序顯示 1.1限定查詢的認識&#xff1a; 列&#xff1a;表中有大數據的信息&#xff0c;對數據進行篩選&#xff0c;查詢到自己想要的信息。 &#xff08;數據過多顯示過慢&#xff0c;或者死機&#xff0c;在已有的樣本數據庫容器CDB轉換為PDB之中&#xff09;…

Centos6.10源碼部署zabbix-3.2.6

環境&#xff1a;Centos6.10 已有lnmp環境 mysql5.7 php7.2 創建zabbix數據庫 mysql> create database zabbix character set utf8 collate utf8_bin; mysql> grant all privileges on zabbix.* to zabbixlocalhost identified by zabbix; 創建zabbix用戶 shell> …

淺談五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 導讀&#xff1a;作者飛龍寫了一篇《淺談Python Web框架》&#xff0c;文中他介紹了幾個Python Web框架和自己對選擇框架的分析。在他看來&#xff0c;用Django來快速開發一些Web運用是很不錯的選擇。以下是文章內容&#xff1a…

主流瀏覽器和內核及Web標準

目前網絡市場的瀏覽器主流&#xff1a; 課時3&#xff1a;web標準 WEB標準 w3c 萬維網聯盟組織&#xff0c;制定web標準的機構。 網頁主要由三部分組成&#xff1a; 結構&#xff08;Structure&#xff09;、 表現&#xff08;Presentation&#xff09; 行為&#xff08;Beh…