D3.js

D3.jsD3Data-Driven Documents)是一个使用动态图形進行資料視覺化的JavaScript程式庫。與W3C标准相容,并且利用广泛实现的SVG、JavaScript和CSS标准,改良自早期的Protovis程式庫。与其他的程式庫相比,D3对视图结果有很大的可控性。D3是2011年面世的,同年的8月发布了2.0.0版。到2021年9月,D3已被更新到了7.0.3版,最常被運用在線上新聞網站呈現交互式圖形、呈現數據資料的圖表和呈現含有地理資訊的資料。另外SVG的輸出功能也使得D3.js能用於印刷出版物的繪製上。

歷史
在D3.js開發之前已經有出現過許多嘗試做資料視覺化的套件,例如,Flare和Protovis程式庫,他們都可以視為D3.js的前身。然而Prefuse和Flare皆有缺點,皆不能只透過瀏覽器完成渲染,皆須要透過額外插件來完成。

例如2005年釋出的Prefuse是一個資料視覺化程式庫,但是它需要透過網頁的Java插件才能於瀏覽器中呈現;而Flare是2007年釋出的另一個資料視覺化工具包,由於其是使用ActionScript程式語言開發,因此也需要額外插件,即Flash插件才能完成渲染。

2009年,史丹佛大學的史丹佛視覺化團隊(Stanford Visualization Group)的傑佛瑞·赫爾、和瓦迪姆·歐格菲茲齊利用開發Prefuse和Flare的經驗開始用Javscript開發了可從給定資料產生SVG圖形的Protovis程式庫。而Protovis程式庫在業界和學界皆有一定的知名度。

2011年,史丹佛視覺化團隊停止開發Protovis,並開始開發新的資料視覺化程式庫,藉由之前開發Protovis的經驗,開發出了D3.js程式庫,在注重於Web標準的同時提供了更豐富的平台也有了更好的效能。

技術原理
D3.js透過預先建立好遷入於網頁中的JavaScript函數來選擇網頁元素、建立SVG元素、調整CSS來呈現資料,並且也可以設定動畫、動態改變物件狀態或加入工具提示來完成使用者互動功能。使用簡單的D3.js函數就能夠將大型的數據資料結構與SVG物件進行綁定,並且能生成格式化文本和各種圖表。其數據資料結構的格式可以是JSON、CSV(以逗號分隔的資料)或GeoJSON,也可以透過自己寫JavaScript函數來讀取其他或自定義格式的資料,例如Shapefile。

物件選擇
D3.js所使用的物件選擇方式是透過使用CSS樣式選擇器來選擇一個或多個或一組文档对象模型物件,然後透過類似jQuery的方式控制所選的物件{{#tag:ref|。

// 資料
var countriesData = [
{ name:"Ireland", income:53000, life: 78, pop:6378, color: "black"},
{ name:"Norway", income:73000, life: 87, pop:5084, color: "blue" },
{ name:"Tanzania", income:27000, life: 50, pop:3407, color: "grey" }
];
// 建立svg網頁物件
var svg = d3.select("#hook").append("svg")
.attr("width", 120)
.attr("height", 120)
.style("background-color", "#D0D0D0");
// 從資料建立關聯的svg網頁元素
svg.selectAll("circle") // 建立還不存在的圓形樣板
.data(countriesData) // 綁定資料
.enter() // 對每個資料......
.append("circle") // 綁定資料列中的......資料到圓形
.attr("id", function(d) { return d.name }) // 圓形的id為國家名
.attr("cx", function(d) { return d.income / 1000 }) // 圓形的x坐標位置為收入
.attr("cy", function(d) { return d.life }) // 圓形的y坐標位置為預期收入
.attr("r", function(d) { return d.pop / 1000 *2 }) // 圓形的半徑為國家人口數
.attr("fill", function(d) { return d.color }); // 給表示不同國家的圓形不同顏色

資料讀取
D3.js除了有提供將載入的資料直接繪成物件的功能之外,也支援從檔案讀取資料並直接生成SVG圖像。此應用使得D3.js可以用簡單的程式碼完成與地理資訊相關的資料視覺化,而新版本的D3.js也改善了地理座標的轉換系統,因此能準確地呈現包含地理資訊的圖表,例如「japan.json」中存了日本的GeoJSON地理資訊,則D3.js可以直接並載入並顯示日本地圖:

d3.json("japan.json", function(topodata) {//載入JSON檔案
var features = topojson.feature(//從GeoJSON中取出日本地形
topodata,
topodata.objects["japan"]
).features;
var path = d3.geo.path().projection(
d3.geo.mercator()
.center([138,37]) //指定為日本經緯度位置
.scale(6000) //放大至符合圖形大小
);
d3.select("svg")
.selectAll("path") // 建立還不存在的路徑物件樣板
.data(features) // 綁定日本地形資料
.enter() // 對所有的物件.....
.append("path") // 插入路徑物件
.attr("d",path); // 路徑物件的路徑依照日本經緯度位置填入地形資料
});

然而許多政府機關提供的文件皆為Shapefile,而由於D3.js也可以透過自己寫JavaScript函式或引用他第三方程式庫來讀取其他例如Shapefile的資料。接在.enter()函數後方的指令會作用在所有資料上並設定到前一段指令selectAll()選擇的網頁元素中所有未就緒的網頁元素。

其他特色
除了D3.js之外亦有許多可以抓取並處理資料的程式庫,例如jQuery,但D3.js與jQuery不同於,D3.js使用了數據驅動化來更有效地處理資料,例如,原先使用迴圈來處理資料,並且要預先把網頁元素產生出來,而D3.js則可以使用select或selectAll來批次完成資料處理,並會會視情況自動生成所需的網頁元素,而使得網頁有更多的彈性,也能支援能動態地即時地作出反應的互動性功能。

相關程式庫
Three.js
D3.js可以與Three.js結合,透過結合了D3.js的資料視覺化、圖表產生與Three.js的WebGL特性可以實現三維資料視覺化、圖表的呈現。

參考文獻
延伸閱讀
;D3.js入門相關文章
*
*
;D3.js進階相關文章
*
*
;其他D3.js相關文章
*
*
*
*
*
*
*
;影片資源
*
*

外部連結
*

评论 (0)

  • 还没有评论,来抢沙发吧。