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
JavaScript&可視化講習会#1
Search
domitry
May 24, 2015
Programming
1
630
JavaScript&可視化講習会#1
OUCC(
http://oucc.org/
) で5/24に行ったJavaScriopt&可視化講習会の一回目資料です。
domitry
May 24, 2015
Tweet
Share
More Decks by domitry
See All by domitry
Topics about SciRuby @dcmodel/davis tutorial, Kobe
domitry
0
180
The Elements of Statistical Learning 読書会 3.4章
domitry
0
260
PCで絵をかこう!
domitry
0
540
精神は物理的に記述できるか
domitry
0
120
RubyとFortranの話
domitry
0
330
Nyaplot - a data visualization tool for Ruby
domitry
3
670
Nyaplotの紹介@U-22プロコン
domitry
1
150
D3.js入門
domitry
0
4k
3Dプリンタの使用感に関する考察
domitry
1
280
Other Decks in Programming
See All in Programming
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1.1k
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
350
C++でシェーダを書く
fadis
6
4.1k
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
330
subpath importsで始めるモック生活
10tera
0
300
LLM生成文章の精度評価自動化とプロンプトチューニングの効率化について
layerx
PRO
2
190
Click-free releases & the making of a CLI app
oheyadam
2
110
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
みんなでプロポーザルを書いてみた
yuriko1211
0
260
Snowflake x dbtで作るセキュアでアジャイルなデータ基盤
tsoshiro
2
520
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
120
Featured
See All Featured
Statistics for Hackers
jakevdp
796
220k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Building an army of robots
kneath
302
43k
How to Ace a Technical Interview
jacobian
276
23k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
What's in a price? How to price your products and services
michaelherold
243
12k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
4 Signs Your Business is Dying
shpigford
180
21k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Transcript
JavaScript&可視化講習会 #1 2015/5/24 @OUCC
始める前に • 次の用語がわかる人? 変数 関数 オブジェクト
クラス • 次の言語が使える人? C言語 C# Python Java
始める前に • 全ての用語がしっかりと理解できている方 はおそらく恐ろしく暇だと思うので練習問 題を解くか、僕がKC3のときに使った資料 と練習問題を使ってください。(そこそこ難 しいです) https://github.com/domitry/KC3_D3js • 質問はslackで飛ばしてください。僕が喋っ
ている途中でも大丈夫です。
私は誰 • どみとり(@domitry) • 基礎工の3年 • 神経科学とかそっちら辺の人 • 普段はRuby, Python,
Cあたりを書く
JavaScriptとは • 主にWebで使われる • Javaとはあんまし関係ない言語 • 僕と同い年
どこでも見かけるJavaScript
None
None
最近のJavaScript • 高速化高速化 V8 Engine asm.js • 際限なく広がっていくJavaScriptの世界
Node.js (サーバーサイド) WebGL (3D) WebCL (並列化) • もうJavaScript書きたくない人たち AltJS (TypeScript, CoffeeScript, JSX, etc.) babel
今日やること・可視化 • 今可視化が熱い!!!
可視化のコミュニティ
Python
Ruby
D3.js
D3.js • Webエンジニア向けのライブラリ(not研究者) • 色々なことができる反面、複雑 • JavaScript文化の影響が強い
D3.jsを学ぶ意義 • データサイエンティストとかがもてはやさ れる時代、可視化にも一定の需要がある • 割とJavaScript的なライブラリなので JavaScriptに慣れるにはいいかも
お品書き • JavaScript入門 • HTML • Inline-SVG • D3.js入門
JavaScript入門
JavaScriptの実行環境 • 右上からその他のツール -> JavaScriptコンソール • コードを入力してEnterで実行 • Shift+Enterで複数行入力
Hello, world console.log("Hello, world!"); • コンソールで試してみよう
九九の表 for(var i=0; i<=9; i++){ for(var j=0; j<=9; j++){ console.log(i
+ " * " + j + " = " + i*j); } } • コンソールで試してみよう
念のため用語の説明 • メモリ…記憶領域 • 変数…メモリ上で値をしまっておく領域 • 制御文…プログラムを制御する分。分岐(if) や繰り返し(for, while)など •
演算子…+, -, %, =, ==みたいなやつ。
念のため用語の説明 • 手続き … procedure, 処理そのもの。 • 状態 … 処理の結果生まれたもの。(または
処理の前段階で準備してあったもの) • アルゴリズム … 手順を記したもの。料理本 のレシピみたいなもの
演算子と制御文、 関数
JavaScriptの特徴 • 制御文(if, forなど)はC言語に似ている • ブロックは{}, 文の終わりに; for(var i=0; i<=9;
i++){ if(i%3 && i%5)console.log(“FizzBuzz”); else if(i%3)console.log(“Fizz”); else if(i%5)console.log(“Buzz”); else console.log(i); }
JavaScriptの特徴 • 変数はvarで宣言 • 動的型付け言語、変数に何でも入れられる var hoge = 30; hoge
= “Hello, world!”; hoge = [“a”, 1, 10, “hogehoge”]; console.log(hoge);
JavaScriptの特徴 • 演算子 +, -, *, /, %, ++,
--, << , >>, >, <, =, ==, ===等 • 大体Cと一緒。 var a = 10, b = 3, c = 10; console.log(a+1, a%3, a++, a--, a==b, a==c); var hoge = [“a”, “b”, “c”]; var nya = [“a”, “b”, “c”]; console.log(a===b);
演算子 • +,-,*,/ … 四則演算 • ++, -- …一つずつ足す, 引く
• A % B… 剰余(A mod B)
演算子 • = … 代入 • == … 値の比較 •
=== … 厳密等価演算子(型を含めて比較, 暗 黙の型変換を行わない) Ex: console.log(“1” === 1); // false console.log(“1” == 1); // true
演算子 • A && B … AかつB • A ||
B … AまたはB • !(falseかtrue)で真偽を反転 console.log(1==1, 1==2); console.log(1==1 && 2==2, 1!=2 || 1==2); console.log(!false, !true);
typeof, instanceof演算子 • 変数はそれぞれ”型, type”を持っている。(型 については後述) • typeof A (Aは変数)とすると変数の型の名前
を文字列で返す。 var a = “HogeHoge”; var b = 10; console.log(typeof a); // => “string” console.log(typeof b); // => “number”
if文 • 先ほどの条件演算子を使う • if(A){B}else{C}で、Aの条件が真だったらB を実行。偽だったらCを実行。 var a = 10,
b = 20; if(a==b){ console.log(“Nyaaa”); }else{ console.log(“Nyan”); }
if文 • If-else if-else if-elseのように重ねることも できる • If-else{if-else}のように入れ子にもできる • {}の中身が一行だったら省略できる
if(){ }else if(){ if(){ }else(){ } }else{ } if(a==b)console.log(“Hogeeee”);
練習問題 • 変数a, bを作り、それぞれに文字列と数値を 代入する。a, bの型が一致するときはHoge, 一致しないときはNyaと出力せよ。
for文 • for(A;B;C){D} 1. Aで変数を初期化する。 2. Bの条件を満たしていればDを実行する。
3. Cを実行して2に戻る。後は繰り返し。 for(var i=0; i<10; i++){ for(var j=0; j>-5; j--){ console.log(i*j); } }
for文 • if文と同じく{}の中身が1行であれば{}は省略 できる。 for(var i=0; i<10; i++)console.log(i);
練習問題 • 変数aに任意の数字を代入し、aが素数かど うか判定せよ。(a-1から2までforでループさ せ、どれかで割り切れたら素数である。)
関数 • function 関数の名前(引数){処理内容}で手続 きを関数にまとめることができる • 数学の関数と違って必ずしも値を返す必要 はない function printHello(){
console.log(“Hello, world!”); } function plus(a, b){ return a + b; } console.log(plus(3, 4));
練習問題 • 与えられた数のmodを求める関数を作ろう mod(10, 3); // 1 • nの階乗を求める関数を作ろう
fanc(3); // 6 • n番目のフィボナッチ数を求める関数を作ろう fib(3); // 1+1 = 2
型とデータ構造
変数とデータ型 • JavaScriptは動的型付け言語。 • 型はちゃんとある。 var hoge = 30; hoge
= “Hello, world!”; hoge = [“a”, 1, 10, “hogehoge”]; console.log(hoge);
変数とデータ型 • C言語における型の意味は主にメモリ上のサ イズと解釈の仕方だった。 • JavaScriptではメモリ上の配置を気にする必 要は(基本的には)ない。型はデータ構造と密 接に関係している。 var arr
= [“a”, “b”]; console.log(typeof arr); var hash = {a: “b”, c: “d”}; console.log(typeof hash);
数値型(number) • 整数や少数の区別なし var num0 = 1; var num1 =
1/3; var num2 = 100000000000000000000000000000000000000000000; console.log(typeof num0, typeof num1, typeof num2); console.log(num2);
文字列型(string) • “文字”と”文字列”は別物!でもJavaScriptで はその違いを意識しなくてもよい! • str[0]などで一文字づつ配列のようにアクセ スできる。C言語ぽい。でもあくまでarray 型とは別物で、char型みたいなのはない。 var hoge
= "Hello, world!"; console.log(typeof hoge); console.log(hoge + 3);
配列型(array) • 値を一杯入れられるデータ構造。順番を持 つ。 • arr[0]のように順番に要素にアクセスできる。 var arr = [1,
2, 3, 4]; for(var i=0; i<arr.length; i++)console.log(arr[i]);
連想配列型(object) • 鍵keyと値valueの組み合わせからなるデータ 構造。順番はない。 • 他の言語だとhashやdictと呼ばれているもの • 実はJavaScriptにおいてはとてつもなく大き な意味を持っている(後述) var
obj = {“a”: 10, “b”: 30}; console.log(obj);
連想配列型(object) • 鍵から値にアクセスできる。アクセスの仕方 は二種類。 obj[“key”] obj.key • どちらも同じ意味。だけどこれのおかげで
JavaScriptは面白い。(後述) var obj = {“a”: 10, “b”: 30}; console.log(obj.a, obj[“a”]); obj[“c”] = 40; obj.d = 100; console.log(obj);
関数型(function) • 関数も文字列や配列と同じ扱い(これを関数 を第一級オブジェクトとして扱う、と表現 したりする。) • つまり、変数に代入したり、配列や連想配 列の要素にしたりできる。
関数型(function) • 変数に代入するときは以下のように書く。 • この右辺の書き方を無名関数と呼ぶ。 var HogeHuga = function(){ console.log(“Hoge”);
}
関数型(function) • JavaScriptでは無名関数を使った以下のよう な記法をよく見かける。これは一時変数を 新たに宣言してスコープを汚さないためで ある。 (function(a){ var i =
a*a; console.log(a*i); })(100); // ここで新しくiを宣言しても何の問題も起きない!
関数型(function) • 以下の2つは基本的に同じ意味。 function HogeHuga1(){ console.log(“Hoge”); } var HogeHuga2 =
function(){ console.log(“Hoge”); };
関数型(function) • 以下のように、無名関数はその外側のス コープで宣言された変数を使うことができ る。 var a = 100; var
hogehuga = function(){ console.log(a); }; hogehuga(); // => 100 a = 200; hogehuga(); // => 200
関数型(function) • 以下のように、無名関数が生き続ける限り その無名関数が使う変数も生き続ける。 • これをこのクロージャclosureが変数aを束 縛すると表現する。 var func =
(function(){ var a = 100; return function(){ console.log(a); }; )(); func(); //=> 100
練習問題 • 与えられた連想配列に”hoge”というキーが存 在するか確かめる関数を作ろう hasHoge({hoge: 3}); //-> true
hasHoge({nya: 4}); //-> false • 与えられた配列の中に入っているのがすべて数 値であるか確かめる関数を作ろう isAllNumber([3, 4, 5]); //-> true isAllNumber([1,2,”hoge”]); //-> false
練習問題 • 与えられた連想配列に”hoge”というキーが存 在するか確かめる関数を作ろう hasHoge({hoge: 3}); //-> true
hasHoge({nya: 4}); //-> false • 与えられた配列の中に入っているのがすべて数 値であるか確かめる関数を作ろう isAllNumber([3, 4, 5]); //-> true isAllNumber([1,2,”hoge”]); //-> false
ライブラリ等
ライブラリ • JavaScriptには標準で便利ライブラリがいく つか添付されている。 • 例えば正規表現のRegExpや数値計算用のも ろもろが入ったMathなど。 • この内Mathは可視化でほぼ必ず使うのでい くつか機能を確かめておこう。
ライブラリ • Math.log, pow, exp, cos, sin, tan, acos, atan,
atan2, … それぞれの値を求める関数 • Math.PI, Math.E …定数 • Math.floor, ceil, round…切り捨て切り上げ 四捨五入の関数 • Math.min, Math.max…渡された引数の内最 小最大のものを返す関数 等々。使い方がわからなければググろう。
練習問題 • ラジアンから度に変換する関数を作ろう • Math.expやMath.powを自分の手で実装し てみよう • Math.minとMath.maxの使い方を確かめよ う
オブジェクト指向
オブジェクト指向 • JavaScriptはprototype型のオブジェクト指 向言語 • 他の言語と性格が大きく違うので注意 classは存在しない!(ECMA6で入ったけどびみょ) 継承はできると思うな!(似たようなことはできる)
thisは一意に定まらない!(超大事) • LL言語でもLuaとかPerlあたりとは似てる仕 組み。RubyとかPythonとは全然違う。
オブジェクトとは何か • 手続きと状態を持つもの。 • (まあ色々な考え方があるけどJavaScriptではこ う考えておいて支障はない) • この手続きのことをメソッド、状態のことをプ ロパティやメンバ変数、メンバなどと呼ぶ。
オブジェクトとは何か • 関数はJavaScriptでは変数に代入でき、また連 想配列などの要素としても利用できる。 • つまり配列や連想配列は手続きと状態の両方を 持ちうる。 var obj =
{ hoge: 100, printHoge: function(){ console.log(this.hoge); } };
連想配列とオブジェクト • 配列よりも連想配列の方がラベリングしや すい・名前から実態が探索しやすいため、 JavaScriptにおけるオブジェクトは連想配列 と同一のものとみなされる。 • だから連想配列がオブジェクトという名前 • “配列オブジェクト”はオブジェクト=連想配
列の一種。(配列型とは一応別物。)
例 • 例:以下のfloor, ceil, roundはそれぞれMath オブジェクトの持つメソッドである。
クラスとは • ここでオブジェクトの他にクラスという概 念を新しく導入する。すでに他の言語でク ラスの概念を習得した人は読み飛ばしても ok。 • クラスとは似た性質を持つオブジェクトの” 鋳型”のようなものである。 A
a クラスA printHoge() hoge printHoge() hoge オブジェクトa
クラスとは • あるクラスから作られるオブジェクトのこ とをそのクラスのインスタンスと呼ぶ。 • あるクラスから作られるオブジェクトは同 じメソッドと同じ名前のプロパティを共通 して持っている。これらのことをインスタ ンスメソッド、インスタンス変数などと呼 ぶ。
A a c b インスタンスa,b,c クラスA printHoge() printHoge() printHoge() hoge hoge hoge printHoge() hoge
クラスとは • クラスからオブジェクトを作る際に使うメ ソッド(関数)のことをコンストラクタと呼ぶ。 • ここまでの説明はオブジェクト指向を標榜 する言語でそれなりに広く使われる定義・ 用語である。 A a
クラスA printHoge() hoge printHoge() hoge オブジェクトa コンストラクタ
JavaScriptにおけるクラス • classという言葉は使わないがクラス的に使 える機能ならある。 function A(val){ this.hoge = val; }
A.prototype.printHoge = function(){ console.log(this.hoge); }; var a = new A(100); a.printHoge(); //=> 100
JavaScriptにおけるクラス • 下の例ではAがコンストラクタ的な関数、 printHogeがAクラスのメソッド, aはAクラ スのインスタンスと表現することができる。 function A(val){ this.hoge =
val; } A.prototype.printHoge = function(){ console.log(this.hoge); }; var a = new A(100); a.printHoge(); //=> 100
JavaScriptにおけるクラス • hogeはAクラスのインスタンスが共通して 持つプロパティである。このプロパティに はメソッドの中からthisを介してアクセスで きる。 function A(val){ this.hoge =
val; } A.prototype.printHoge = function(){ console.log(this.hoge); }; var a = new A(100); a.printHoge(); //=> 100
thisに注意! • thisは便利なのだが、時々直観的でない動作 をする。例えば前頁のサンプルを改変した 以下のコードを実行してみると、Undefined と表示される。 function A(val){ this.hoge =
val; } A.prototype.printHoge = function(){ console.log(this.hoge); }; var a = new A(100); var func = a.printHoge; func(); //=> Undefined
thisに注意! • 実はthisはメソッドを呼び出す際に . の左に 書いたオブジェクトを指す変数なのである。 • 下の用に.を省略すると、thisにはグローバ ルオブジェクトのwindowが入る。 function
A(val){ this.hoge = val; } A.prototype.printHoge = function(){ console.log(this.hoge); }; var a = new A(100); var func = a.printHoge; func(); //=> Undefined
thisに注意! • メソッドを呼び出す際.の左に何を書いたか でthisは変動する。 • これはかなり大きな落とし穴なので注意。 僕も未だに時々やります。
問題 • 以下の3つのコードを実行し、thisが何になって いるか確認してください。 _.apply({a: 3, b: 4}, function(){console.log(this);})
function A(){ console.log(this); } A(); function B(){ this.hoge = “Hoge”; } B.prototype.printHoge = function(){ console.log(this.hoge); } var b = new B(); var func = b.printHoge; func();
問題 • 先ほどの項でオレオレpow,オレオレexpを 作った人はついでにオレオレMathオブジェ クトを作ってみてください。
オブジェクト指向の続き • (ここからは特に説明しないと思うので好き な人だけ読んでください)
型とオブジェクト
型とオブジェクト
JavaScriptにおける継承 • みんな大好き”継承”はJavaScriptにおいてど う実装されているのか?
JavaScriptにおける継承
HTML
HTMLとは • Webサイトの静的な部分を記述するための マークアップ言語 • ちょっと前までXHTMLとかに潰されるので はという雰囲気があったがHTML5で復権 • 昔は何でもHTMLでできたけど最近(という ほど最近でもないけど)は見た目はcss、動
きをつけるのはJSでやろうという流れ。
HTMLとは • 下のように<name></name>で囲まれた部 分をname要素と呼ぶ。 • classやidのことを属性attributesと呼ぶ。 <div class=“hoge” id=“nya” style=“color:
yellow;”> <h1>Hello</h1> <p> Hello, world! </p> </div>
HTMLとは • 要素は入れ子にすることができる。 • 下のdivを親要素、h1やpを子要素と呼ぶ。 <div class=“hoge” id=“nya” style=“color: yellow;”>
<h1>Hello</h1> <p> Hello, world! </p> </div>
HTMLとは • 下に書いてある属性の内、classは複数の要素 につける名前、idは一つの要素にしかつけら れない名前のことをさす。 • styleの中身がCSS。よく見たら別言語である ことがわかる。 <div class=“hoge”
id=“nya” style=“color: yellow;”> <h1>Hello</h1> <p> Hello, world! </p> </div>
問題 • 適当なWebページを開いてソースコードを 眺めてみてください。d3.jsの公式サイトと かお勧め。
Inline-SVG
SVGとは • HTMLの規格を策定しているのと同じ団体 W3Cが策定しているベクターグラフィック の規格 • HTMLのようなマークアップ言語(正確には XMLで)画像が書ける。 • 拡大縮小しても品質が劣化しない。
例えば • Wikipedia日本語版のマスコットキャラク ターの配布形式がsvg http://upload.wikimedia.org/wikipedia/co mmons/1/1b/Neko_Wikipe-tan.svg • 右クリックしてソースコードを表示してみ よう
Inline-SVGとは • 元々HTMLもSVGもxmlの一種なのでいっ しょくたに書いても問題ないんじゃない の?という規格。 • SVGが一時期下火だったこともありブラウ ザに実装されてきたのはごく最近。 • 実装が新しいのでブラウザ間で辻褄が合わ
ないことがままある。規格にも穴があった りする。
例えば • Snap.svg(http://snapsvg.io/) のワニなんか はinline-svgで動いてる。
実際のInline-SVG • 一つの図形(円、矩形、線…etc.)が一つの要 素として扱われる。
Inline-SVGの各要素について • <svg></svg> • この中に色々な図形を表す子要素を入れて いく。 • 今回使う属性はwidth, heightくらいのもの だと思う。
• <svg width=“500” height=“500”> <rect></rect> </svg>
矩形(くけい) <rect></rect> Attributes: x, y, width, height Example: <rect x=“10”
y=“10” width=“100” height=“100” fill=“yellow” stroke-width=“3” stroke=“black”></rect>
円 <circle></circle> Attributes: cx, cy, r, stroke, stroke-width, fill Example:
<circle cx=“50” cy=“50” r=“20” fill=“yellow”></circle>
線① <line></line> Attributes: x1, y1, x2, y2, stroke, stroke-width, fill
Example: <line x1=“0” y1=“0” x2=“10” y2=“10” stroke-width=“5” stroke=“yellow”></line>
線② <path></path> Attributes: d, fill, stroke, stroke-width, fill Example: 省略。ここら辺を参考に。
http://www.hcn.zaq.ne.jp/___/SVG11- 2nd/paths.html
グループ <g></g> Attributes: Example: <g transform=“translate(10, 10)”> <rect x=“0” y=“0”
width=“300” height=“100” fill=“white” stroke-width=“2” stroke=“black”></rect> <circle cx=“150” cy=“50” r=“35” fill=“red” stroke- width=“0”></circle> </g>
transform属性 • transform=“translate(10, 30) rotate(100)” でx, y方向にそれぞれ10, 30平行移動, 100度 回転という意味。
• これがあるからgroupが便利になる。
その他 • 他にも<def></def>など色々な要素、属性 がありますが省略します。詳しくは以下の Webページでどうぞ。 • http://www.w3.org/TR/SVG/Overview.ht ml • http://www.w3schools.com/svg/default.a
sp
問題 • 次の図形を書いてください。
D3.js入門
D3.jsとは • inline-svgの要素を付けたり消したり、属性 を書き換えたりをJavaScriptから楽に行おう というライブラリ。 • jQueryを知っている人ならば感覚がすぐつ かめるかもしれない。
D3.jsの基本 • Selection: HTMLやInline-SVGの要素をラッ プしたもの。 d3.select(str); d3.selectAll(str); •
等を使って作る。 Rect selection
d3.select, d3.selection • d3.select(“#hoge”)でid属性にhogeが指定さ れた要素を一つ取ってくる。 • d3.selectAll(“.nya”)でclass属性にnyaが指 定された要素をすべて取ってくる。 • d3.select(“body”)でbody要素を取ってくる。
Rect #hoge .nya Rect #nyan .nya body selection selection selectAll(“.nya”) selectAll(“body”)
練習問題 • サンプルのd3_select.htmlを開き、以下のコ マンドをコンソールで実行してください。 それぞれのselectionに何が入っているかを console.logで確認してください。 var s1 =
d3.select(“rect”); var s2 = d3.selectAll(“rect”); var s3 = d3.select(“#hoge”); var s4 = d3.selectAll(“nya”);
Selection • Selection.attr(属性の名前, 新しい値) • セレクションがラップする要素の属性を書 き換える。 • Example:
var selection = d3.select(“rect”); selection.css(width, 300);
Selection • Selection.css(プロパティの名前, 新しい値) • Selection.attrと同様にCSSのプロパティを 更新する。 var selection
= d3.select(“div”); selection.css(“width”, 1000);
Selectionその他のAPI • Selection.append(str) 新しい要素を付け足す。strはrectなど要素名。 • Selection.remove() selectionがラップする要素を削除する。 •
Selection.text(str) <div>hoge</div>のhogeにあたる部分を変更する。 • Selection.select(str), selectAll(str) 子要素から条件に合う要素を探す。
練習問題 • サンプルのd3_select.htmlを開き、以下の操 作を実行してください。 divの子供のrectをすべて選択して、console.logで その中身を確認する。 • サンプルのd3_select.htmlを開き、以下の操 作を実行してください。
真ん中の赤い円の半径を3倍にする 赤い円に黒い縁を付ける bodyに新しいdiv要素をつけたし、その中に Hello,worldの文字を入れる。
Selection.attrの謎 • 実はSelection.attrの第二引数には即値だけ でなく関数を入れることができる。 var arr = [1, 10, 30];
d3.select("svg") .selectAll("rect") .data(arr) .enter() .append("rect") .attr({ x: function(d, i){return 40*i}, y: 0, height: function(d, i){return 10*d;}, width: 30, fill: "#000" });
Selection.data • 肝は4行目の.data()である。ここでarrの各 要素とhtmlの要素をひとつずつ紐づけして いる。 • そしてxとheightに指定した関数では各要素 に紐づけされた配列の要素とそのインデッ クスを受け取り、属性に反映している。
Selection.data • 下のenter()や存在しない要素へのselectAll を理解するにはstageの概念が必要である。 var arr = [1, 10, 30];
d3.select("svg") .selectAll("rect") .data(arr) .enter() .append("rect") .attr({ x: function(d, i){return 40*i}, y: 0, height: function(d, i){return 10*d;}, width: 30, fill: "#000" });
Selection.data • stageの概念はd3.jsを使いこなすには必須で あるが、当面のところ棒グラフを作ったり、 散布図を作る際には理解せずとも大丈夫な ので一回目では触れないこととする。 • 理解のためには以下のページを参照のこと。 • http://ja.d3js.node.ws/document/tutorial/
circle.html
練習問題 • d3_bar_chartを改変してそれぞれの棒の色 を変えてみましょう。色はfill属性の値を変 更することで変えられます。
まとめ • 皆さんの気力が残っているならば2回目に続 く。
出展 • Wikipedia-tan: CC-BY-SAで配布されています。 Wikipe-tan User:Lokisis
User:Malyszkz/gallery File:Neko Wikipe-tan.png • 猫のイラストは全てPublic Domainで配布さ れています。