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
660
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
200
The Elements of Statistical Learning 読書会 3.4章
domitry
0
270
PCで絵をかこう!
domitry
0
550
精神は物理的に記述できるか
domitry
0
130
RubyとFortranの話
domitry
0
340
Nyaplot - a data visualization tool for Ruby
domitry
3
700
Nyaplotの紹介@U-22プロコン
domitry
1
160
D3.js入門
domitry
0
4.1k
3Dプリンタの使用感に関する考察
domitry
1
290
Other Decks in Programming
See All in Programming
ベクトル検索システムの気持ち
monochromegane
31
9.8k
AWS で実現する安全な AI エージェントの作り方 〜 Bedrock Engineer の実装例を添えて 〜 / how-to-build-secure-ai-agents
gawa
8
650
海外のアプリで見かけたかっこいいTransitionを真似てみる
shogotakasaki
1
160
Kubernetesで実現できるPlatform Engineering の現在地
nwiizo
3
1.8k
Unlock the Potential of Swift Code Generation
rockname
0
230
php-fpm がリクエスト処理する仕組みを追う / Tracing-How-php-fpm-Handles-Requests
shin1x1
5
2.8k
データベースエンジニアの仕事を楽にする。PgAssistantの紹介
nnaka2992
9
4.5k
複数ドメインに散らばってしまった画像…! 運用中のPHPアプリに後からCDNを導入する…!
suguruooki
0
460
Youtube Lofier - Chrome拡張開発
ninikoko
0
2.4k
パスキーのすべて / 20250324 iddance Lesson.5
kuralab
0
150
Day0 初心者向けワークショップ実践!ソフトウェアテストの第一歩
satohiroyuki
0
820
Deoptimization: How YJIT Speeds Up Ruby by Slowing Down / RubyKaigi 2025
k0kubun
0
120
Featured
See All Featured
A better future with KSS
kneath
239
17k
Become a Pro
speakerdeck
PRO
27
5.3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
135
33k
Adopting Sorbet at Scale
ufuk
76
9.3k
Facilitating Awesome Meetings
lara
54
6.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
Practical Orchestrator
shlominoach
186
10k
The Invisible Side of Design
smashingmag
299
50k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
18
1.1k
Docker and Python
trallard
44
3.3k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Done Done
chrislema
183
16k
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で配布さ れています。