暗黑3 告訴你資料長什麼樣子?

http://goo.gl/4k5pxt

Veck Hsiao @ 2015/12/21

Who am I

Veck Hsiao (蕭奕凱)

露天拍賣網頁工程師

Who am I

GitHub: fbukevin

Spermatozoa

Open Data

近年來政府單位或組織開放公開資料,促進資料分析、應用與視覺化發展

Data Visualization

將資料集以圖形或動畫的直觀方式呈現

D3.js

Who use D3.js

台灣之光

Who use D3.js

台灣之光

Who use D3.js

台灣之光

Technology

CSS

設定圖形元件的樣式

Technology

<svg>、HTML <canvas>

將資料以圖形方式呈現


Technology

JavaScript

操作與控制資料和圖形元件

Partition

d3 共有 8 大塊:

Layout

D3 內建 Layout 類別

D3 內建 Layout 類別 - Bundle

D3 內建 Layout 類別 - Chord

D3 內建 Layout 類別 - Force

D3 內建 Layout 類別 - Hierarchy

The hierarchy layout is an abstract layout that is not used directly.
- d3 wiki

D3 內建 Layout 類別 - Histogram

D3 內建 Layout 類別 - Pack

D3 內建 Layout 類別 - Partition

D3 內建 Layout 類別 - Pie

D3 內建 Layout 類別 - Stack

D3 內建 Layout 類別 - Cluster

D3 內建 Layout 類別 - Tree

D3 內建 Layout 類別 - Treemap

Use D3.js - load library

HTML

<script src="http://d3js.org/d3.v3.min.js"></script>

Use D3.js - select elemet

HTML

<div>red
    <div>green</div>
</div>

JavaScript:

d3.select('div').style({ 'color': 'red' });
d3.select('div div').style({ 'color': 'green' });

Use D3.js - select elemet

也可以串著寫:

d3.select('div').style({ 'color': 'red' })
     .select('div').style({ 'color': 'green' });

Use D3.js - append element

d3.select('body')
     .append('div')
     .html('My name is Veck')
     .style({
       'border':'1px solid #000',
       'width':'120px'
});

Use D3.js - append elemet

Draw SVG

插入 <svg> 元素到 <body> 中

d3.select('body')
     .append('svg')
     .attr({
          'width':200,
          'height':200
});

Draw SVG

插入 <circle> 到 <svg> 中來畫圖

d3.select('svg')
     .append('circle')
     .attr({
          'cx':50,
          'cy':50,
          'r':30,
          'fill':'#f3b',
          'stroke':'blue',
          'stroke-width':'5px'
});

Draw SVG

Data Visualization by D3.js

選擇 HTML 元素後,我們可以透過 D3.js 的 d3.data() 來載入資料

var dataSet = [1, 2, 3, 4, 5];

d3.select('body').selectAll('div')
     .data(dataSet)    // load data
     .enter()                // "show" data element
     .append('div')
     .text('Hi!');

Data Visualization by D3.js

Data Visualization by D3.js

可以透過 callback function 指定 text 內容

var dataSet = [1, 2, 3, 4, 5];

d3.select('body').selectAll('div')
     .data(dataSet)    // load data
     .enter()                // "show" data element
     .append('div')
     .text(function(d){
          return d;
     }
);

Data Visualization by D3.js

Data Visualization by D3.js

幫插入的 <div> 設定樣式

var dataSet = [1, 2, 3, 4, 5];

d3.select('body').selectAll('div')
     ...
     .append('div')
     .text(function(d){  return d;  })
.style({  礙於篇幅,請見下頁  });

Data Visualization by D3.js

幫插入的 <div> 設定樣式

// 剛剛的 style 內容
.style({
     'color':  function(d){  if(d < 4){  return 'red'   }  },
     'width':  function(d){ return d*10 + 'px' },
     'margin':  '2px 0',
     'background':  'lightgreen'
});

Data Visualization by D3.js

More

  • 改用 Canvas 來加速繪製
  • 透過 d3.csv(), d3.json(), d3.tsv() ... 等函式來載入外部資料
  • 套用 Layout 來做出各種不同的資料視覺化圖形

Demo

Resource

Q & A

Slide: http://fbukevin.github.io/weic_d3js

Contact: fbukevin@gmail.com