Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
d3.js demonstration
Search
muddydixon
March 28, 2023
Programming
100
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
d3.js demonstration
muddydixon
March 28, 2023
More Decks by muddydixon
See All by muddydixon
企業と勉強会
muddydixon
0
99
basic of data visualization and d3.js demonstration
muddydixon
0
150
study before deeplearning @YAPC2015
muddydixon
0
140
data visualization @html5study
muddydixon
0
110
Time Series Prediction@JubatusCasualTalk2
muddydixon
0
92
Perl for Visualization@YAPC2013
muddydixon
0
120
Time Series Analysis by JavaScript @LLMatsuri2013
muddydixon
0
140
How to create my own Hadoop MultipleInput@HadoopCodeReading8
muddydixon
0
93
BigDataAnalytics beginning by mongo-hadoop@MongoTokyo2012
muddydixon
0
70
Other Decks in Programming
See All in Programming
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
210
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
990
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
150
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
140
その節約、円になってますか?
isamumumu
1
650
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
510
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3.3k
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
630
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
130
AIが無かった頃の素敵な出会いの話
codmoninc
1
350
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
130
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
9
5.9k
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
790
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Rails Girls Zürich Keynote
gr2m
96
14k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
670
Designing for Performance
lara
611
70k
ラッコキーワード サービス紹介資料
rakko
1
4.2M
The agentic SEO stack - context over prompts
schlessera
0
860
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
880
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
190
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Become a Pro
speakerdeck
PRO
31
6k
Transcript
%KTΛ ͬͯΈΑ͏ !NVEEZEJYPO (56((JSMT.FFUVQ
!NVEEZEJYPO "NVEEZEJYPO #NVEEZEJYPO ! /PEFKT 1FSM 7JTVBMJ[BUJPO 5JNF4FSJFT /FVSBM/FUXPSL ࢲJT
ΞδΣϯμ %KTͱ %KTͷྲྀΕ %KTͷαϯϓϧհ %KTϋϯζΦϯ ࢄਤ άϥϑ ંઢάϥϑ άϥϑͷՄࢹԽ
σʔλՄࢹԽͱ The main goal of data visualization is its ability
to visualize data, communicating information clearly and effectivelty. Vitaly Friedman $ σʔλՄࢹԽͷతɺσʔλΛՄࢹԽ͠ɺ ใΛ໌͔֬ͭޮతʹ͑Δ͜ͱͰ͋Δ $
ࠓͷࢿྉͰ͢ IUUQTHJUIVCDPNNVEEZEJYPO (56((*3-450,:0
%KTͱ
%KTͱ
None
ΩϥΩϥԵ
%KTͱ %BUB%SJWFO%PDVNFOUT JOMJOF47( IUUQTEFWFMPQFSNP[JMMBPSHKBEPDT 47(@*O@)5.-@*OUSPEVDUJPO ෳ߹ϥΠϒϥϦ 47(ૢ࡞ ॲཧ ՄࢹԽϢʔςΟϦςΟ
%KTͱd%%%d < > 図形化
%KTͱd%%%d < > <
> 正規化
%KTͱd%%%d < > <
> 正規化 図形化
%KTͱd%%%d < > <
> 正規化 図形化 %BUB%SJWFO %PDVNFOUT
%KTͱd%%%d 4FQBM-FOHUI 4FQBM8JEUI 1FUBM-FOHUI 1FUBM8JEUI 4QFDJFT
TFUPTB TFUPTB TFUPTB TFUPTB TFUPTB WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WJSHJOJDB WJSHJOJDB WJSHJOJDB WJSHJOJDB WJSHJOJDB
%KTͱd%%%d 4FQBM-FOHUI 4FQBM8JEUI 1FUBM-FOHUI 1FUBM8JEUI 4QFDJFT
TFUPTB TFUPTB TFUPTB TFUPTB TFUPTB WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WJSHJOJDB WJSHJOJDB WJSHJOJDB WJSHJOJDB WJSHJOJDB
%KTͱd%%%d 4FQBM-FOHUI 4FQBM8JEUI 1FUBM-FOHUI 1FUBM8JEUI 4QFDJFT
TFUPTB TFUPTB TFUPTB TFUPTB TFUPTB WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WFSTJDPMPS WJSHJOJDB WJSHJOJDB WJSHJOJDB WJSHJOJDB WJSHJOJDB %BUB%SJWFO %PDVNFOUT
%KTͱd47(d 47(4DBMBCMF7FDUPS(SBQIJDT ! ! ! ! ! )5.-ͰʮJOMJOF47(ʯ͕ར༻Մೳʹʂ IUNMʹTWH YNM
ΛຒΊࠐΜͰར༻Մೳʂ http://www.slideshare.net/k
%KTͱd47(d IUNM IFBEུIFBE CPEZ TWHXJEUIIFJHIU DJSDMFDYDZ SpMMSFE TWH CPEZ IUNM
%KTͱd47(d IUNM IFBEུIFBE CPEZ TWHXJEUIIFJHIU DJSDMFDYDZ SpMMSFE TWH CPEZ IUNM
%KTͱd47(d IUNM IFBEུIFBE CPEZ TWHXJEUIIFJHIU DJSDMFDYDZ SpMMSFE TWH CPEZ IUNM
JOMJOF47( ಥવͷؙ
%KTͱd47(d 9.-Ͱ͔͚Δʂ Ξχϝʔγϣϯʹڧ͍ʂ *OTQFDUPSͰݟΒΕΔʂ ֦େॖখʹڧ͍ʂ ରʹ 8FC(-Ͱ%ʹʂ ฏ໘ͷඳըΛߴʹߦ͑Δʂ ໘ੵ͕ܾ·͍ͬͯΕҰఆͷύϑΥʔϚϯε ը૾ϑΥʔϚοτͰอଘͰ͖Δʂ
http://dev.opera.com/articl
%KTͷྲྀΕ
%KTͷྲྀΕ σʔλ࡞Δ 47(ͷ४උΛ͢Δ %0.ͱσʔλΛൺֱ͢Δ Γͳ͍෦Λσʔλ͔Β%0.Λੜ BUUSΛ͍͡Δ
αϯϓϧͰઆ໌
%KTͷྲྀΕ)5.- جຊ͜ΕͰͣͬͱ͍͖·͢ <!doctype html> <html> <head> <meta charset="utf-8"> <title>D3.js on
GTUG Girls Tokyo</title> <style> .axis path, .axis line { fill: none; stroke: grey; } </style> </head> <body> <script type="text/javascript" src="//code.jquery.com/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/ d3.min.js"></script> <script type="text/javascript" src="./src/main.js"></script> </body> </html>
%KTͷྲྀΕ8FC 8FC্͓͛ͯ͘ͱ"KBYͱ͔͑ͯศརͰ͢ python -m http.server 5000 python -m SimpleHTTPServer 5000
plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root => ".")->to_app' ruby -run -e httpd -- --port=5000 . ruby -rwebrick -e 'WEBrick::HTTPServer.new(:Port => 5000, :DocumentRoot => ".").start' http://blog.kamipo.net/entry/2013/02/20/122225
%KTͷྲྀΕσʔλ σʔλΛ࡞Γ·͢ ͜͏͍͏ͷ࡞͓ͬͯ͘ͱศར // データ生成ユーティリティ var dataGenerator = function(len, gen){
var array = [], i = 0; for(i = 0; i < len; i++){ array.push(gen ? gen(i) : i); } return array; }; // データ生成 var data = dataGenerator(100, function(i){ return { id: i, name: "name "+ i, x: 0|Math.random() * width, y: 0|Math.random() * height }; });
%KTͷྲྀΕ47( TWH ࡞Γ // var svg = d3.select("body").append("svg") .attr({width:
WIDTH, height: HEIGHT}); var main = svg.append("g") .attr({ width: width, height: height, transform: “translate("+margin+","+margin+")" }); 初出 * (selection) d3.select * (selection) selection.append * (selection) selection.attr
%KTͷྲྀΕσʔλͱ%0.ͷඥ͚ σʔλͷඥ͚ var circle = // 現状の取得 main.selectAll("g.circle") // データのヒモ付
.data(data) // データ > 現状(DOM)の部分を取得 .enter() // "g"要素を追加し、classをセット .append("g").attr({"class": "circle"}); 初出 * (selection) selection.selectAll * (selection) selection.data * (selection) selection.enter
%KTͷྲྀΕσʔλ͔ΒυΩϡϝϯτ σʔλ͔Βͷཁૉଐੑ circle.append("circle").attr({ r: 10, cx: function(d){ return d.x; },
cy: function(d){ return d.y; }, fill: "red" });
None
%KTͷྲྀΕDPMPS ৭Λऔಘͯ͠ΈΑ͏ var color = d3.scale.category20(); circle.append("circle").attr({ r: 10, cx:
function(d){ return d.x; }, cy: function(d){ return d.y; }, fill: function(d, i){ return color(i); } }); 初出 * (scale) d3.scale.category20
None
%KTͷྲྀΕ σʔλ࡞Δ 47(ͷ४උΛ͢Δ %0.ͱσʔλΛൺֱ͢Δ Γͳ͍෦Λσʔλ͔Β%0.Λੜ BUUSΛ͍͡Δ
4FMFDUJPO ඥ͚ͨσʔλ طଘͷ%0. FYJU TFMFDUJPO FOUFS
4FMFDUJPO ྫ͑ ඥ͚ͨσʔλ طଘͷ%0. FYJU TFMFDUJPO FOUFS ଐੑɾελΠϧɾςΩ ετͷมߋͳͲΛߦ͏ ৽نʹ%0.ΛՃ
͠ɺಉ࣌ʹଐੑɾελ ΠϧɾςΩετΛηο τ͢Δ طଘͷ%0.Λআ͠ ͨΓɺಁ໌Λ্͛ͨ ΓΛߦ͏
%KTͰάϥϑ
άϥϑ ৽͍͠ ETDBMFPSEJOBM TDBMFSBOHF#BOET TDBMFEPNBJO ETDBMFMJOFBS TDBMFSBOHF EFYUFOUENJOENBY ETWHBYJT TFMFDUJPODBMM
άϥϑ σʔλ࡞ // データ生成 var data = dataGenerator(10, function(i){ return
{ id: i, name: "name "+ i, // height よりも大きい! y: 0|Math.random() * 1000 }; });
άϥϑ σʔλཧ ΞΫηαΛࢦఆ͢Δ͜ͱͰɺྻ͔Βॊೈ ʹ࠷େɾ࠷খɾൣғΛऔΓग़ͤΔ ଞʹฏۉͱ͔தԝͳͲՄೳ // データの調査 var min =
d3.min(data, function(d){ return d.y;}), max = d3.max(data, function(d){ return d.y;}), extent = d3.extent(data, function(d){ return d.y;}); アクセサ 初出 * (number) d3.min / d3.max * ([number, number]) d3.extent
άϥϑ εέʔϧ࡞ॏཁʂTDBMFΛ੍͢͜ͱඞਢ var x = d3.scale.ordinal() .domain(data.map(function(d){ return d.id; }))
.rangeBands([0, width], 0.2), y = d3.scale.linear() .domain([0, max]) .range([height, 0]); // [0, height]じゃない! EPNBJO ೖྗ SBOHF ग़ྗ ͷม RVBOUJUBUJWFPSEJOBMͷछྨ RVBOUJUBUJWFʮൣғൣғʯ PSEJOBMʮ*%ൣғʯ ൣғใͷఏڙ 初出 * (scale) d3.scale.linear / d3.scale.ordinal
άϥϑ TDBMFͷSBOHF͕< IFJHIU>Ͱͳ͘ <IFJHIU >ͩͬͨཧ༝ ϒϥβ্Ͱࠨ্͕ ӈʹߦ͚
Y ɺԼʹߦ͚ Z େ͖͍΄Ͳʮߴ͍ʯʮখ͍͞ʯ ߴ͞ͷ΄͏ΛௐʮIFJHIUߴ͞ʯ
άϥϑ ཁૉͷඳըͷ४උ var bar = // 現状の取得 main.selectAll("g.bar") // データのヒモ付
.data(data) // データ > 現状(DOM)の部分を取得 .enter() // "g"要素を追加し、classをセット .append("g") .attr({ "class": "bar", transform: function(d){ // コツ: 位置合わせをやっておく return “translate("+x(d.id)+","+height+")"; } });
άϥϑ ཁૉͷඳըͷ४උ var bar = // 現状の取得 main.selectAll("g.bar") // データのヒモ付
.data(data) // データ > 現状(DOM)の部分を取得 .enter() // "g"要素を追加し、classをセット .append("g") .attr({ "class": "bar", transform: function(d){ // コツ: 位置合わせをやっておく return “translate("+x(d.id)+","+height+")"; } }); 描画上の一番下に合わせる height
άϥϑ ཁૉͷඳը bar.append("rect").attr({ width: x.rangeBand(), height: function(d){ return height -
y(d.y); }, y: function(d){ return y(d.y) - height; }, fill: "red" }); // ラベルも付けておきます bar.append("text").text(function(d){ return d.y;});
None
άϥϑ ࣠ͷ࡞ var xaxis = main.append("g").call(d3.svg.axis().scale(x)).attr({ "class": "axis", transform: "translate(0,"+height+")"
}); var yaxis = main.append(“g").call(d3.svg.axis().scale(y).orient("left")) .attr({ "class": "axis" }); 初出 * (svg) d3.svg.axis * (selection) selection.call
None
ؓٳ47(ཁૉ
47(Ͱ͑Δλά TWH H EFGT TZNCPM VTF QBUI MJOF SFDU DJSDMF
FMMJQTF QPMZMJOF QPMZHPO ! ͋ͱϑΟϧλʔपΓ͕ͨ͘͞Μ͋Γ·͕͢ ΄ͱΜͲ͏ػձ͋Γ·ͤΜ
47( ( 47( ͜ͷλάແ͍ͱ࢝·Γ·ͤΜʂඞͣ࡞Γ·͢ ( ࢠཁૉΛάϧʔϓԽ͢Δ͜ͱ͕Ͱ͖·͢ɻ ྫ͑ʮͱϥϕϧʯͷҐஔΛಉ࣌ʹม͑Δʹ (ཁૉͷҐஔΛ੍ޚ͢ΕҰͰߦ͑·͢͠ɺΞ χϝʔγϣϯͷ࣌ख͕ؒݮΓ·͢ ͱʹXJEUIIFJHIUUSBOTGPSNଐੑΛऔΓ·͢
1"5) ͯ͢ͷඳըཁૉ HSBQIJDTFMFNFOU ͜ΕͷBMJBT ͩͱߟ͑Δ͜ͱ͕Ͱ͖·͢ EଐੑͰσʔλύεจࣈྻΛ͢͜ͱͰඳըͤ͞·͢ FH.--[ ͔Β։࢝
. ͠ɺ ʹҠಈ - ɺ ʹҠಈͯ͠ɺด࿏Λ࡞Δ [ pMMଐੑด࿏ͷதΛࢦఆͨ͠৭ͰృΓͭͿ͢ TUSPLFଐੑύεΛࢦఆͨ͠৭Ͱඳ͘ TUSPLFXJEUIଐੑύεͷઢͷଠ͞Λࢦఆ͢Δ
$*3$-& 3&$5 -*/& &--*14& DJSDMFཁૉ SଐੑܘΛࢦఆ DYDZଐੑத৺ͷYZ࠲ඪΛࢦఆ SFDUཁૉ XJEUIIFJHIUଐੑۣܗͷ෯ߴ͞Λࢦఆ YZଐੑۣܗͷࠨ্ͷҐஔΛࢦఆ
SYSZଐੑؙ֯ͷପԁܘΛࢦఆ MJOFཁૉ YYZZଐੑͷ࠲ඪΛࢦఆ FMMJQTFཁૉ DYDZଐੑପԁͷத৺Ґஔͷ࠲ඪΛࢦఆ SYSZଐੑପԁͷܘΛࢦఆ
5SBOTGPSNଐੑ USBOTGPSNଐੑʹจࣈྻͰԼهΛࢦఆ͢Δ ͜ͱ͕Ͱ͖·͢ NBUSJYมܗߦྻ ཁૉ Λࢦఆ USBOTMBUFฒߦҠಈFHUSBOTGPSN 9 :
SPUBUFճసFHSPUBUF TLFX9TLFX:ࣼ ฏߦ࢛ลܗΈ͍ͨʹ௵ ͢ FHTLFX9 TDBMF֦େॖখFHTDBMF TDBMF
%KTͰંઢάϥϑ
ંઢάϥϑ ৽͍͠ EUJNFTDBMF TFMFDUJPOEBUVN ETWHMJOF
σʔλ࡞ // データ生成 var data = dataGenerator(10, function(i){ var now
= Date.now(); return { id: i, name: "name "+ i, x: new Date(now + 60000 * i), // 一分おき y: 0|Math.random() * 1000 }; }); ંઢάϥϑ
εέʔϧ࡞ // スケールの生成 var x = d3.time.scale() .domain(d3.extent(data, function(d){ return
d.x; })) .range([0, width]), y = d3.scale.linear().domain([0, max]).range([height, 0]); ࣌ؒʹಛԽͨ͠εέʔϧ ࣗಈͰ࣌ؒͷ۠ؒΛௐͯ͘͠ΕΔͨΊɺBYJTʹར༻͠ ͨ࣌ʹศར ɺ࢛ظɺ݄ɺɺ࣌ɺɺͳͲॊೈʂ 初出 * (scale) d3.time.scale ંઢάϥϑ
ཁૉඳըϢʔςΟϦςΟ var line = d3.svg.line() .x(function(d){ return x(d.x); }) .y(function(d){
return y(d.y); }); // PATHDATA=line([{x: X, y:Y},{}]) 配列を受けて、PathDataの文字列を返す ྨࣅͷTWHͱͯ͠BSFB BSD EJBHPOBMͳ Ͳ͕͋Δ 初出 * (function) d3.svg.line ંઢάϥϑ
ඳը var serie = // 現状の取得 main.append("path") // データのヒモ付 .datum(data)
.attr({ d: line, fill: "none", stroke: color(0) }); 初出 * (selection) selection.datum path要素に対して、配列を紐付ける ંઢάϥϑ
None
σʔλͷ४උ ΦϒδΣΫτͷྻͷྻ // データ生成 var series = dataGenerator(3, function(i){ return
{ name: "series " + i, data: dataGenerator(10, function(j){ var now = Date.now(); return { id: j, name: "name "+ j, x: new Date(now + 60000 * j), // 一分おき y: 0|Math.random() * 1000 }; }) }; }); ෳͷંઢάϥϑ
σʔλͷൣғΛऔಘ ճNJONBYΛ͏ var maxY = d3.max(series, function(serie){ return d3.max(serie.data, function(d){
return d.y;}); }); var minX = d3.min(series, function(serie){ return d3.min(serie.data, function(d){ return d.x;}); }), maxX = d3.max(series, function(serie){ return d3.max(serie.data, function(d){ return d.x;}); }); ෳͷંઢάϥϑ
ඥ͚ͯඳը var serie = // 現状の取得 main.selectAll("g.serie") // データのヒモ付 .data(series)
.enter() .append("g").attr({"class": "serie"}); ! serie.append("path").attr({ d: function(d){ return line(d.data); }, fill: "none", stroke: function(d){ return color(d.name); } }); ෳͷંઢάϥϑ
None
0OFNPSFUIJOH ֤ϙΠϯτʹυοτͱΛ var serie = // 現状の取得 main.selectAll("g.serie") // データのヒモ付
.data(series) .enter() .append("g").attr({ "class": "serie", fill: function(d){ return color(d.name); } }); 子要素すべてのfillを指定
ඥ͚ͯඳը var point = serie.selectAll("g.point") .data(function(d){ return d.data;}).enter() .append("g").attr({ "class":
"point", transform: function(d){ return "translate("+x(d.x)+","+y(d.y)+")"; } }); point.append("circle").attr({r: 5}); point.append("text").text(function(d){ return d.y; }).attr({dy: -8}); 0OFNPSFUIJOH
None
"OJNBUJPO
TFMFDUJPOUSBOTJUJPO ʹ͍ͭͮͯBUUS Λࢦఆ͢Δ͜ͱͰݱࡏࢦఆͨ͠BUUSͷ Ξχϝʔγϣϯ͕ߦΘΕ·͢ FH ETFMFDU lDJSDMFz USBOTJUJPO BUU S
\pMMlHSFFOz^
"OJNBUJPO ߋ৽ॲཧؔ લ var updateLine = function(){ // スケールのドメイン更新 x.domain(d3.extent(data,
function(d){ return d.x; })); var max = d3.max(data, function(d){ return d.y;}); y.domain([0, max]); ! // 折線の変形アニメーション serie.transition() .attr({ d: line }); ! これでアニメーションを利用できる!
"OJNBUJPO ߋ৽ॲཧؔ த൫ // 新たにデータが増えたのでselection撮り直し var point = main.selectAll("g.point").data(data); //
データ追加分の処理 var newpoint = point.enter().append(“g") .attr({"class": "point", fill: color(0), transform: function(d){ return "translate("+x(d.x)+","+y(d.y)+")"; } }); newpoint.append("circle").attr({ r: 5 }); newpoint.append("text").text(function(d){return d.y;}).attr({dy:-8}); // 既存データのアニメーション point.transition().attr({ transform: function(d){ return "translate("+x(d.x)+","+y(d.y)+")"; } });
"OJNBUJPO ߋ৽ॲཧؔ ޙ // 軸の更新 xaxis.call(d3.svg.axis().scale(x)); yaxis.call(d3.svg.axis().scale(y).orient("left")); };
None
-BZPVU
-BZPVUͱ ࠶ར༻ՄೳͳΞϧΰϦζϜͷմ جຊతʹʮݩσʔλʯ͔Βʮ͋ΔՄࢹԽ දݱʹඞཁͳσʔλʯͷมϓϩάϥϜ ЋͰΞχϝʔγϣϯΠϕϯτͳͲ͕͍ͭ ͯ͘Δ
None
ΩϥΩϥԵ
-BZPVU γϟϨΦπͳՄࢹԽΛ࡞Δʹɺͨ͘͞Μ ͷม͕ඞཁͰ͢ ྫ͑ɺؔάϥϑΛ࡞͢ΔʹɺʮͲ ͷͱͲͷΛͭͳ͙͔ʯʮͷฒͼͲ ͏͢Δ͔ʯʮͷҐஔ࠲ඪʯʮΛ݁Ϳ ހͷۂ͕Γ۩߹Ͳ͏͢Δ͔ʯͳͲ ͜ΕΒͷܭࢉΛҰ͔Β࣮͠ͳ͍ͰࡁΉΑ ͏ʹ͢ΔͨΊʹ-BZPVU͕ଘࡏ͠·͢
-BZPVU ࠓ༨ྗ͕͋Δਓ ࣮ʹࣗ৴͕͋Δਓ αϙʔτ͠·͢
)BOET0O
࣌ؒ·ͰϋϯζΦϯ Ξχϝʔγϣϯ·ͰҰखݩͰಈ͔ͯ͠Έͯ ͍ͩ͘͞ ࢼ͍ͨ͜͠ͱ͕͋Δਓ࣮Ξγετ͠ ·͢ ࢼ͍ͨ͜͠ͱͳ͍ਓ૬ஊ͍ͯͩ͘͠͞ Ξγετ͠·͢
ؾʹͳΔσʔλ
౦ژϝτϩΦʔϓϯσʔλ׆༻ίϯςετ http://tokyometro10th.jp/future/opendata/
ҪݝΦʔϓϯσʔλϥΠϒϥϦ http://www.pref.fukui.lg.jp/doc/toukei-jouhou/opendata/
ͦͷଞͷࢿྉ
47(ʹ͍ͭͯͪ͜ΒΛ IUUQXXXTMJEFTIBSFOFULBEPQQFJOMJOFTWH IUUQXXXTMJEFTIBSFOFUTTVTFSEDTWH NBOJBYDTTOJUFBGUFSEBSLTWHNBUTVEB https://github.com/muddydixon/html5conference
ՄࢹԽʹ͍ͭͯͪ͜ΒΛ
σʔλՄࢹԽͷϚϯτϥ Overview First, Zoom and Filter, Then Details-on-Demand Overview First,
Zoom and Filter, Then Details-on-Demand Overview First, Zoom and Filter, Then Details-on-Demand Ben Shneiderman $