54
どんなデータでもキレイに魅せる! HTML5/JavaScriptでグラフを描画する今どき手法~ たけうち ひでゆき

どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

Embed Size (px)

Citation preview

Page 1: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

どんなデータでもキレイに魅せる! ~HTML5/JavaScriptでグラフを描画する今どき手法~

たけうち ひでゆき

Page 2: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

自己紹介

Page 3: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

自己紹介

● 株式会社ユーザベース

● チーフテクノロジスト (=CTØ)

/ イノベーション担当執行役員

● 技術特性: 広く浅く時々深く

パソコンが関わる事なら大体何でも好き

3

たけうち ひでゆき @chimerast

Page 4: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

E2D3紹介

● OSSプロジェクト

● 全ての人にデータ可視化技術を

● Excel上でデータを入力し、人の作った

データ可視化プログラムで可視化を行える

● 30人ぐらいの人がコントリビュータとして

ゆるく関わっています

4

E2D3: Excel to D3.js

Page 5: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

後ほどもうちょっと詳しく説明します

Page 6: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

提 供

全ての人にデータ可視化技術を

Page 7: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

データ可視化

Page 8: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

自己紹介

データ可視化の必要性

最近のデータ可視化

D3.jsを使ったデータ可視化

D3.jsを使ってみる

オープンソースプロジェクト「E2D3」の紹介

8

Page 9: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

データ可視化の必要性

● データドリブンな意思決定への需要の高まり

● 大きな(複雑なデータ)を素早く理解しなければならない

● データを人の目で知覚可能な形へと「可視化」する

● データビジュアライゼーションへの注目

9

Page 10: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

データ可視化の例10

県ごとのコンビニ店舗数の可視化

Page 11: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

データビジュアライゼーションの定義

● あるデータセットが、予め用意されたアルゴリズムを用い

て、コンピュータによって描画されること。

● その描画によってデータセットを眺めているだけではわから

ない傾向や特徴が明らかになっていること。

● アルゴリズムはコーディングによって定義され、形式知化/

可視化されていること。

● ソート、フィルター、トグルなどのインタラクションが可能で、

その場でその結果がすぐ得られること。

11

出典: http://visualizing.jp/infograph_vs_dataviz/

Page 12: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

インフォグラフィックスとの対比12

● データをありのままに見せ、

見る人にデータを触らせる

● どちらかというとエンジニア

サイドから出てきたもの

● 管理画面・ダッシュボードで

使われることが多い

● ストーリーに沿うようにデータを選

択してわかりやすく見せる

● どちらかというとデザイナサイドか

ら出てきたもの

● ニュース記事で使われることが多

インフォグラフィックスデータビジュアライズ

Page 13: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

最近のデータ可視化

Page 14: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

自己紹介

データ可視化の必要性

最近のデータ可視化

D3.jsを使ったデータ可視化

オープンソースプロジェクト「E2D3」の紹介

14

Page 15: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

ブラウザ上でのデータ可視化

The Wealth & Health of Nationshttp://bost.ocks.org/mike/nations/

Four Ways to Slice Obama’s 2013 Budget Proposalhttp://www.nytimes.com/interactive/2012/02/13/us/politics/2013-budget-proposal-graphic.html

The Facebook Offering: How It Compareshttp://www.nytimes.com/interactive/2012/05/17/business/dealbook/how-the-facebook-offering-

compares.html

dc.jshttp://dc-js.github.io/dc.js/

15

Page 16: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜
Page 17: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜
Page 18: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜
Page 19: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜
Page 20: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

最近データ可視化の流れ

ウェブブラウザの機能が増え表現力が上がってきた

ユーザの操作によるインタラクティブな表現の増加

いままでIE6,7,8がネックだった

報道にもデータ可視化の技術が使われるようになってきた

データジャーナリズム

報道機関各社にデータビジュアライズ専門の部署ができは

じめている

20

Page 21: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

D3.jsを使ったデータ可視化

Page 22: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

データ可視化の必要性

自己紹介

最近のデータ可視化

D3.jsを使ったデータ可視化

オープンソースプロジェクト「E2D3」の紹介

22

Page 23: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

http://d3js.org/23

Page 24: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

D3.jsについて

● Data Driven Document の略

● データビジュアライズを作るのに必要なものを

集めたライブラリ

● ビジュアライズそのものを提供しているものではない

● Mike Bostock 作

○ 今はThe New York Timesで

グラフィックエディターをしている

● http://bost.ocks.org/mike/

24

Page 25: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

D3.jsの良いところ

● とにかくサンプルが多い

● d3.js Gallery (https://github.

com/mbostock/d3/wiki/Gallery)

● bl.ocks.org(http://bl.ocks.org/)

○ Gistに上がっているデータ可視化表現を描画してく

れるサイト

● Mike Bostock のものを見るだけでもお

なかいっぱい(849個)(http://bl.ocks.org/mbostock)

25

Page 26: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

Core データ操作や取得、アニメーション、色等の共通機能群

Scales データと描画座標の間の変換する機能群

SVG SVGのオブジェクトを作るための便利機能群

Time 時間の操作や文字列との間の変換機能群

Layouts データによる配置に関する機能群

Geography 地理データの射影などを行う機能群

Geometry ボロノイ図等の2次元の可視化表現を扱うための機能群

Behaviors ドラッグやズームなどを扱う機能群

D3.jsが提供する機能26

https://github.com/mbostock/d3/wiki/API-Reference

Page 27: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

D3.jsを試すのに便利な環境

JSFiddlehttp://jsfiddle.net/

HTML + CSS + JavaScript をブラウザ上で試せる環境

左側の「Frameworks & Extensions」から「D3」を選択すると

D3.jsを簡単に試せる

27

Page 28: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

SVG: Smart Vector Graphics

XMLをベースにした2次元ベクター画像フォーマット

最近のブラウザがサポート: IE9以上, Firefox, Chrome

28

<svg width="120" height="120"> <rect x="10" y="10" width="100" height="100"rx="15" ry="15" /></svg>

基本D3.jsはSVG DOM Nodeをいじって最終的な画像を作り出す

Page 29: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

SVG + CSS29

rect { fill: #fcc; stroke: black; stroke-width: 5px;}

<svg width="120" height="120"> <rect x="10" y="10" width="100" height="100"rx="15" ry="15" /></svg>

Page 30: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

D3.jsのビジュアライズの基本

SVGのDOMをいじって

● あたらしく図形を追加したり削除したり

● パスを変化させたり

● 地図を書いたり

30

Page 31: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

D3のDOM操作の基本

jQueryと同じようなSelectorを使ってDOMを選択し、

それに対して操作を行います。

http://jsfiddle.net/chimerast/7f5L0Lc3/

d3.select(‘svg’).selectAll(‘rect’) // svgの中のrectを選択

.data(array) // 選択されたrectの集合にデータを紐付ける

.enter().append(‘rect’) // データの数に足りない分だけrectを増やす

.attr(‘width’, function (d) { return d.width; }); // データを使って属性変更

31

Page 32: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

.enter() と .exit()

.enter()

● selectAll()で取り出したDOM要素より紐付けられたデータが多ければ、その差

分の個数だけ空の箱を作成し返す

● 普通はその箱に対して.append()で要素を追加

● 必要になったDOM要素をフェードインや画面外からのアニメーションで追加出来

.exit()

● .enter()の逆でDOMが多い分だけそのDOM要素を返す

● いらなくなったDOM要素をフェードアウトさせつつ消したり出来る

32

Page 33: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

.enter()33

.data()

.selectAll()

.enter()http://jsfiddle.net/chimerast/bakt43od/1/

Page 34: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

.exit()34

.data()

.selectAll()

.exit()

Page 35: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

Scale

ある範囲の値を別の範囲の値に射影する関数を返す仕組み

データを実際の画面上の距離に変換するのに使う

http://jsfiddle.net/chimerast/d6yguho8/

var x = d3.scale.linear() .range([0, 100]) // 0から100の範囲に

.domain([-100, 200]); // -100から200の値を射影する

x(-100); // -> 0

x(100); // -> 66.66666

35

Page 36: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

Transition

数値や属性を目的の値に徐々に変化させる仕組み

アニメーションをするのに使う

http://jsfiddle.net/chimerast/fdf6u5x7/

.attr('height', 0) // 元々の高さが0で.transition().delay(2000) // 2秒間で

.attr('height', 100); // 100の高さにする

36

Page 37: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

Event

要素に対してイベントを追加する仕組み

jQueryの.on()と変わらない

http://jsfiddle.net/chimerast/g0b7sywe/

.on('click', function (d) { alert(d);})

37

Page 38: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

http://jsfiddle.net/chimerast/9bw84gdt/

まとめとして棒グラフを書いてみる38

Page 39: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

例: http://bl.ocks.org/mbostock/3943967

並んだ棒グラフと積み上げをボタン一つで切り替え

※通常はふたつのグラフを並べる必要がある

棒グラフ(Bar Chart)もこんなリッチに39

Page 40: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

Coffee Flavour Wheelhttp://www.jasondavies.com/coffee-wheel/

木構造が表現可能 -> 視覚的にブレイクダウンできる

円グラフ(Pie Chart)もこんなリッチに40

Page 42: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

「E2D3」の紹介

Page 43: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

自己紹介

データ可視化の必要性

最近のデータ可視化

D3.jsを使ったデータ可視化

オープンソースプロジェクト「E2D3」の紹介

43

Page 44: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

OSSプロジェクト「E2D3」

E2D3: Excel to D3.js http://e2d3.org/

GitHub: https://github.com/e2d3/e2d3/

Officeストア にて配信中

Excel2013以上 もしくは ブラウザのOffice365上で動作

現在絶賛開発中

求むコントリビュータ—!

44

Page 45: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

プロジェクトのミッション

全ての人にデータ可視化技術を

データ可視化を作り上げるのはとても大変!

見かけたものをちょっと使ってみたいなと思っても

特にノンプラグラマには絶対無理

エンジニアが作ったデータ可視化のテンプレートに

Excelからデータを流し込めると良いのでは?

45

Page 46: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

デモ

Page 47: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

ユースケース

営業・コンサルタント

データを地図等にマッピング

収集したデータをインタラクティブに可視化

Webニュース記者・編集者

データジャーナリズム

読者にデータを触らせて気づかせる

47

Page 48: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

E2D3の仕組み

Excel2013 および Office365 には、

HTMLとJavaScriptで作られたアプリを

追加する機能があるのでそれを利用

Apps for Office

https://msdn.microsoft.com/JA-JP/library/office/jj220060.aspx

JavaScript API for Office

https://msdn.microsoft.com/ja-jp/library/office/fp142185.aspx

48

Page 49: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

テンプレート開発はとっても簡単

https://github.com/e2d3/e2d3-

contrib/tree/master/barchart-javascript

main.jsを書くだけ

● root変数に描画すべき先のDOMノードが入っている

● update(data) 関数を定義するとシステム側から呼び出され

dataにExcelのセルのデータが入ってくる

● dataを各種形式に変換する便利関数があります

49

Page 50: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

Excelが無くても開発出来ます

ブラウザとエディタとnode.jsさえあればOK

将来的にはブラウザだけで開発したい

ファイルを保存すると勝手にブラウザの再読込がされる

LiveReload機能付き!

CoffeeScript, React(JSX)でも直接かけます!

実はD3.js使わずthree.jsつかったりもできる(IE11以上要)

50

Page 51: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

E2D3の直近の開発予定

データ可視化テンプレートを簡単に公開・検索できる機能

現在はe2d3-contribレポジトリに追加すると公開

任意のGitHubのレポジトリ等を配信可能に

可視化されたデータを共有・利用できる機能

FacebookやTwitter等に可視化したデータをシェア

JS/CSS/データを塊としてExportしブログ等に追加

51

Page 52: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

OSSへのコントリビュート

詳しくはWikiを参照

https://github.com/e2d3/e2d3/wiki/Getting-Started

https://github.com/e2d3/e2d3-contrib/wiki/Let's-add-a-map-by-E2D3

チャートを作ったらe2d3-contribにpull requestを投げてくださ

よくわからなかったらTwitterで #e2d3 つけてつぶやく

e2d3やe2d3-serverへの機能追加も歓迎です

52

Page 53: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

まとめ

● モダンブラウザの普及によりデータビジュアライズが当たり

前の技術になり始めています

● D3.jsを使うとデータビジュアライズを比較的簡単に作れま

● E2D3が普及すると、プログラマ以外もデータビジュアライズ

の恩恵を受けられるようになります

53

Page 54: どんなデータでもキレイに魅せる! 〜HTML5/JavaScriptでグラフを描画する今時の手法〜

提 供

全ての人にデータ可視化技術を