D3.js系列 --- 初識

levin在掘金發表於2018-07-26

D3.js(Data-Driven Documents)即被資料驅動的文件,它是一個用於根據資料來操作文件的JavaScript庫。相比於echart, antv等其他圖表庫,它算是一個比較底層的資料視覺化工具。它不提供任何一種現成的圖表,只做最基礎的東西,所有的圖表都需要我們在它的庫裡挑選合適的方法進行構建。在一切即資料的今天,我們更需要做到讓資料活起來,展現資料之美。

D3

簡介

猶抱琵琶半遮面,千呼萬喚中終於要接觸資料視覺化了。資料視覺化越來越流行,讓複雜的資料和文字變得十分容易理解。作為其中的佼佼者,當然要先侃一下我們的D3了。

D3.js 是基於資料驅動文件工作方式的一款JavaScript函式庫,主要用於網頁作圖、生成互動圖形,是最流行的視覺化庫之一,它被很多其他的表格外掛所使用。D3使你有能力藉助HTML,SVG和CSS來生動地視覺化各種資料。一句話,D3根據現有的web標準,將強大的視覺化,動態互動和資料驅動的DOM操作方法完美結合,進而來製作炫目的視覺化效果。

比較一下D3和JQuery

同是操作DOM的,就少不了被拿出來比較一下:

  • D3是資料驅動的,JQuery不是:我們使用JQuery選擇器$()直接操縱元素;D3通過專有的datum(),data(),enter()和exit()方法提供資料和回撥,然後操作元素
  • D3用來做資料視覺化,jQuery用來建立web應用

使用

在這裡下載最新的版本(5.5.0):

直接連結到最新版本:

<script src="https://d3js.org/d3.v5.min.js"></script>
複製程式碼

NPM:

npm install d3
複製程式碼

Yarn:

yarn add d3
複製程式碼

瀏覽器支援情況

D3支援的主流瀏覽器不包括IE8及以前的版本。D3在Chrome、Firefox、Safari、Opera和IE9上都能正常使用。D3的大部分元件可以在舊的瀏覽器執行。

簡單示例(實現一個簡單的圖表)

柱形圖簡明、醒目,是一種簡單常用的圖表,主要構成部分有矩形、座標軸和文字說明。這個例子只繪製矩形的部分。

假設給了我們一組資料,[30, 86, 168, 281, 303, 365],根據圖片我們可以直觀的看出這些資料的關係

柱形圖

下面就讓我們一步一步的去實現它。

選擇集

在jQuery中我們使用選擇器$()去選擇元素,在d3中我們引入一個新的名詞叫做選擇集。使用 d3.select() 或 d3.selectAll() 選擇元素後返回的物件,就是選擇集。

  • d3.select() - 從當前文件中選擇一個元素
  • d3.selectAll() - 從當前文件中選擇多個元素
  • selection.style() - 取得或設定樣式屬性

D3中我們可以像jQuery一樣使用鏈式語法

d3.select()
  .selectAll()
  .style('color', 'red');
複製程式碼

資料繫結

D3中我們可以把資料繫結到DOM上,它可以通過函式來實現:

  • selection.datum() - 取得或設定單個元素的資料
  • selection.data() - 取得或設定一組元素的資料

以下是一個使用說明:

var dataset = ['Beijing', 'Shanghai', 'Tianjin', 'Chongqing'];
var p = body.selectAll('p');
p.data(dataset)
.text(function(d, i) {
  return d;
});
複製程式碼

這樣就把資料繫結到了p標籤上,函式function(d, i){}包含兩個引數,d代表資料,這裡就是與元素繫結的資料;i代表索引,從0開始

畫布

要繪圖,首先需要的是一塊"畫布"。HTML5中提供了兩種強有力的"畫布": SVG和Canvas。這裡不多做解釋。

D3提供了眾多的SVG圖形的生成器,我們在SVG畫布中實現它。

新增畫布如下:

let svg = d3.select('body')  //選擇文件中的body元素
  .append('svg');     //新增一個svg元素
複製程式碼

繪製矩形

繪製矩形之前我們的SVG元素裡面還沒有rect元素,我們就需要自己為它新增補全,需要鏈式使用selection.enter()和selection.append()來實現。

svg.selectAll("rect")
  .data(data)  // 繫結資料
  .enter()      // 為缺失的元素返回佔位符
  .append("rect")    // 新增足夠數量的矩形元素
  .attr("x",20 + 'px')     //設定矩形的x軸和y軸位置
  .attr("y",function(d,i){
    return i * 28 + 'px';
  })
  .style("width",function(d){  // 設定矩形的寬高
    return d + 'px';
  })
  .style("height",26 + 'px')
  .text(function(d) {
    return d;
  })
複製程式碼

一個簡單的柱形圖就成功了,實現效果如下圖

矩形效果圖