D3.jsとSVGによる
データビジュアライゼーション
2013/3/23 第6回 HTML5など勉強会 - kadoppe
自己紹介

名前:門脇 恒平 @kadoppe
職業:ソフトウェアエンジニア
所属:
HTML5-West.jp コアメンバ
ShareWis Inc. CTO
スライド:
http://www.slideshare.net/kadoppe



サンプルコード:
https://github.com/kadoppe/html5etc-6
データビジュアライゼーション?
データビジュアライゼーション?

    そのまんまの意味
データビジュアライゼーション?

    可視化
データを
可視化すること
何のために?
身近な例
http://www.kotsu.city.osaka.lg.jp/general/eigyou/top.html
どんな駅・路線が存在して
どう繋がっているのか
複雑なデータを
わかりやすく伝えている

   http://www.kotsu.city.osaka.lg.jp/general/eigyou/top.html
Web上の例
Before
Before

誰が/いつ/どれくらい
貢献してるのか知りたい
でもわかりづらい
After
After
目的:
わかりにくいデータを
わかりやすく整形
もっと
勉強したい人は
http://www.ted.com/talks/lang/ja/david_mccandless_the_beauty_of_data_visualization.html
1年前の僕:
僕もWeb上で
こんなの作ってみたい
1年前の僕:
でも難しそう
どう作ればいいの?
D3.jsとSVG
      を使えばできるよ
D3.js




        http://d3js.org/
D3 =
Data-Driven
Document
データにもとづいて
HTMLドキュメントを構築する
JavaScriptライブラリ
特徴1:
豊富なドキュメント
サンプルコード
http://bl.ocks.org/mbostock/4061961
http://bost.ocks.org/mike/fisheye/
特徴2:
HTML要素や
SVG要素を
同じように扱える
SVG =
Scalable Vector
Graphics
XML形式の
ベクター画像
フォーマット
特徴1:
HTML文書に埋め込める
(インラインSVG)
<html>
<head></head>
<body>
  <h1>SVG画像</h1>
  <svg>
    <circle cx=50 cy=50 r=50 />
  </svg>
</body>
</html>
特徴2:
JavaScriptやCSSから
操作できる
実際に
触ってみよう
Twitterの
データを
可視化してみる
ライブコーディングその1:

ツイートリスト
を表示する
       https://github.com/kadoppe/html5etc-6/tree/master/sample1
おさらい
d3: jQueryの$にあたるもの


var li = d3
select(): ツイートリストを
格納する要素を指定

var li = d3.select('#tweets')
selectAll(): 個々のツイートを
格納する要素を指定


var li = d3.select('#tweets').selectAll("li")
data(): データの配列と
キーとなる属性を指定

var li = d3.select('#tweets').selectAll("li")
  .data(results, function(data) { return data.id });
enter(): ここから先は
追加されたデータの処理
var li = d3.select('#tweets').selectAll("li")
  .data(results, function(data) { return data.id });

li.enter()
append(): 追加データに
要素を割り当てる
var li = d3.select('#tweets').selectAll("li")
  .data(results, function(data) { return data.id });

li.enter().append('li')
text(): 要素内のテキストを
指定する
var li = d3.select('#tweets').selectAll("li")
  .data(results, function(data) { return data.id });

li.enter().append('li')
  .text(function(data) { return data.text; });
exit(): ここから先は
削除されたデータの処理
var li = d3.select('#tweets').selectAll("li")
  .data(results, function(data) { return data.id });

li.enter().append('li')
  .text(function(data) { return data.text; });

li.exit()
remove(): データに
割り当てられた要素を削除
var li = d3.select('#tweets').selectAll("li")
  .data(results, function(data) { return data.id });

li.enter().append('li')
  .text(function(data) { return data.text; });

li.exit().remove();
完成!

var li = d3.select('#tweets').selectAll("li")
  .data(results, function(data) { return data.id });

li.enter().append('li')
  .text(function(data) { return data.text; });

li.exit().remove();
次はもうすこし
ビジュアライゼーション()
っぽいことを
ライブコーディングその2:

SVGをつかう
       https://github.com/kadoppe/html5etc-6/tree/master/sample2
おさらい
SVG要素が使える


var svg = d3.select('#tweets').selectAll("circle")
  .data(results, function(data) { return data.id });
attr(): 要素の属性値を指定

var svg = d3.select('#tweets').selectAll("circle")
  .data(results, function(data) { return data.id });

svg.enter().append('circle')
  .attr('r', 10)
データの内容から
属性値を計算できる
var svg = d3.select('#tweets').selectAll("circle")
  .data(results, function(data) { return data.id });

svg.enter().append('circle')
  .attr('r', 10)
  .attr('cx', function(data) {
     return data.text.length * 3
  })
もちろん複雑な計算も可能
var svg = d3.select('#tweets').selectAll("circle")
  .data(results, function(data) { return data.id });

svg.enter().append('circle')
  .attr('r', 10)
  .attr('cx', function(data) {
     return data.text.length * 3
  })
  .attr('cy', function(data) {
     var d = new Date();
     d.setTime(Date.parse(data.created_at));
     return d.getHours() * 20;
  });
完成!
var svg = d3.select('#tweets').selectAll("circle")
  .data(results, function(data) { return data.id });

svg.enter().append('circle')
  .attr('r', 10)
  .attr('cx', function(data) {
     return data.text.length * 3
  })
  .attr('cy', function(data) {
     var d = new Date();
     d.setTime(Date.parse(data.created_at));
     return d.getHours() * 20;
  });
まだ時間ある?
ライブコーディングその3:
Layoutモジュール
をつかう

       https://github.com/kadoppe/html5etc-6/tree/master/sample3
カンタンに
見栄えが良くなる
Bundle   Chord




Force    Cluster
Bundle   Chord




Force    Cluster
おさらい
layout.force():
forceレイアウトを使う準備

var force = d3.layout.force()
nodes():
表示するノードを設定

var force = d3.layout.force()
  .nodes(nodes)
links():
ノード間の接続を設定
var force = d3.layout.force()
  .nodes(nodes)
  .links(links)
.on(“tick”, function):
周期的に実行する処理を指定
var force = d3.layout.force()
  .nodes(nodes)
  .links(links)
  .on("tick", tick)
.size(): 表示する領域の
サイズを指定
var force = d3.layout.force()
  .nodes(nodes)
  .links(links)
  .on("tick", tick)
  .size([500, 500])
.start(): ノード位置の
自動計算をスタート
var force = d3.layout.force()
  .nodes(nodes)
  .links(links)
  .on("tick", tick)
  .size([500, 500])
  .start();
完成!

var force = d3.layout.force()
  .nodes(nodes)
  .links(links)
  .on("tick", tick)
  .size([500, 500])
  .start();
まとめ
データ
ビジュアライゼーション
データをわかりやすく
可視化すること
D3.js
データにもとづいて
HTMLを組み立てられる
HTMLとSVG
が使える
カンタンに
見栄え良くできる
こんな
僕でも・・
こんなの作れるようになったよ!




          http://share-wis.com
Let s Try !!
おしまい

D3.js と SVG によるデータビジュアライゼーション