d3.js 入門指南 - 儀表盤

D3的全稱是Data-Driven Documents(數據驅動的文檔),是一個用來做數據可視化的JavaScript函數庫,而JavaScript文件的后綴通常為.js,所以D3被稱為D3.js。

d3.js可以定制出各種圖形,今天來用d3.js制作一個簡易的儀表盤,廢話不多說先上demo,接下來分步講解。

1.繪制svg,并分組(group)

const height = 600; //畫布高度
const width = 1200; //畫布寬度
const outerRadius = 200; //儀表盤外半徑
const innerRadius = 190; //儀表盤內半徑
const svg = d3.select('body').append('svg').attr('width', width).attr('height', height).style('background', '#000000'); // 在body中添加寬高并繪制背景色
const group = svg.append('g').attr('class', 'group').attr('transform', `translate(${width * 0.5}, ${height * 0.5})`); //添加分組并將分組中心移至畫布中心
const arc = d3.arc().innerRadius(innerRadius).outerRadius(outerRadius) //編寫弧生成器并傳入內外半徑
const keduListB = [0,1,2,3,4,5,6,7,8,9,10,11,12]; //(大)刻度的數組
const keduListS = [0,1,2,3,4,5,6,7,8,9,10,11]; //(小)刻度的數組
const radiusScaleB = d3.scaleLinear().domain([0, 12]).range([Math.PI * (- 2 / 3), Math.PI * 2 / 3]) //(大)刻度線性比例尺
const radiusScaleS = d3.scaleLinear().domain([0, 11]).range([Math.PI * (- 11 / 18), Math.PI * ( 11 / 18 )]) //(小)刻度線性比例尺
let baseData = 0; //設置基礎速度

2.將內容分組

group.append('g').attr('class', 'pan') //繪制儀表盤的圓弧分組
group.append('g').attr('class', 'kedu_b') //繪制大刻度分組
group.append('g').attr('class', 'kedu_s') //繪制小刻度分組
group.append('g').attr('class', 'zhizhen') //繪制指針分組
group.append('g').attr('class', 'shuzi') //繪制刻度數字分組
group.append('g').attr('class', 'show') //繪制速度框和數字分組
group.append('g').attr('class', 'button') //繪制按鈕框和數字分組

3.繪制儀表盤的圓弧

group.select('.pan').append('path').attr('d', arc({startAngle: radiusScaleB(0),endAngle: radiusScaleB(12)})).attr('fill', '#6AE3F8').attr('stroke', '#6AE3F8');

4.繪制大刻度

group.select('.kedu_b').selectAll('line').data(keduListB).enter().append('line').attr('x1', d => 200 * Math.sin(radiusScaleB(d))).attr('y1', d => 200 * Math.cos(radiusScaleB(d)) * -1).attr('x2', d => 176 * Math.sin(radiusScaleB(d))).attr('y2', d => 176 * Math.cos(radiusScaleB(d)) * -1).attr('stroke', '#6AE3F8').attr('stroke-width', 5)

5.繪制小刻度

group.select('.kedu_s').selectAll('line').data(keduListS).enter().append('line').attr('x1', d => 200 * Math.sin(radiusScaleS(d))).attr('y1', d => 200 * Math.cos(radiusScaleS(d)) * -1).attr('x2', d => 180 * Math.sin(radiusScaleS(d))).attr('y2', d => 180 * Math.cos(radiusScaleS(d)) * -1).attr('stroke', '#6AE3F8').attr('stroke-width', 2)

6.繪制刻度數字

group.select('.shuzi').selectAll('text').data(keduListB).enter().append('text').attr('x', d => 160 * Math.sin(radiusScaleB(d))).attr('y', d => 160 * Math.cos(radiusScaleB(d)) * -1).attr('text-anchor', 'middle').attr('dy', '0.35em').attr('fill', '#6AE3F8').style('text-shadow', '0px 0px 2px #6AE3F8').text(d => d * 20)

7.繪制指針

group.select('.zhizhen').append('polygon').attr('points', '-2,-20,2,-20,4,0,1,140,-1,140,-4,0').attr('fill', '#6AE3F8').attr('transform', 'rotate(60)')

8.繪制速度框和數字

group.select('.show').attr('transform', 'translate(0, 100)').append('rect').attr('x', -60).attr('y', 0).attr('width', 120).attr('height', 40).attr('fill', 'none').attr('stroke', '#6AE3F8').attr('stroke-width', 3)
group.select('.show').append('text').attr('text-anchor', 'middle').attr('x', 0).attr('y', 20).attr('dy', '0.35em').attr('fill', '#6AE3F8').attr('stroke', '#6AE3F8').attr('font-size', '20px').text(`0 km/h`)

9.繪制按鈕框和數字

d3.select('.button').append('rect').attr('x', -50).attr('y', 250).attr('width', 100).attr('height', 40).attr('fill', 'none').attr('stroke', '#6AE3F8').attr('stroke-width', 2)d3.select('.button').append('text').attr('x', 0).attr('y', 270).attr('text-anchor', 'middle').attr('dy', '.35em').attr('fill', '#6AE3F8').attr('font-size', '20px').text('加速')

10.速度不斷減小,并且點擊“加速”持續加速

d3.select('.button').attr('cursor', 'pointer').on('click', () => {if (baseData < 220) {baseData += 20change()} else if (baseData < 240) {baseData = 240;change()}})
setInterval(() => {if (baseData > 10) {baseData -= 10;change();} else if (baseData > 0) {baseData = 0;change()}
}, 2000)

11.控制加速的方法(指針旋轉,速度數字增加)

const change = () => {group.select('.zhizhen').transition().duration(2000).ease(d3.easeLinear).attrTween('transform', function () {this._before = typeof this.getAttribute('transform') == 'string' ? this.getAttribute('transform').match(/\d+/g)[0] : 0;this._after = baseData;console.log('this._before',this._before)console.log('this._after',this._after)let interpolate = d3.interpolate(this._before, this._after);return function(t) {texts(interpolate(t))return `rotate(${interpolate(t)})`};})}const texts = text => {group.select('.show').select('text').attr('text-anchor', 'middle').attr('x', 0).attr('y', 20).attr('dy', '0.35em').attr('fill', '#6AE3F8').attr('stroke', '#6AE3F8').attr('font-size', '20px').text(`${Math.floor(text)} km/h`)
}

這樣點擊加速就會調用change()方法,而change()方法在過渡是就會調用texts()方法。
這樣子就好了,一個基本的儀表盤就繪制好了

?

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

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

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

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

相關文章

[轉帖]華為的“大海思”與“小海思”

華為的“大海思”與“小海思” https://www.cnbeta.com/articles/tech/828275.htm沒先到華為海思這么狠.. 作為華為的全資子公司&#xff0c;說起海思半導體&#xff0c;大家可能第一時間會想起麒麟處理器。經過多年的持續的研發投入&#xff0c;華為海思自研的麒麟處理器現在確…

H5第三天(1)

響應式布局 ?核心知識點 less媒體查詢 學習目標 掌握less基本語法能夠使用less編寫css代碼能夠掌握媒體查詢能夠使用媒體查詢實現響應式布局 Less介紹 維護CSS的弊端 CSS本質上不是一門語言,是一個簡單的樣式表.代碼維護相對老套,不夠靈活.LESS介紹 ?LESS預處理器: 依…

CocosPods 引入項目,哪些文件需要上傳到服務器呢?

以上除Podfile外&#xff0c;其它三個文件都不是必須提交的。其中Pods目錄沒必要提交&#xff0c;里面的文件都是根據Podfile描述的依賴庫的配置信息下載和生成的文件。因為CocoaPods支持語義化版本號&#xff0c;所以需要Podfile.lock文件記住當前使用的版本&#xff0c;當然這…

H5第三天(2)

移動web響應式布局 ?知識點-回顧 1. 什么是彈性盒子(伸縮布局) 2. 伸縮布局解決了什么問題 3. 伸縮盒子特點 有一條默認水平顯示的主軸有一條始終要垂直于主軸的側軸 4.重點掌握的屬性 設置伸縮盒子 display: flex;設置主軸對齊方式 justify-content設置側軸對齊方式 a…

X-AdminABP框架開發-系統日志

網站正常運行中有時出現異常在所難免&#xff0c;查看系統運行日志分析問題并能夠根據錯誤信息快速解決問題尤為重要&#xff0c;ABP對于系統運行日志這塊已經做了很好的處理&#xff0c;默認采用的Log4Net已經足夠滿足開發過程中的需要了(當然有需要的話也可以更換為其它日志組…

[Swift]LeetCode826. 安排工作以達到最大收益 | Most Profit Assigning Work

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?微信公眾號&#xff1a;山青詠芝&#xff08;shanqingyongzhi&#xff09;?博客園地址&#xff1a;山青詠芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;?GitHub地址&a…

H5第四天(1)

boostrap框架介紹 核心知識點 boostrap框架柵格系統[重點,不是難點]基本的全局樣式 學習目標 能夠使用boostrap框架中的基本樣式能夠使用柵格系統完成阿里百秀案例 boostrap框架 介紹 https://www.bootcss.com/ Bootstrap 是最受歡迎的 HTML、CSS 和 JS 框架&#xff0c;用…

javascript基礎入門知識點整理

學習目標:- 掌握編程的基本思維- 掌握編程的基本語法 typora-copy-images-to: mediaJavaScript基礎 HTML和CSS 京東 課前娛樂 眾人皆笑我瘋癲,我笑爾等看不穿 課前說明 目標&#xff1a;掌握編程的基本思想掌握JavaScript的基礎語法,使用常見API(備注)完成相應案例及練習和作業…

學習筆記-canny邊緣檢測

Canny邊緣檢測 聲明&#xff1a;閱讀本文需要了解線性代數里面的點乘&#xff08;圖像卷積的原理&#xff09;&#xff0c;高等數學里的二元函數的梯度&#xff0c;極大值定義&#xff0c;了解概率論里的二維高斯分布 1.canny邊緣檢測原理和簡介 2.實現步驟 3.總結 一、 Canny邊…

H5第四天(2)

Bootstrap框架 Bootstrap框架 為什么要學Bootstrap框架 Bootstrap框架: 為我們提供了用來實現響應式開發的公共資源 總結: Bootstrap框架用來實現響應式布局Bootstrap框架中重點學什么 Bootstrap框架提供了很多豐富的網頁開發資源,代碼有上萬行代碼.1. 重點學習框架中提供的基…

javascript高級實戰學習

學習目標:- 理解面向對象開發思想- 掌握 JavaScript 面向對象開發相關模式- 掌握在 JavaScript 中使用正則表達式- typora-copy-images-to mediaJavaScript 高級 課程介紹 課程大綱 在線地址&#xff1a;JavaScript 高級 目標 理解面向對象開發思想 掌握 JavaScript 面向對象…

H5C3筆記微整合

傳統布局&#xff08;寬度百分比設置&#xff09; 伸縮布局&#xff08;flex&#xff09; 自適應布局&#xff08;lessrem媒體查詢&#xff09; 1、less的使用 2、rem的使用 我的理解&#xff1a; 1、假如想把ui 給的圖片設置在網頁上&#xff0c;給網頁設置個份額值為 x 2、…

如何開發出優秀的APICloud應用

APICloud定制平臺項目實施規范APICloud應用優化策略Top30如何開發出運行體驗良好、高性能的App如何開發出客戶滿意、能夠順利交付的App1. 引擎或模塊問題&#xff1a; 遇到應用層無法解決的問題&#xff0c;如果能確定需要引擎和模塊支持的&#xff0c;不要自己想辦法繞過去&am…

收破爛怎么入行

收破爛分為幾個環節。1、回收&#xff08;回收利用、消息傳遞&#xff0c;消息處理&#xff09;2、集中處理&#xff08;垃圾分類&#xff0c;垃圾測試&#xff0c;垃圾投入使用&#xff0c;成品&#xff09;3、應用&#xff08;垃圾回收再應用&#xff0c;提供給需要資源的單位…

javaScript第一天(2)

javaScript基礎 1. javaScript的由來【了解】 為什么會出現js 早期出現js的原因就是為了解決一個問題: 用戶和瀏覽器(網頁)進行交互其他了解: 系統程序員Brendan Eich 設計了js語言, js語言1借鑒C語言的基本語法; (2)借鑒Java語言的數據類型和內存管理; (3)借鑒Scheme語言&…

WC2018 通道

好久以前開的坑&#xff0e; 到今天才填上&#xff0e; 首先考慮隊第一顆樹邊分&#xff0c;然后分成兩個集合\(L,R\)&#xff0c;在第二棵樹上建出虛樹&#xff0c;在每個路徑\(lca\)處統計答案&#xff0c;維護點集的直徑只有正權很好維護&#xff0e; #include <bits/std…

javaScript第一天(1)

01-JavaScript基礎 核心知識點 javaScript書寫位置javaScript變量javaScript數據類型javaScript數據類型轉換javaScript運算符 今日學習目標 能夠定義一個變量并完成變量的賦值能夠說出每一種具體的數據類型能夠數據類型之間的相互轉化能夠掌握各種運算符的作用 序言 Java…

javaScript第二天(1)

02-JavaScript基礎 1.核心知識點 運算符分支語句 【重點】斷點調試 [查看程序邏輯的一個技能] 2.今日學習目標 能夠掌握js中相關的運算符 能夠掌握理解算數運算符使用及特點能夠掌握賦值運算符的使用及特點能夠掌握一元運算符的使用及特點能夠掌握比較運算符的特點,理解等于…

第四周總結

第四周作業 這次作業屬于哪個課程C語言程序設計這個作業要求在哪里第四周作業我的課程目標全部學會這個作業在那個具體方面幫助我實現目標深入了解二維數組參考文獻教科書一&#xff0c;基礎作業 程序填空題5-1 輸入一個正整數 n (1≤n≤10)和n 階方陣a的元素&#xff0c;如果方…

2019春季學期第四周作業

2019春季學期第四周作業 這個作業屬于那個課程C語言程序設計Ⅰ這次作業要求在哪里2019春季學期第四周作業我在這個課程的目標是我希望能夠更加掌握循環和排序參考文獻無選擇法排序 本題要求將給定的n個整數從大到小排序后輸出。輸入格式&#xff1a; 輸入第一行給出一個不超過1…