SlideShare a Scribd company logo
D3.js入門:BarChartのスクリプトを読み解く
2014/12/28
保田
D3.jsとは?
データ視覚化に特化したjavascriptライブラリ
DOM要素を最大限に利用
WEB系の人は習得しやすい(たぶん)
ブラウザの開発ツールでデバッグできる
HTML/CSSのアップデートに対応しやす
い
「チェイニング」で記述
必要な属性のみ指定すればいい
(基本的に)指定の順番は関係ない
jQueryに似てる
実例を見てみる! : script
Ref. http://bl.ocks.org/mbostock/3885304
実例を見てみる! : html/css部分
Ref. http://bl.ocks.org/mbostock/3885304
【html/css部分】
!
<!DOCTYPE html>
<meta charset="utf-8">
<style>
!
.bar {
fill: steelblue;
}
!
.bar:hover {
fill: brown;
}
!
.axis {
font: 10px sans-serif;
}
!
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
!
.x.axis path {
display: none;
}
!
</style>
!
…次頁へ続く
実例を見てみる! : script部分
Ref. http://bl.ocks.org/mbostock/3885304
【スクリプト部分】
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
!
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
!
var x = d3.scale.ordinal()
.rangeRoundBands([0, width], .1);
!
var y = d3.scale.linear()
.range([height, 0]);
!
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
!
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.ticks(10, "%");
!
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top +
")");
!
d3.tsv("data.tsv", type, function(error, data) {
x.domain(data.map(function(d) { return d.letter; }));
y.domain([0, d3.max(data, function(d) { return d.frequency; })]);
!
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
!
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Frequency");
!
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.letter); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.frequency); })
.attr("height", function(d) { return height - y(d.frequency); });
!
});
!
function type(d) {
d.frequency = +d.frequency;
return d;
}
</script>
D3.jsの基本構造は、DOM要素とDataを対応づけすること
DOM Data
対応
3つの基本API
select
data
scale
どのDOM要素で
どんなデータを
どんな大きさで
描くか。
select と append
!
!
!
!
!
!
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," +
margin.top + ")");
!
d3.tsv("data.tsv", type, function(error, data) {
x.domain(data.map(function(d) { return d.letter; }));
y.domain([0, d3.max(data, function(d) { return
d.frequency; })]);
!
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
!
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Frequency");
!
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.letter); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.frequency); })
.attr("height", function(d) { return height -
y(d.frequency); });
!
});セレクション(svg下にあ
るすべての.barクラス)
に、dataを対応づける
select:(最初の)DOM要素を選択
selectAll: すべてのDOM要素を選択
append: DOM要素を追加
※引数にはCSSと同等の表記が使える
d3.select()、d3.selectAll()について
d3.select() d3.selectAll()は、DOM要素を参照するメソッド。戻り値は指定した要素(のセット)。
参照(引数)の種類としては、
・タグ( div など)
・ID( #foo など)
・アトリビュート( [color=red] など)
・関係( parent child など)
がある。
また、複数の組み合わせ、
・AND( .this.that = thisクラスの中のthatクラス)
・OR( .this, .that thisクラスまたはthatクラス)
も可能。
d3.select()は条件にマッチした最初の要素のみが入った配列が返る。HTMLノードを取り出したいとき
は、d3.select(セレクションの記述).node()とする。
条件にマッチしたすべての要素(の配列)を得るには、d3.selectAll()を使う。
dataのバインド
!
d3.tsv("data.tsv", type, function(error, data) {
!
<途中省略>
!
svg.selectAll(".bar")
.data(data)
.enter()
.append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.letter); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return y(d.frequency); })
.attr("height", function(d) { return height -
y(d.frequency); });
});
!
function type(d) {
d.frequency = +d.frequency;
return d;
}
セレクション(svg下にあ
るすべての.barクラス)
に、dataを対応づける
(バインド)
d3.csv(url [,accessor], callback関数)
d3.tsv(urll [,accessor], callback関数)
※urlからcsv/tsvファイルを読み終わったら、
callback関数を実行する
callback関数の第2引数が読み込んだデータ
enter()
セレクションのうち、ま
だdataが対応していない
ものすべて
enter と exit
DOM Data
対応
exit
データが対応づけられていないDOM要素のサブセット
enter
DOM要素が対応づけられていないデータのサブセット
scaleとaxis
!
!
!
!
!
!
var margin = {top: 20, right: 20, bottom: 30, left: 40},
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
!
var x = d3.scale.ordinal()
.rangeRoundBands([0, width], .1);
!
var y = d3.scale.linear()
.range([height, 0]);
!
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
!
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.ticks(10, %");
!
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top +
margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," +
margin.top + ")");
!
d3.tsv("data.tsv", type, function(error, data) {
x.domain(data.map(function(d) {
return d.letter;
}));
y.domain([0, d3.max(data,
  function(d) {
return d.frequency;
})]);
!
Xスケール定義
ordinal 順序尺度
domainの設定
Yスケール定義
linear 線形
X軸
先に定義したXスケールを設定
Y軸
先に定義したYスケールを設定
.orient() 目盛りの方向と位置
.ticks():目盛りの数と単位
scale: 元データから画面表示への「変換関数」
.domain() データ範囲
.range() 描画範囲(ピクセル座標)
axis: 軸の「描画関数」 scaleが入力
scaleの種類
ordinal 順序尺度(非数)
linear 線形
sqrt	 平方根
pow 指数
log 対数
map(function(d)….
!
データのletter列の各
データを要素とする配列
を返す
scaleとaxis
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
!
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Frequency");
!
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) { return x(d.letter); })
.attr("width", x.rangeBand())
.attr("y", function(d) { return
y(d.frequency); })
.attr("height", function(d) { return height -
y(d.frequency); });
!
!
X軸を描画
rectの幅を rangeBand():バ
ンド幅、に設定
x(d.letter)で、d.letterに対応す
るX座標を得る
X軸
先に定義したXスケールを設定
rectの高さを height-y(d.frequency)
に設定
Y軸を描画
y(d.frequency)で、d.frequencyに対す
るY座標を得る
rangePointsとrangeBands/rangeRoundBandsの違い
var test = d3.scale.ordinal()
.domain(["一郎", "次郎", "三郎", "四朗", "五郎", "六郎"])
.rangePoints([min, max], outerPadding);
!
test("三郎") // 200を返す
!
!
!
!
var test = d3.scale.ordinal()
.domain(["一郎", "次郎", "三郎", "四朗", "五郎", "六郎"])
.rangeBands([min, max], padding, outerPadding);
!
さらに、rangeRoundBandsは、
レンジ幅、バンド幅、オフセット値が整数になるよう調整する
!
!
!
rangeBandsとrangeRoundBandsの違い:
https://gist.github.com/aubergene/5214125
.rangePointsは、両端からouterPaddingを除いて、n-1個の領域に分
割。
両端に pointが来る。
.rangeBandsは、outerPaddingを除いて、n個の領域に分割。
さらに個々の領域からpaddingを除いたものが、rangeBand
D3.jsの参考用リソース
D3.js 3つの小円
http://ja.d3js.node.ws/document/tutorial/
circle.html
!
D3.js Example
https://github.com/mbostock/d3/wiki/Gallery
!
D3.js入門 スコット・マレイ
http://ja.d3js.info/alignedleft/tutorials/d3/
!
Over 2000 D3.js example
http://techslides.com/over-2000-d3-js-
examples-and-demos
!
Over 1000 D3.js example
http://techslides.com/over-1000-d3-js-
examples-and-demos
d3.jsのライブラリ
2014.12.28
保田
crossfilter.js
http://square.github.io/crossfilter/
多次元フィルタリング用ライブラリ。高速性が売り。
dc.js
http://nickqizhu.github.io/dc.js/
多次元解析のライブラリ。 crossfilter オブジェクトを通じてメソッドを使う。
参考: http://toshiha.blogspot.jp/2013/12/dcjs.html
c3.js
http://c3js.org/
チャート・ライブラリ。Line, Timeseries, Spline, Bar, Scatter, Pie, Area, Donutなど基本的なものはひと通り
ある。D3.jsをラップすることで、より簡単にグラフを作成できる。
Vega
http://trifacta.github.io/vega/
データを特定のルールにしたがったJSONで定義することで、グラフが描画できる
Rickshaw
http://code.shutterstock.com/rickshaw/
時系列データのグラフ化ライブラリ。エリア、折れ線、バー、散布などが簡単に作成できる。
Cubism.js
http://square.github.io/cubism/
同じく、時系列データのグラフ化ライブラリ。
NVD3
http://nvd3.org/
チャートおよびチャート要素のライブラリ。カスタマイズも可能。

More Related Content

PDF
Xslt
PPTX
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
PPTX
今日から始めるC3.js
PPT
次世代DaoフレームワークDoma
PDF
PDF
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
PDF
WebMatrixに対応した、新しいけど新しくないRazor
PDF
css3講座 (初心者向け)
Xslt
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
今日から始めるC3.js
次世代DaoフレームワークDoma
DEV-010_エンプラ系業務 Web アプリ開発に効く! 実践的 SPA 型モダン Web アプリ開発の選択手法
WebMatrixに対応した、新しいけど新しくないRazor
css3講座 (初心者向け)

Similar to D3js入門 - Code for Kobe 可視化勉強会資料 (20)

PPT
Dsl&Builder
PDF
CSS Design and Programming
PDF
「html5 boilerplate」から考える、これからのマークアップ
PDF
Flutterを体験してみませんか
PDF
Html5 Web Applications
PDF
DTrace for biginners part(2)
PPTX
Androidアプリ本格開発入門 webブラウザ編
PDF
DW テンプレートをマスターして 楽々サイトメンテナンス
PDF
Web講座 第2回
PDF
Django boodoo
PDF
Declaimerっていうやつつくった(つくってる)
PDF
Source Code of Dart
PDF
Seasarプロジェクト徹底攻略
PPT
S2dao Seminar in tripodworks
KEY
Kawaz的jQuery入門
KEY
Aizu lt tokyo_luxion
PDF
⑯jQueryをおぼえよう!その2
PPT
CSS勉強会
PDF
jQuery Performance Tips – jQueryにおける高速化 -
PDF
D3.js と SVG によるデータビジュアライゼーション
Dsl&Builder
CSS Design and Programming
「html5 boilerplate」から考える、これからのマークアップ
Flutterを体験してみませんか
Html5 Web Applications
DTrace for biginners part(2)
Androidアプリ本格開発入門 webブラウザ編
DW テンプレートをマスターして 楽々サイトメンテナンス
Web講座 第2回
Django boodoo
Declaimerっていうやつつくった(つくってる)
Source Code of Dart
Seasarプロジェクト徹底攻略
S2dao Seminar in tripodworks
Kawaz的jQuery入門
Aizu lt tokyo_luxion
⑯jQueryをおぼえよう!その2
CSS勉強会
jQuery Performance Tips – jQueryにおける高速化 -
D3.js と SVG によるデータビジュアライゼーション
Ad

More from 充彦 保田 (16)

PDF
木曜サロン 体感型Mrバーチャルドローン.key
PDF
VRが変える情報伝達とものづくりの未来
PDF
SIGGRAPH ASIA 2015
PDF
データが社会を変える! 〜可視化にできること〜
PDF
可視化とは? Code for Kobe 可視化勉強会資料
PDF
サイエンスはビジネスのエンジンになるか?〜未来を変える3つのサイエンス・トレンド〜
PDF
インタラクティブデバイス&コンテンツ by XOOMS
PDF
Xj0009 イラレをスクリプトで動かしてみた
PDF
Science Media & Data Visualization - XOOMS (English)
PDF
カガクをミセル、ギジュツをツタエルー中小企業総合展 2012
PDF
可視化は社会を変えるか? 関西大学特別講義
PDF
カガクをミセル、カガクをツタエルー龍野高校特別授業
PDF
可視化は社会を変えるか?@ナレッジサロン
PDF
情報・データの可視化@兵庫県IT研究会
PDF
カガクギジュツとコンテンツ@クリエイティブサロン 2011 sep
PDF
KNS定例会「科学の民主化とコンテンツ」
木曜サロン 体感型Mrバーチャルドローン.key
VRが変える情報伝達とものづくりの未来
SIGGRAPH ASIA 2015
データが社会を変える! 〜可視化にできること〜
可視化とは? Code for Kobe 可視化勉強会資料
サイエンスはビジネスのエンジンになるか?〜未来を変える3つのサイエンス・トレンド〜
インタラクティブデバイス&コンテンツ by XOOMS
Xj0009 イラレをスクリプトで動かしてみた
Science Media & Data Visualization - XOOMS (English)
カガクをミセル、ギジュツをツタエルー中小企業総合展 2012
可視化は社会を変えるか? 関西大学特別講義
カガクをミセル、カガクをツタエルー龍野高校特別授業
可視化は社会を変えるか?@ナレッジサロン
情報・データの可視化@兵庫県IT研究会
カガクギジュツとコンテンツ@クリエイティブサロン 2011 sep
KNS定例会「科学の民主化とコンテンツ」
Ad

Recently uploaded (9)

PDF
世界半導体用酸化ハフニウム市場のサプライチェーン解析:上流、下流、収益モデル分析2025-2031
PDF
限外ろ過膜調査レポート:市場規模、シェア、産業分析データ、最新動向2025-2031 YH Research
PDF
グローバルロープウェイ用スチールワイヤーロープ市場2025:主要企業のシェア、売上動向、競争戦略
PDF
XCMSを用いた質量分析データ処理_BioCAsia2021_yamamoto.pdf
PDF
【QYResearch】人形ロボット産業の市場構造と今後の発展方向に関する分析レポート
PDF
【QYResearch】グローバル磁性材料産業チェーンの構造分析と市場動向の詳細解説
PDF
【QYResearch】グローバルコネクタ市場の動向と将来展望に関する詳細な分析報告
PDF
商用ウェブカメラ市場:世界の産業現状、競合分析、シェア、規模、動向2025-2031年の予測
PDF
【QYResearch】グローバル農業機械市場の動向分析と成長戦略に関する総合調査報告
世界半導体用酸化ハフニウム市場のサプライチェーン解析:上流、下流、収益モデル分析2025-2031
限外ろ過膜調査レポート:市場規模、シェア、産業分析データ、最新動向2025-2031 YH Research
グローバルロープウェイ用スチールワイヤーロープ市場2025:主要企業のシェア、売上動向、競争戦略
XCMSを用いた質量分析データ処理_BioCAsia2021_yamamoto.pdf
【QYResearch】人形ロボット産業の市場構造と今後の発展方向に関する分析レポート
【QYResearch】グローバル磁性材料産業チェーンの構造分析と市場動向の詳細解説
【QYResearch】グローバルコネクタ市場の動向と将来展望に関する詳細な分析報告
商用ウェブカメラ市場:世界の産業現状、競合分析、シェア、規模、動向2025-2031年の予測
【QYResearch】グローバル農業機械市場の動向分析と成長戦略に関する総合調査報告

D3js入門 - Code for Kobe 可視化勉強会資料