Created by @_shimizu
誰ですか?
Geovisualization
ビジュアライゼーション(視覚化)とは、人間が直接見ることのできない現象・事象・関係性を、見ることのできるもの、画像・グラフ・図などにすること。
1850年代、イギリスの麻酔科医ジョン・スノーがそれまでの通説だったコレラ感染の原因「瘴気説」に疑問を抱き、独自の調査を行った。その際に作成されたのが下記の地図。地図にコレラ患者を記入していき、コレラの感染と飲料水との関係を明らかにした。
1858年、ナイチンゲールが出版した『イギリス陸軍の保健と能率と病院管理に関する覚書』に掲載されたクリミア戦争における死因分析を表したグラフ。兵士の多くが戦場ではなく、戦地の病院内の不衛生な環境による伝染病が原因であることを明らかにした。
データビジュアライゼーションエンジン
bodyタグ内にデータセットの数だけdiv要素を追加し、データセットの値をdivのwidth属性(幅)に適用する
var dataSet = [10, 20, 30]; //データセット
d3.select("body") //bodyタグを選択
.selectAll("div") //お約束*
.data(dataSet) //データを束縛
.enter() //データを基にした操作を開始する
.append("div") //div要素を追加
.attr("width", function(d){ return d } ); //値を適用
先ほどのサンプルコードを実行した後のHTML
<body>
<div width="10"></div>
<div width="20"></div>
<div width="30"></div>
</body>
data, update, enter, exit
元となるDOM
<svg>
<circle cx=100 cy=100 r=30></circle>
<circle cx=200 cy=100 r=30></circle>
</svg>
▼ output
data bind
var svg = d3.select('svg') //svg要素をセレクト
var dataset = [ //データセット
{id:1, value:20 },
{id:2, value:10 },
]
var selector = svg.selectAll('circle')
.data(dataset) //data bind
▼ output
update
var selector = svg.selectAll('circle')
//update
selector
.attr("fill", "blue")
.attr("r", function(d){ return d.value })
▼ output
enter
dataset.push({id:3, value:30}) //データを追加
// enter select
var enterSelector = svg.selectAll('circle')
.data(dataset, function(d){ return d.id })
.enter()
//update
enterSelector.append('circle')
.attr({
cx:200,
cy:100,
r:function(d){ return d.value },
fill:"red"
})
▼ output
exit
dataset.shift() //データを削除
//exit select
var exitSelector = svg.selectAll('circle')
.data(dataset, function(d){ return d.id })
.exit()
//update
exitSelector
.attr("fill", "green")
.attr("opacity", 0.1)
▼ output
チェックボタンクリック時の並べ替え処理
btng.on('change', function(d){
var checked = []
d3.select('#btns').selectAll("input").each(function(d){
if(this.checked) checked.push(this.value)
})
var group = data.filter(function(d){ return checked.some(function(v){ return +v == d.g }) })
var selector = svg.selectAll('.cell').data(group, function(d){ return d.id })
selector.exit().transition().duration(1000).delay(function(d,i){ return i * 10})
.attr(trashAttr)
selector.transition().duration(1000).delay(function(d,i){ return i * 20 })
.attr(selectedAttr)
})
A picture is worth a thousand words.
私たちがデータビジュアライゼーションをするのは、今まで見たこともないようなものが見えるようになるのがとても面白いからだ。それは、データが詰まった得体の知れない壺から、魔法の精霊を目に見える形にして生み出すようなものだ。インタラクティブ・データビジュアライゼーション
おまけ
D3の作者マイクボストック氏のサイト
D3コミッターの中でも地理情報可視化に関する中心人物