D3.js
RD讀書會技術學習分享
上德 20190816
SVG的使用方式(補充)
SVG格式為XML的一種,在網頁中使用SVG圖檔有兩種方式:
1. 使用<img src="img.svg">標籤連結.svg檔案
2. 使用<svg>…一堆標籤…</svg>標籤
SVG繪製流程(方法一)
苦學三個月
Coding svg標籤
畫出普通蘋果
SVG繪製流程(方法二)
畫出金蘋果
Neil大大打開illastrator
跪求Neil大大
那如果不但要畫蘋果�又要隨著數據改變蘋果的樣子�蘋果還要會動,還要跟你互動呢…?��
今天會介紹到D3.js的這些功能
學習資源
https://ithelp.ithome.com.tw/articles/10201584
寫的不錯的部落格
https://www.oxxostudio.tw/search-results.html?s=d3
d3.js 教程
http://www.tastones.com/zh-tw/tutorial/d3js/
Kuro大簡短的入門介紹 - D3.js 圖表優化二三事
https://www.youtube.com/watch?v=mEkWpwXE6oo
資料視覺化部落格
版本差異
v3: d3.scale.linear()
v4↑: d3.scaleLinear()
Data Driven Documents
D3.js
Data
圖表元素
Selection
(Data Join)
資料運算函式
圖型運算函式
互動
動畫
…
選擇器
d3.select('selector')
d3.selectAll('selector')
*tip: 當成jquery的$('selector')來用即可
Data-Join的兩個方法
selection.datum()
selection.data()
Data-Join的三種概念(Enter、Update、Exit)
Data-Join常用的寫法
https://codepen.io/cdpqdnvr/pen/VJwjPa
單個元素操作
selection.attr('attribute-name', 'value')
selection.classed('class-name', bool) // bool: true/false
selection.style('style-name', 'value')
*tip: 直接當jQuery寫就可以了
多個元素操作
selection.attr('attribute-name', function(data, index, nodes){
return 各別元素的value
})
selection.classed('class-name', function(data, index, nodes){
return 各別元素true/false
})
selection.style('style-name', function(data, index, nodes){
return 各別元素的value
})
*tip: 直接當jQuery寫就可以了
自己計算座標來繪圖有點辛苦…
http://jsfiddle.net/upstairs0102/a1fku6ec/33/
此範例中的長條圖及數字,分別手動計算圖形的長寬以及座標,這樣有一些缺點:
比例尺 - 線性比例尺(Linear Scale)
比例尺 – 序數比例尺(Oridinal Scale)
let scale = d3.scaleOrdinal()
.domain(['like', 'wow', 'ha', 'love', 'cry', 'angry'])
.range(['#de6868', '#b94141', '#81a7a6', '#aad0ac', '#5496b1', '#ffca72’])
scale('wow') // #b94141
實例 – 色彩系統
比例尺 – 序數點比例尺(Point Scale)
let scale = d3.scalePoint()
.domain(['like', 'wow', 'ha', 'love', 'cry', 'angry'])
.range([0, 100])
scale(love) // 60
其他比例尺
其他還有一堆比例尺和各種不同的API搭配
座標軸
let axis = d3.axisBottom()
.scale(scale) // 放入比例尺
// 設定刻度文字格式
axis.tickFormat(function(d){
return d
})
// 設定刻度分段數量
axis.ticks(number)
// 指定特定的刻度(和asix.ticks()不能共用)
axis.tickValues([value1, value2, value3])
實例
動畫 -過渡(transition)
transition.delay(ms) 延遲開始的時間,單位是毫秒
transition.duration(ms) 過渡的持續時間
transition.ease(type) 過渡樣式,包含linear、cubic、elastic、back、bounce…等
https://bl.ocks.org/d3noob/1ea51d03775b9650e8dfd03474e202fe
transition範例
範例1:在<svg>中加入一個矩形,從座標(10,10)位移到(50,50)
範例2:加入一個矩形,從寬度100過渡為寬度300,此外還增加ease()、過渡樣式設定為”bounce”
動畫 - tween和interpolate的搭配
實作 – 繪製長條圖
顏色(1)
D3的顏色有RGB和HSL兩種方法,可以互相轉換。
d3.rgb(r,g,b) 以rgb作參數,範圍都為0~255
d3.rgb(color) 輸入顏色字串,可用多種的格式包含"rgb(255,255,255)"、"hsl(120,0.5,0.5)"、"#ff0000"、"red"
rgb.brighter(k) 顏色變更亮
rgb.darker(k) 顏色變更暗
rgb.hsl() RGB轉換為HSL物件
rgb.toString() RGB物件轉字串,輸出格式為"#ff0000“
d3.hsl(h,s,l) h為色相(Hue)範圍0~360、s為飽和度(Saturation)範圍0~1、l為亮度(Lightness)範圍0~1
d3.hsl(color) 輸入顏色字串
也可以使用brighter()、darker()、rgb()(轉換為rgb)、toString()方法
顏色(2)
要計算介於兩個顏色之間的顏色,可以使用內插(Interpolation),使用方法為
d3.interpolate(a,b)
線產生器d3.line() (1)
線產生器d3.line() (2)
區域產生器d3.area()
弧產生器d3.arc()
d3.arc() 建立弧產生器,回傳可使用的函式
src.innterRadius() 內半徑
src.outerRadius() 外半徑
src.startAngle() 起始角度
src.endAngle() 結束角度
角度的單位是π,0°時是0π、180°是1π、360°是2π,可以使用Math.PI來計算。
實作 – 繪製圓餅圖
Layout
Layout之很簡單範例 – �使用d3.pie()產生所需資料繪製圓餅圖
塞入d3.arc()
(見前面範例)
總結
令人髮指的
Api list