Transitions - zziuni/d3 GitHub Wiki

Wiki โ–ธ API Reference โ–ธ Core โ–ธ Transitions

ํŠธ๋žœ์ง€์…˜์€ ์—ฐ์‚ฐ์ž๋ฅผ ์ฆ‰์‹œ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์‹œ๊ฐ„์„ ๋‘๊ณ  ์ ์šฉํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํƒ€์ž…์˜ selection์ด๋‹ค. transition ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ ํƒ๋ฌผ์—์„œ ํŠธ๋žœ์ง€์…˜์„ ๋Œ์–ด๋‚ธ๋‹ค. ํŠธ๋žœ์ง€์…˜์€ ์ „๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ attr์™€ style๊ฐ™์€ ์„ ํƒ๋ฌผ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•œ๋‹ค. ์‚ฌ์šฉ ์˜ˆ๋ฅผ ๋“ค๋ฉด, ํŠธ๋žœ์ง€์…˜์„ ์‹œ์ž‘ํ•˜๊ธฐ์ „์—๋Š” ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๊ณ , remove ์—ฐ์‚ฐ์ž๋กœ ํŠธ๋žœ์ง€์…˜์ด ๋๋‚œํ›„์— ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠธ๋žœ์ง€์…˜์€ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž์™€ ๋น„์Šทํ•˜๊ฒŒ ์—ฐ์‚ฐ๋œ ๋ฐ์ดํ„ฐ์˜ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์„œ์š”์†Œ ๋ณ„๋กœ ์ง€์—ฐ(delay)๊ณผ ์ง€์†(duration)์„ ๊ฐ–๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋‚˜ ์ƒ‰์ธ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ํŠธ๋žœ์ง€์…˜ ์ ์šฉ์˜ ์‹œ์ฐจ๋ฅผ ์‰ฝ๊ฒŒ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ •๋ ฌํ•œ ํ›„์— ํŠธ๋žœ์ง€์…˜ ์ค‘์— ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์žฌ ์ •๋ ฌ๋˜๋Š” ๊ฑธ ์ธ์ง€ํ•˜๊ธฐ ์‰ฝ๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋žœ์ง€์…˜์— ์‹œ์ฐจ๋ฅผ ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.์ด ๊ธฐ๋ฒ•์˜ ๋ณด๋‹ค ์ž์„ธํ•œ ๋‚ด์šฉ์€ Heer์™€ Robertson์˜ "Animated Transitions in Statistical Data Graphics"๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

D3๋Š” ์ž„์˜์˜ ๊ฐ’์„ ๊ฐ„๋‹จํ•œ ํŠธ๋žœ์ง€์…”๋‹ํ•˜๊ธฐ ์œ„ํ•œ ๋นŒํŠธ์ธ interpolator๋ฅผ ๋งŽ์ด ๊ฐ–๊ณ  ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํฐํŠธ ๋ฌธ์ž์—ด "500 12px sans-serif"์„ "300 42px sans-serif"๋กœ ํŠธ๋žœ์ง€์…˜์„ ์‹œ๋„ํ•˜๋ฉด D3๋Š” ํฐํŠธ ํฌ๊ธฐ์™€ ๋†’์ด๋ฅผ ๋ณด๊ฐ„(interpolate)ํ•  ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด์—์„œ ์ž๋™์œผ๋กœ ์ฐพ๋Š”๋‹ค. ์ž„์˜์˜ ์ค‘์ฒฉ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด, SVG path ๋ฐ์ดํ„ฐ๋„ ๊ฐ’ ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•  ์ˆ˜ ์žˆ๋‹ค. attrTween๊ณผ styleTween๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋นŒํŠธ์ธ ๋˜์–ด์žˆ์ง€ ์•Š์€ ์ปค์Šคํ…€ interpolator๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. D3์˜ interpolator๋Š” scales๋ฅผ ์œ„ํ•œ ๊ธฐ์ค€์„ ์ œ๊ณตํ•˜๋ฉฐ interpolator๊ฐ€ ์นผ๋ผ, ์ˆซ์ž, ์–ด๋–ค ์ž„์˜์˜ ๊ฐ’๊ณผ [0,1] ๋ฒ”์œ„๋‚ด์˜ t๋ฅผ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ํŠธ๋žœ์ง€์…˜๊ฐ€ ์•„๋‹ˆ๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์–ด์ง„ ๋ฌธ์„œ์š”์†Œ์—์„œ๋Š” ํ•œ ์ˆœ๊ฐ„์— ํ•œ ํŠธ๋žœ์ง€์…˜๋งŒ ํ™œ์„ฑํ™” ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๋™์ผ ๋ฌธ์„œ์š”์†Œ์—์„œ ์—ฌ๋Ÿฌ ํŠธ๋žœ์ง€์…˜์ด ์Šค์ผ€์ค„๋ง ๋  ์ˆ˜๋Š” ์žˆ๋‹ค. ์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋‚ด์— ์‹œ์ฐจ๋ฅผ ๋‘๊ณ  ์ œ๊ณต๋˜๋Š” ๋™์ผ ๋ฌธ์„œ์š”์†Œ์—์„œ ๊ฐ ํŠธ๋žœ์ง€์…˜์ด ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ƒˆ๋กœ์šด ํŠธ๋žœ์ง€์…˜์ด ์ฃผ์–ด์ง„ ๋ฌธ์„œ์š”์†Œ์—์„œ ์‹คํ–‰๋˜๋ฉด ์ด์ „ ํŠธ๋žœ์ง€์…˜๋“ค์€ ์Šค์ผ€์ค„๋ง๋œ ์•„์ง ์‹คํ–‰๋˜์ง€ ์•Š์€ ํŠธ๋žœ์ง€์…˜๊นŒ์ง€ ๋ชจ๋‘ ๋ฐ”๋กœ ์ทจ์†Œ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ์ด์ „ ํŠธ๋žœ์ง€์…˜์ด ๋™์ž‘ ์ค‘์ด๊ฑฐ๋‚˜ ์‹œ์ฐจ๋ฅผ ๋‘๊ณ  ์ง€์—ฐ ๋˜์–ด์žˆ๋”๋ผ๋„ ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์‘๋‹ต๊ฐ™์€ ์ƒˆ๋กœ์šด ํŠธ๋žœ์ง€์…˜์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๋‹จ๊ณ„์˜ ํŠธ๋žœ์ง€์…˜(์ด์ „ ๋‹จ๊ณ„์˜ ํŠธ๋žœ์ง€์…˜์˜ "end"์ด๋ฒคํŠธ์—์„œ ์ƒ์„ฑ๋œ ํŠธ๋žœ์ง€์…˜)๋Š” ๋™์ผ "์„ธ๋Œ€"๋กœ ์—ฌ๊ฒจ์ง„๋‹ค. ์—ฌ๊ธฐ์„œ "์„ธ๋Œ€"๋ž€ ์—ฌ๋Ÿฌ๋‹จ๊ณ„์˜ ํŠธ๋žœ์ง€์…˜์ด ์ƒ์„ฑ๋  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์†๋˜๋Š” ๋‹จ์ˆœ์ฆ๊ฐ€ํ˜• ์œ ์ผ ID๋กœ ์ถ”์ ํ•˜๋Š” ์˜ค๋ฆฌ์ง€๋„ ํŠธ๋žœ์ง€์…˜๊ณผ ๊ฐ™์€ "์„ธ๋Œ€"์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

ํŠธ๋žœ์ง€์…˜์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŠœํ† ๋ฆฌ์–ผ Working with Transitions๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

Starting Transitions

ํŠธ๋žœ์ง€์…˜์€ ์„ ํƒ๋ฌผ์—์„œ transition๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•œ๋‹ค. ํŠธ๋žœ์ง€์…˜์€ ๊ธฐ๋ณธ๊ฐ’์ด 0(zero)์ธ ์ง€์—ฐ๊ฐ’(delay) ์ดํ›„์— ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ง€์—ฐ๊ฐ’์ด 0์ธ ํŠธ๋žœ์ง€์…˜์€ ์‹ค์ œ๋กœ๋Š” ์ฒซ ํƒ€์ด๋จธ ์ฝœ๋ฐฑ ๋Œ€๊ธฐ๋ฅผ ์œ„ํ•œ ์•ฝ๊ฐ„์˜ ์ง€์—ฐ(~17ms) ํ›„ ์‹œ์ž‘ํ•œ๋‹ค. ํŠธ๋žœ์ง€์…˜ ์ง€์†์‹œ๊ฐ„์˜ ๊ธฐ๋ณธ๊ฐ’์€ 250ms์ด๋‹ค.

# d3.transition([selection])

์• ๋‹ˆ๋ฉ”์ด์…˜ ๋˜๋Š” ํŠธ๋žœ์ง€์…˜์„ ์ƒ์„ฑํ•˜๋ฉฐ d3.select(document).transition()์™€ ๊ฐ™๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ํŠธ๋žœ์ง€์…˜์—์„œ ์„ ํƒ๋ฌผ์„ ์–ป๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์„ ํƒ๋ฌผ์—์„œ ํŠธ๋žœ์ง€์…˜์„ ์–ป์œผ๋ฏ€๋กœ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด ๋ฉ”์„œ๋“œ์— selction ์ธ์ž๋ฅผ ๋„˜๊ฒจ์„œ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ์ง€์ •ํ•œ ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰, ๋‚ด๋ถ€์—์„œ ๋ณ„๋„ ์กฐ์ž‘์ด ์—†๋Š” ํ•จ์ˆ˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ transition.each์˜ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์ง€์ •ํ•œ ์„ ํƒ๋ฌผ์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ํŠธ๋žœ์ง€์…˜์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ ์„ ํƒ๋ฌผ์€ ๋ถ€๋ชจ ํŠธ๋žœ์ง€์…˜์˜ ์ง€์—ฐ์‹œ๊ฐ„๊ณผ ์ง€์†์‹œ๊ฐ„, ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์†ํ•œ๋‹ค. ์ด๋Š” ๋™์‹œ์— ์ผ์–ด๋‚˜๋Š” ํŠธ๋žœ์ง€์…˜์„ ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ• ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์„ ํƒ๋ฌผ์ด๋‚˜ ํŠธ๋žœ์ง€์…˜์—์„œ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค. D3์—์„œ axis component๊ฐ€ ๊ทธ ์˜ˆ๋‹ค.

# transition.delay(delay)

๋ฐ€๋ฆฌ์ดˆ๋กœ ํŠธ๋žœ์ง€์…˜ ์ง€์—ฐ์‹œ๊ฐ„ ์„ ์ง€์ •ํ•œ๋‹ค. delay ์ธ์ž๊ฐ€ ์ƒ์ˆ˜๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋Š” ๊ฐ™์€ ์ง€์—ฐ์‹œ๊ฐ„์„ ๊ฐ–์ง€๋งŒ delay ๊ฐ€ ํ•จ์ˆ˜๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ์„ ํƒํ•œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ „๋‹ฌ์ธ์ž๋Š” ๋ฐ์ดํ…€ d, ์ƒ‰์ธ๊ฐ’ i์ด๊ณ  this ์ปจํ…์ŠคํŠธ๋Š” ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์—ฐ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๊ธฐ๋ณธ์ง€์—ฐ๊ฐ’์€ 0์ด๋‹ค.

๋ฌธ์„œ์š”์†Œ์˜ ํŠธ๋žœ์ง€์…˜์— ์‹œ๊ฐ„์ฐจ๋ฅผ ๋‘๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ‰์ธ๊ฐ’ i๋ฅผ ๊ณฑํ•ด์„œ ์ง€์—ฐ์‹œ๊ฐ„์„ ์„ธํŒ…ํ•˜๋Š” ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉฐ, ์ง€์†์‹œ๊ฐ„ duration ์ด ๊ณ ์ •๋˜์–ด์žˆ๊ณ  ํ•ด๋‹น ์„ ํƒ๋ฌผ์— n ๊ฐœ์˜ ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด, 2 * duration ๋™์•ˆ ์ˆœ์ฐจ์ ์œผ๋กœ ํŠธ๋žœ์ง€์…˜์„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

.delay(function(d, i) { return i / n * duration; })

๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ ํ•จ์ˆ˜๋กœ ์ง€์—ฐ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

# transition.duration(duration)

๋ฐ€๋ฆฌ์ดˆ๋กœ ๋ฌธ์„œ์š”์†Œ๋‹น ์ง€์†์‹œ๊ฐ„์„ ์ง€์ •ํ•œ๋‹ค. duration ์ด ์ƒ์šฐ์ด๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋Š” ๊ฐ™์€ ์ง€์†์‹œ๊ฐ„์„ ๊ฐ–์ง€๋งŒ duration ์ด ํ•จ์ˆ˜๋ฉด ์„ ํƒํ•œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ „๋‹ฌ์ธ์ž๋Š” ๋ฐ์ดํ…€ d, ์ƒ‰์ธ๊ฐ’ i์ด๊ณ  this ์ปจํ…์ŠคํŠธ๋Š” ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์†์‹œ๊ฐ„์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๊ธฐ๋ณธ ์ง€์†์‹œ๊ฐ„ ๊ฐ’์€ 250ms์ด๋‹ค.

# transition.ease(value[, arguments])

ํŠธ๋žœ์ง€์…˜ ์ด์ง•(easing) ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ธ์ž value ๊ฐ€ ํ•จ์ˆ˜์ด๋ฉด ๊ทธ ํ•จ์ˆ˜๋ฅผ ๋ฒ”์œ„ [0,1]์—์„œ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ด๋ฐ ๊ฐ’ t ๋ฅผ ์ด์ง•ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉด value ์€ ๋ฌธ์ž์—ด๋กœ ๊ฐ€์ •ํ•˜๊ณ  arguments ๋Š” ์ด์ง•ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•ด์„œ d3.ease ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค. ๊ธฐ๋ณธ ์ด์ง• ํ•จ์ˆ˜๋Š” "cubic-in-out"์ด๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋กœ ๋ฌธ์„œ์š”์†Œ๋‚˜ ์†์„ฑ ๋ณ„๋กœ ์ปค์Šคํ…€ ์ด์ง• ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š”๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ "์„ ํ˜•(linear)" ์ด์ง• ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด attrTween๋‚˜ styleTween๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž interpolator์—์„œ ์ปค์Šคํ…€ ์ด์ง•์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Operating on Transitions

Content

# transition.attr(name, value)

์†์„ฑ๋ช…์ด name ์ธ ์†์„ฑ์„ ๊ฐ’ value ์œผ๋กœ ๋ณ€ํ™˜(transition)ํ•œ๋‹ค. ์†์„ฑ์˜ ํ˜„์žฌ๊ฐ’์ด value ๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ, value ๊ฐ€ ์ƒ์ˆ˜๋ฉด ๋ชจ๋“  selector๋“ค์ด ๋™์ผ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ํ•จ์ˆ˜์ด๋ฉด ๊ฐœ๋ณ„์ ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค. ํ•จ์ˆ˜์ผ ๋•Œ๋Š” ์ „๋‹ฌ์ธ์ž d, i๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ฐ๊ฐ ํ˜„์žฌ datum๊ณผ index์ด๋ฉฐ, ํ•จ์ˆ˜ ์•ˆ์—์„œ this๋Š” ํ•ด๋‹น DOM Elmenet์ด๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์†์„ฑ์˜ ํŠธ๋žœ์ง€์…˜ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. null์€ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ํŠธ๋žœ์ง€์…˜ ์ข…๋ฃŒํ›„ ์†์„ฑ ์‚ญ์ œ๋ฅผ ์›ํ•˜๋ฉด end์ด๋ฒคํŠธ์— ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๋ผ.

์‚ฌ์šฉํ•  interpolator๋Š” ์ข…๋ฃŒ๊ฐ’( value ) ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ ์„ ํƒ๋œ๋‹ค. ์ข…๋ฃŒ๊ฐ’์ด ์ˆซ์ž๋ฉด ์‹œ์ž‘๊ฐ’๋„ ์ˆซ์ž๋กœ ์—ฌ๊ธฐ๊ณ  interpolateNumber๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ข…๋ฃŒ๊ฐ’์ด ๋ฌธ์ž๋ฉด ์ •๊ทœ์‹ /^(#|rgb\(|hsl\()/๋ฅผ ํ†ตํ•ด์„œ ์ƒ‰์ƒ ๊ฐ’์ธ์ง€, CSS Name Color ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ๋งž์œผ๋ฉด ์‹œ์ž‘๊ฐ’์„ RGB ์นผ๋ผ๋กœ ๋ณด๊ณ  interpolateRgb๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘˜๋‹ค ์•„๋‹ˆ๋ฉด ๋ฌธ์ž์—ด์•ˆ์— ํŒŒ๋ญํžŒ ์ˆซ์ž๋“ค๋กœ ๋ณด๊ฐ„ ์ž‘์—…์„ ํ•˜๋Š” interpolateString๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

# transition.attrTween(name, tween)

์ง€์ •ํ•œ name ์†์„ฑ๊ฐ’์„ tween ํ•จ์ˆ˜๋กœ ํŠธ๋žœ์ง€์…˜ํ•œ๋‹ค. ํŠธ๋žœ์ง€์…˜์˜ ์‹œ์ž‘๊ณผ ๋ ๊ฐ’์€ tween ์œผ๋กœ ๊ฒฐ์ •๋˜๋ฉฐ, tween ํ•จ์ˆ˜๋Š” ํŠธ๋žœ์ง€์…˜์ด ๊ฐ ์š”์†Œ์—์„œ ์‹œ์ž‘๋  ๋•Œ ํ˜ธ์ถœ ๋œ๋‹ค. tween ์˜ ์ธ์ž๋Š” datum, index, atribute ์ด๊ณ  this๋Š” ํ•ด๋‹น DOM element์ด๋‹ค. ์ด ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๋ฐ˜๋“œ์‹œ interpolator์—ฌ์•ผ ํ•œ๋‹ค. interpolator๋Š” ์นผ๋ผ, ์ˆซ์ž ์•„๋‹ˆ๋ฉด ์–ด๋–ค ์ž„์˜์˜ ๊ฐ’๊ณผ [0,1] ๋ฒ”์œ„๋‚ด์˜ t๋ฅผ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, attr๋Š” attrTween ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , attr ์—ฐ์‚ฐ์ž๋Š” ์ข…๋ฃŒ๊ฐ’์— ์˜์ง€ํ•ด์„œ tween ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ข…๋ฃŒ๊ฐ’์€ ํ•จ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์ƒ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹ค์Œ์€ ์ข…๋ฃŒ๊ฐ’์ด ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ๋‹ค.

function tween(d, i, a) {
  return d3.interpolate(a, String(value.call(this, d, i)));
}

๋‹ค์Œ์€ ์ข…๋ฃŒ ๊ฐ’์ด ์ƒ์ˆ˜์ธ ๊ฒฝ์šฐ.

function tween(d, i, a) {
  return d3.interpolate(a, String(value));
}

attrTween๋Š” ์‚ฌ์šฉ์ž ์ •์˜ interpolater๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” SVG ํŒจ์Šค ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฒ”์šฉ ํ…Œํฌ๋‹‰์ค‘ dataspace interpolation(๋ฐ์ดํ„ฐ ๋ณด๊ฐ„๋ฒ•) ์ด ์žˆ๋‹ค. interpolateObject๋Š” ๊ฐ’ ๋‘ ๊ฐœ๋ฅผ ๋ณด๊ฐ„ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ณด๊ฐ„ ๊ฒฐ๊ณผ ๊ฐ’์€ ์†์„ฑ์˜ ์ƒˆ๋กœ์šด ๊ฐ’์„ ์—ฐ์‚ฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค(shape ๊ฐ™์€). ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ด ๊ณผ์ •์„ ์ž๋™ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” attr๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

# transition.style(name, value[, priority])

์ „๋‹ฌ์ธ์ž์ธ name ๊ณผ value ๋กœ CSS ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ํŠธ๋žœ์ง€์…˜ ํ•œ๋‹ค. priority ์ธ์ž๋Š” ์˜ต์…˜ ์ธ์ž๋กœ null์ด๊ฑฐ๋‚˜ "important" ๋ฌธ์ž์—ด(๋Š๋‚Œํ‘œ ์—†์Œ)์„ ๊ฐ–๋Š”๋‹ค. ํŠธ๋žœ์ง€์…˜ ์‹œ์ž‘๊ฐ’์€ ์—ฐ์‚ฐ๋œ ํ•ด๋‹น ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด๊ณ , ์ข…๋ฃŒ ๊ฐ’์€ value ๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ผ ๋•Œ๋Š” ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๊ฐ™์€ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ๋กœ ํŠธ๋žœ์ง€์…˜ ๋˜๊ณ , ํ•จ์ˆ˜์ผ ๋•Œ๋Š” ์„ ํƒ๋œ ๊ฐ ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ํŠธ๋žœ์ง€์…˜์„ ์ˆœ์„œ๋Œ€๋กœ ์‹œ์ž‘ํ•˜๊ธฐ์œ„ํ•ด์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋•Œ ์ „๋‹ฌ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ํ•ด๋‹น ์ƒ‰์ธ๊ฐ’ i์ด๊ณ  this ์ปจํ…์ŠคํŠธ๋Š” ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ํŠธ๋žœ์ง€์…˜ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋ฉฐ null ๊ฐ’์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํŠธ๋žœ์ง€์…˜์ด ๋๋‚œ ํ›„์— ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, end ์ด๋ฒคํŠธ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์„ค์ •ํ•˜๋ผ.

interpolator๋Š” ์ข…๋ฃŒ ๊ฐ’ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™์œผ๋กœ ์„ ํƒ๋œ๋‹ค. ์ข…๋ฃŒ ๊ฐ’์ด ์ˆซ์ž๋ฉด ์‹œ์ž‘ ๊ฐ’๋„ ์ˆซ์ž๋กœ ์—ฌ๊ธฐ๊ณ  interpolateNumber๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ข…๋ฃŒ๊ฐ’์ด ๋ฌธ์ž๋ฉด ์ •๊ทœ์‹ /^(#|rgb\(|hsl\()/๋ฅผ ํ†ตํ•ด์„œ ์ƒ‰์ƒ ๊ฐ’์ธ์ง€, CSS named colors ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ๋งž์œผ๋ฉด ์‹œ์ž‘๊ฐ’์„ RGB ์นผ๋ผ๋กœ ๋ณด๊ณ  interpolateRgb๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‘˜๋‹ค ์•„๋‹ˆ๋ฉด ๋ฌธ์ž์—ด์•ˆ์— ํŒŒ๋ญํžŒ ์ˆซ์ž๋“ค๋กœ ๋ณด๊ฐ„ ์ž‘์—…์„ ํ•˜๋Š” interpolateString๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ ์šฉ๋œ ์‹œ์ž‘ ๊ฐ’์€ ์ง€์ •ํ–ˆ๋˜ ๊ฐ’์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค. ํŠนํžˆ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ถ•์•ฝํ˜• ํ”„๋กœํผ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์ •ํ–ˆ๋‹ค๋ฉด ๋ง์ด๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด "font-size", "font-face"์˜ ์ถ•์•ฝํ˜•์€ "font"์ด๋‹ค. ) ๋”๊ตฐ๋‹ค๋‚˜ "font-size", "line-height" ๊ฐ™์€ ๊ณ„์‚ฐ๋œ ๋ฉด์ ์€ ํ•ญ์ƒ ๋‹จ์œ„๊ฐ€ ํ”ฝ์…€์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ ์ ˆํ•˜๊ฒŒ ํ”ฝ์…€๋กœ ์ข…๋ฃŒ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

# transition.styleTween(name, tween[, priority])

์ „๋‹ฌ์ธ์ž tween ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋ผ์„œ CSS ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ "name"์˜ ๊ฐ’์„ ํŠธ๋žœ์ง€์…˜ํ•œ๋‹ค. priority ์ธ์ž๋Š” ์˜ต์…˜ ์ธ์ž๋กœ null์ด๊ฑฐ๋‚˜ "important" ๋ฌธ์ž์—ด(๋Š๋‚Œํ‘œ ์—†์Œ)์„ ๊ฐ–๋Š”๋‹ค. ํŠธ๋žœ์ง€์…˜์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ ๊ฐ’์€ tween ํ•จ์ˆ˜๋กœ ๊ฒฐ์ •๋œ๋‹ค. tween ํ•จ์ˆ˜๋Š” ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ํŠธ๋žœ์ง€์…˜์ด ์‹œ์ž๋  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. ์ „๋‹ฌ์ธ์ž๋Š” ๋ฐ์ดํ…€ d, ์ƒ‰์ธ๊ฐ’ i, ํ•ด๋‹น ์†์„ฑ ๊ฐ’ a์ด๊ณ  'this ์ปจํ…์ŠคํŠธ๋Š” ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. tween ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ interpolator ์—ฌ์•ผ๋งŒ ํ•œ๋‹ค. interpolator๋Š” ์ƒ‰์ƒ, ์ˆซ์ž, ์ž„์˜์˜ ๊ฐ’๊ณผ ๋ฒ”์œ„ [0,1]์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ t ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, style ์—ฐ์‚ฐ์ž๋Š” ์ด styleTween ์—ฐ์‚ฐ์ž๋กœ ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค. style ์—ฐ์‚ฐ์ž๋Š” ์ข…๋ฃŒ๊ฐ’์— ์˜์ง€ํ•ด์„œ tween ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ข…๋ฃŒ๊ฐ’์€ ํ•จ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์ƒ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹ค์Œ์€ ์ข…๋ฃŒ๊ฐ’์ด ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ๋‹ค.

function tween(d, i, a) {
  return d3.interpolate(a, String(value.call(this, d, i)));
}

๋‹ค์Œ์€ ์ข…๋ฃŒ ๊ฐ’์ด ์ƒ์ˆ˜์ธ ๊ฒฝ์šฐ.

function tween(d, i, a) {
  return d3.interpolate(a, String(value));
}

styleTween ์—ฐ์‚ฐ์ž๋Š” ์‚ฌ์šฉ์ž ์ •์˜ interpolater๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” CSS3 ํŠธ๋žœ์ง€์…˜์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” style ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด ์—ฐ์‚ฐ์ž์—๋Š” ๊ณ„์‚ฐ๋œ ํ•ด๋‹น ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์›ํ•˜๋Š” ์ข…๋ฃŒ ๊ฐ’์œผ๋กœ ์ž๋™์œผ๋กœ ๋ฐ”๊พธ๋Š” interpolator๊ฐ€ ์žˆ๋‹ค.

# transition.text(value)

text ์—ฐ์‚ฐ์ž๋Š” textContent ํ”„๋กœํผํ‹ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋˜์–ด์žˆ๋‹ค. ํ…์ŠคํŠธ ์ปจํ…์ธ ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๊ธฐ์กด์— ์žˆ๋˜ ํ•˜์œ„ ๋ฌธ์„œ์š”์†Œ๋Š” ๊ต์ฒด๋œ๋‹ค.

ํŠธ๋žœ์ง€์…˜์ด ์‹œ์ž‘ํ•  ๋•Œ ์„ ํƒํ•œ ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ์— ์ง€์ •ํ•œ value๋กœ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋ฅผ ์ง€์ •ํ•œ๋‹ค. value ๊ฐ€ ์ƒ์ˆ˜์ด๋ฉด ๋ชจ๋“  ๋ฌธ์„œ์š”์†Œ๋Š” ๊ฐ™์€ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋กœ ์ง€์ •ํ•˜๊ณ  ํ•จ์ˆ˜๋ฉด ํŠธ๋žœ์ง€์…˜์— ์„ ํƒํ•œ ๊ฐœ๋ณ„ ๋ฌธ์„œ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•  ๋•Œ ์ž‘๋™ํ•œ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ์ „๋‹ฌํ•จ์ˆ˜๋Š” ๋ฐ์ดํ…€ d, ์ƒ‰์ธ๊ฐ’ i์ด๊ณ  this ์ปจํ…์ŠคํŠธ๋Š” ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ ๋ฌธ์„œ์š”์†Œ์˜ ํ…์ŠคํŠธ ์ปจํ…์ธ ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. null ๊ฐ’์€ ๋ชจ๋“  ์ปจํ…์ธ ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

# transition.tween(name, factory)

์ „๋‹ฌ์ธ์ž name ์œผ๋กœ ์‚ฌ์šฉ์ž tween์„ ๋“ฑ๋กํ•œ๋‹ค. ํŠธ๋žœ์ง€์…˜์ด ์‹œ์ž‘ํ•  ๋•Œ ์ „๋‹ฌ์ธ์ž factory ํ•จ์ˆ˜๋Š” tween ํ•จ์ˆ˜๋ฅผ ์‚ฐ์ถœํ•˜๊ธฐ์œ„ํ•ด์„œ ํŠธ๋žœ์ง€์…˜์—์„œ ์„ ํƒํ•œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ ํ˜ธ์ถœ๋œ๋‹ค. factory๊ฐ€ null๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด tween์€ ์„ ํƒํ•œ ๋ฌธ์„œ์š”์†Œ์—์„œ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” attr๊ณผ style tween์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ๋‹ค๋ฅธ ๋ฌธ์„œ ์ปจํ…์ธ ๋ฅผ ๋ณด๊ฐ„(interpolate)ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋‹ค์Œ์€ ํ…์ŠคํŠธ ์ปจํ…ํŠธ๋ฅผ ๋ณด๊ฐ„ํ•œ๋‹ค.

selection.transition().tween("text", function() {
  var i = d3.interpolate(this.textContent, "yellow");
  return function(t) {
    this.textContent = i(t);
  };
});

tween์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํŠธ๋žœ์ง€์…˜์„ "yellow"๋กœ ํ•˜๋“œ์ฝ”๋”ฉํ•œ ์œ„์˜ ์˜ˆ์ œ๊ฐ™์€ ๋ฐฉ์‹์ด ์•„๋‹Œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜(ํด๋กœ์ €๋ผ ๋ถ€๋ฅธ๋‹ค.)๋กœ ์ž‘์„ฑ๋œ๋‹ค. ์ฐธ๊ณ ํ•˜๋ ค๋ฉด D3๋ฅผ ์†Œ์Šค๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

# transition.remove()

ํŠธ๋žœ์ง€์…˜์ด ๋๋‚ฌ์„ ๋•Œ ์„ ํƒํ•œ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ํŠธ๋žœ์ง€์…˜์ด ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ์— ์Šค์ผ€์ค„๋˜์–ด ์žˆ์œผ๋ฉด, ๊ทธ ๋ฌธ์„œ์š”์†Œ๋Š” ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ , "end" ์ด๋ฒคํŠธ๋Š” ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•œ๋‹ค.

Subtransitions

ํŠธ๋žœ์ง€์…˜์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํŠธ๋žœ์ง€์…˜์—์„œ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์œ„์„ ํƒ๋ฌผ๊ณผ ๋น„์Šทํ•œ ํ˜•ํƒœ๋‹ค. ํ•˜์œ„ํŠธ๋žœ์ง€์…˜์€ ๋ถ€๋ชจ ํŠธ๋žœ์ง€์…˜์—์„œ ์ด์ง•, ์ง€์—ฐ์‹œ๊ฐ„, ์ง€์†์‹œ๊ฐ„์„ ์ƒ์†ํ•œ๋‹ค.

# transition.select(selector)

ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜์—์„œ ๊ฐ ๋ฌธ์„œ์š”์†Œ์— ๋Œ€ํ•ด selector ๋ฌธ์ž์—ด์— ํ•ด๋‹นํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ์ž์† ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•œ๋‹ค. ํ•ด๋‹น ๋ฌธ์„œ์š”์†Œ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†๋‹ค๋ฉด, ๋ฐ˜ํ™˜๋˜๋Š” ํ•ด๋‹น ์ƒ‰์ธ๊ฐ’์˜ ๋ฌธ์„œ์š”์†Œ๋Š” null์ด๋‹ค. data๋ฅผ ์ œ์™ธํ•œ ์—ฐ์‚ฐ์ž๋“ค์€ null ๋ฌธ์„œ์š”์†Œ๋ฅผ ์ž๋™์œผ๋กœ ๋ฌด์‹œํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ธฐ์กด ์„ ํƒ๋ฌผ์˜ ์ƒ‰์ธ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์„œ์š”์†Œ๊ฐ€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ๋ฐ˜ํ™˜๋˜๋Š” ํ•˜์œ„์„ ํƒ๋ฌผ๋กœ ์ƒ์†๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กญ๊ฒŒ ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ์™€ ์ž๋™์œผ๋กœ ์—ฎ์ธ๋‹ค. ์…€๋ ‰ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ๋ฌธ์„œ ๋ฌธ์„œ์ƒ ์ฒซ๋ฒˆ์งธ ๋ฌธ์„œ์š”์†Œ๋งŒ ์„ ํƒ๋œ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค.

selection.select(selector).transition()

selection ์ด ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜ ์•„๋ž˜์˜ ์„ ํƒ๋ฌผ์ด๊ณ  ๊ทธ๋Ÿฌ๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ์ƒˆ๋กœ์šด ํŠธ๋žœ์ง€์…˜์€ ํ•ด๋‹น ํŠธ๋žœ์ง€์…˜์˜ ์ด์ง•, ์ง€์—ฐ์‹œ๊ฐ„, ์ง€์†์‹œ๊ฐ„์„ ์ƒ์†ํ•œ๋‹ค.

# transition.selectAll(selector)

ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜์˜ ๊ฐ ๋ฌธ์„œ์š”์†Œ์—์„œ selector ๋ฌธ์ž์—ด์— ํ•ด๋‹นํ•˜๋Š” ์ž์† ๋ฌธ์„œ์š”์†Œ๋“ค์„ ์„ ํƒํ•œ๋‹ค. ํ•ด๋‹น ์„ ํƒ๋ฌผ์˜ ์กฐ์ƒ ๋…ธ๋“œ๋กœ ๊ทธ๋ฃนํ•‘๋œ ์„ ํƒ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•ด๋‹น ๋ฌธ์„œ์š”์†Œ์—์„œ ์…€๋ ‰ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์—†์œผ๋ฉด ๋ฐ˜ํ™˜ ์„ ํƒ๋ฌผ์—์„œ ํ•ด๋‹น ์ƒ‰์ธ๊ฐ’์˜ ๊ทธ๋ฃน์€ ๋นˆ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ํ•˜์œ„์„ ํƒ๋ฌผ์€ ํ•ด๋‹น ์„ ํƒ๋ฌผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์ „์— ์„ ํƒ๋œ ๋ฌธ์„œ์š”์†Œ์™€ ์—ฎ์˜€๋‹ค๋ฉด ๊ทธ ๋ฐ์ดํ„ฐ๋Š” ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•œ๋‹ค.

selection.selectAll(selector).transition()

selection ์€ ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜์˜ ํ•˜์œ„ ์„ ํƒ๋ฌผ์ด๊ณ  ๊ทธ๋Ÿฌ๋ฉด ๋ฐ˜ํ™˜๋˜๋Š” ์ƒˆ๋กœ์šด ํŠธ๋žœ์ง€์…˜์€ ํ•ด๋‹น ํŠธ๋žœ์ง€์…˜์˜ ์ด์ง•(easing), ์ง€์—ฐ์‹œ๊ฐ„, ์ง€์†์‹œ๊ฐ„์„ ์ƒ์†ํ•œ๋‹ค. ๊ฐ ํ•˜์œ„ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์†์‹œ๊ฐ„๊ณผ ์ง€์—ฐ์‹œ๊ฐ„์€ ํ•ด๋‹น ํŠธ๋žœ์ง€์…˜์—์„œ ๋ถ€๋ชจ ๋ฌธ์„œ์š”์†Œ์˜ ์ง€์†์‹œ๊ฐ„๊ณผ ์ง€์—ฐ์‹œ๊ฐ„์„ ์ƒ์†ํ•œ๋‹ค.

# transition. filter (selector)

์ „๋‹ฌ์ธ์ž๋กœ ์ง€์ •ํ•œ selector ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์„œ์š”์†Œ๋งŒ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ณ€ํ™˜์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ณ€ํ™˜์„ ํ•„ํ„ฐ๋งํ•œ๋‹ค. ์„ ํƒ์ž selector ๋Š” ".foo"๊ฐ™์€ ์„ ํƒ์ž ๋ฌธ์ž์—ด๋งŒ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋“ค ์ฒ˜๋Ÿผ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž๋Š” ๋ฐ์ดํ…€ d์™€ ์ƒ‰์ธ๊ฐ’ i์ด๊ณ  this ์ปจํ…์ŠคํŠธ๋Š” ํ•ด๋‹น DOM ๋ฌธ์„œ์š”์†Œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฐฐ์—ด์˜ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ filter ์ฒ˜๋Ÿผ ๋ฐ˜ํ™˜ ์„ ํƒ๋ฌผ์€ ์›๋ณธ ์„ ํƒ๋ฌผ์˜ ์ƒ‰์ธ๊ฐ’์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ฌธ์„œ์š”์†Œ๊ฐ€ ์†Œ๊ฑฐ๋œ ์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ƒ‰์ธ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์œผ๋ฉด select ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜ ๊ฑด๋„ˆ์”ฉ ๋ฌธ์„œ์š”์†Œ๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด

var odds = transition.select(function(d, i) { return i & 1 ? this : null; });

๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ํ•„ํ„ฐ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

var odds = transition.filter(function(d, i) { return i & 1; });

ํ•„ํ„ฐ ์ธ์ž๋กœ ์„ ํƒ์ž ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด

var odds = transition.filter(":nth-child(odd)");

์ด์ฒ˜๋Ÿผ, ๋ฌธ์„œ์š”์†Œ์˜ ํ•˜์œ„์ง‘ํ•ฉ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ select, filter ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# transition.transition()

์ด์ „ ๋‹จ๊ณ„ ํŠธ๋žœ์ง€์…˜(transition)๊ณผ ๋™์ผํ•œ ์„ ํƒ ๋ฌธ์„œ์š”์†Œ์—์„œ ๊ทธ ํŠธ๋žœ์ง€์…˜์˜ ์ข…๋ฃŒ์™€ ํ•จ๊ป˜ ์‹œ์ž‘ํ•˜๋Š” ์‹ ๊ทœ ํŠธ๋žœ์ง€์…˜์„ ์ƒ์„ฑํ•œ๋‹ค. ์ƒˆ๋กœ์šด ํŠธ๋žœ์ง€์…˜์€ ํ˜„์žฌ ์ด์ „ ๋‹จ๊ณ„ ํŠธ๋žœ์ง€์…˜์˜ ์ง€์—ฐ์‹œ๊ฐ„๊ณผ ์ง€์†์‹œ๊ฐ„์„ ์ƒ์†ํ•œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” "end" ์ด๋ฒคํŠธ๋ฅผ ์œ„ํ•œ ๋ฆฌ์Šค๋„ˆ ์—†์ด๋„ chained transitions๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Control

# transition.each([type, ]listener)

์ „๋‹ฌ์ธ์ž type ์„ ๋„˜๊ธฐ๋ฉด ํŠธ๋žœ์ง€์…˜ ์ด๋ฒคํŠธ๋ฅผ ์œ„ํ•œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. "start", "end"์ด๋ฒคํŠธ๋„ ์—ฌ๊ธฐ์— ํฌํ•จ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ํŠธ๋žœ์ง€์…˜ ์•ˆ์—์„œ ์ง€์—ฐ์‹œ๊ฐ„๊ณผ ์ง€์†์‹œ๊ฐ„์ด ๋ฐ˜๋ณต๋˜๋”๋ผ๋„ ๊ฐœ๋ณ„ ๋ฌธ์„œ์š”์†Œ๋ณ„๋กœ ํ˜ธ์ถœ๋œ๋‹ค. start ์ด๋ฒคํŠธ๋ฅผ ๊ฐœ๋ณ„ ๋ฌธ์„œ์š”์†Œ๊ฐ€ ํŠธ๋žœ์ง€์…˜ ์‹œ์ž‘ ๊ฐ™์€ ์ฆ‰๊ฐ์ ์ธ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๊ธฐ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. end ์ด๋ฒคํŠธ๋Š” ํ•ด๋‹น ๋ฌธ์„œ์š”์†Œ this๋ฅผ ์„ ํƒํ•˜๊ณ  ์ƒˆ ํŠธ๋žœ์ง€์…˜์„ ์ด๋Œ์–ด๋Š” ๊ณผ์ •์„ ํ†ตํ•ด์„œ ๋‹ค๋‹จ๊ณ„ ํŠธ๋žœ์ง€์…˜์„ ์ผ์œผํ‚ค๊ธฐ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. end ์ด๋ฒคํŠธ์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ํŠธ๋žœ์ง€์…˜์€ ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜ ID๋ฅผ ์ƒ์†ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ์ด๋ฏธ ์˜ˆ์•ฝ๋œ ์‹ ๊ทœ ํŠธ๋žœ์ง€์…˜์„ ๋ฅ์–ด์“ฐ๋Š”์ผ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

type ์ด ์—†์œผ๋ฉด selection.each์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

# transition.call(function[, argumentsโ€ฆ])

ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜์—์„œ ์˜ต์…˜ ์ธ์ž arguments ์™€ ํ•จ๊ป˜ function ๋ฅผ ํ•œ๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค. call ์—ฐ์‚ฐ์ž๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’๊ณผ ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. call ์—ฐ์‚ฐ์ž๋Š” ์ˆ˜๋™์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋™์ž‘์ด ๋™์ผํ•˜์ง€๋งŒ ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ์ ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์†์„ฑ์„ ์ง€์ •ํ•˜๋ ค ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ๊ฐ™์€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

function foo(transition) {
  transition
      .attr("name1", "value1")
      .attr("name2", "value2");
}

์ด๊ฑธ ์ด๋ ‡๊ฒŒ ๋ถ€๋ฅผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ,

foo(d3.selectAll("div").transition())

์ด๋ ‡๊ฒŒ ํ•ด๋„ ๊ฐ™๋‹ค.

d3.selectAll("div").transition().call(foo);

๋Œ€๋ถ€๋ถ„์€ ํŠธ๋žœ์ง€์…˜๊ณผ ์„ ํƒ๋ฌผ์—์„œ ๋ชจ๋‘ ๋™์ผํ•œ ํ•จ์ˆ˜ foo ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์„ ํƒ๋ฌผ์™€ ํŠธ๋žœ์ง€์…˜์ด ๋™์ผ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ ์ด๊ฒฝ์šฐ, ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ this ์ปจํ…์ŠคํŠธ๋„ ํ˜„์žฌ ํŠธ๋žœ์ง€์…˜์ด๋‹ค. ์ด ์—ฐ์‚ฐ์ž์™€ ์ฒซ ๋ฒˆ์งธ ์ „๋‹ฌ์ธ์ž๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฉด์ด ์ข€ ์žˆ์–ด์„œ ์ฐจํ›„์— ๊ฐœ์„ ๋  ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

Easing

# d3.ease(type[, argumentsโ€ฆ])

์˜ต์…˜ ์ธ์ž arguments ๋ฅผ ๊ฐ€์ง€๊ณ  ์ง€์ •ํ•œ type ์˜ ๋‚ด์žฅ ์ด์ง•(easing) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด์ง• ํ•จ์ˆ˜๋Š” ๋ฒ”์œ„ [0,1] ๋‚ด์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž„ ๊ฐ’ t ๋ฅผ ์ทจํ•˜๊ณ  ์ด๋ฅผ ์œ ์‚ฌํ•œ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ๊ฐ’๊ณผ ๋งคํ•‘ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํŠธ๋žœ์ง€์…˜ easing๋ฅผ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค์Œ ํƒ€์ž…์˜ ์ด์ง•์„ ์ง€์›ํ•œ๋‹ค.

  • linear - the identity function, t. ๋…์ž์  ํ•จ์ˆ˜.
  • poly(k) - raises t to the specified power k (e.g., 3). t ๋ฅผ k ๋งŒํผ ๊ฑฐ๋“ญ์ œ๊ณฑ ํ•ด์„œ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • quad - equivalent to poly(2). poly(2)์™€ ๋™์ผ
  • cubic - equivalent to poly(3). poly(3)์™€ ๋™์ผ
  • sin - applies the trigonometric function sin. ์‚ผ๊ฐํ•จ์ˆ˜ sin ๋ฅผ ์ ์šฉ.
  • exp - raises 2 to a power based on t. t ์— ๊ธฐ์ดˆํ•ด์„œ 2๋ฅผ ๊ฑฐ๋“ญ์ œ๊ณฑ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค.
  • circle - the quarter circle. 1/4์˜ ํ˜ธ
  • elastic(a, p) - simulates an elastic band; may extend slightly beyond 0 and 1.
  • back(s) - simulates backing into a parking space.
  • bounce - simulates a bouncy collision.

์ด๋Ÿฐ ๋‚ด์žฅ ํƒ€์ž…๋“ค์€ ๋‹ค์Œ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™•์žฅ๋  ์ˆ˜ ์žˆ๋‹ค.

  • in - the identity function. ๋…์ž์ ์ธ ํ•จ์ˆ˜.
  • out - reverses the easing direction to [1,0]. [1.0]์œผ๋กœ ์ด์ง• ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ.
  • in-out - copies and mirrors the easing function from [0,.5] and [.5,1]. [0,.5]์™€ [.5,1]์—์„œ ์ด์ง• ํ•จ์ˆ˜๋ฅผ ๋ณต์ œํ•˜๊ณ  ๋ฐ€๋Ÿฌ๋งํ•œ๋‹ค.
  • out-in - copies and mirrors the easing function from [1,.5] and [.5,0]. [1,.5]๊ณผ [.5,0]์—์„œ ์ด์ง• ํ•จ์ˆ˜๋ฅผ ๋ณต์ œํ•˜๊ณ  ๋ฐ€๋Ÿฌ๋งํ•œ๋‹ค.

๊ธฐ๋ณธ ์ด์ง• ํ•จ์ˆ˜๋Š” ์ ๋‹นํ•œ slow-in slow-out ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•˜๋Š” "cubic-in-out" ์ด๋‹ค.

# ease(t)

๋ฒ”์œ„ [0,1] ์•ˆ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž„ t ๋ฅผ ์ธ์ž๋กœ ์ฃผ๋ฉด ์ด์ง•๋œ ํƒ€์ž„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜ํ™˜๋œ ๊ฐ’๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ”์œ„ [0,1]์•ˆ์— ์žˆ๋‹ค. ํ•˜์ง€๋งŒ "elastic" ์ฒ˜๋Ÿผ ๋ช…ํ™•ํ•œ ์ด์ง• ํ•จ์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ์•ฝ๊ฐ„ ๋„˜์„ ์ˆ˜๋„ ์žˆ๋‹ค.

Timers

D3๋Š” ์ˆ˜์ฒœ๊ฐœ์˜ ํƒ€์ด๋จธ๋ฅผ ์ตœ์†Œํ•œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ํšจ์œจ์˜ ํƒ€์ด๋จธ ํ๋ฅผ ๋‚ด๋ถ€์—์„œ ์œ ์ง€ํ•œ๋‹ค. ๋˜ํ•œ ์ด ํƒ€์ด๋จธ ํ๋Š” ํŠธ๋žœ์ง€์…˜์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๊ฑฐ๋‚˜ ์ˆœ์ฐจ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋„๋ก ์Šค์ผ€์ค„ ๋˜์—ˆ์„ ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํƒ€์ด๋ฐ์ด ์ผ๊ด€๋˜๋„๋ก ๋ณด์žฅํ•ด์ค€๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•œ๋‹ค๋ฉด ํƒ€์ด๋จธ ํ๋Š” ์œ ์—ฐํ•˜๋ฉด์„œ ํšจ์œจ์ ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์œ„ํ•ด์„œ requestAnimationFrame๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ํƒ€์ด๋จธ ํ๋Š” ๋‹ค์Œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ๊ณผ์˜ ๊ฐ„๊ฒฉ์ด ๊ธธ ๊ฒฝ์šฐ์—๋„ setTimeout์— ๋น„ํ•ด์„œ ํ˜„๋ช…ํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

# d3.timer(function, [delay, [mark]])

์‚ฌ์šฉ์ž ์ •์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํƒ€์ด๋จธ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. ์ด ํƒ€์ด๋จธ๋Š” ์ „๋‹ฌ์ธ์ž function ์ด true๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์† ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ํƒ€์ด๋จธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์ทจ์†Œํ•  ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ๋™์ž‘์ด ๋๋‚˜๋ฉด ํƒ€์ด๋จธ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜๋“œ์‹œ true๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

์ •ํ•ด์ง„ ํƒ€์ž„์Šคํ…œํ”„ mark ์—์„œ๋ถ€ํ„ฐ delay ๋ฐ€๋ฆฌ์ดˆ ์ดํ›„์— ์ฃผ์–ด์ง„ ํ•จ์ˆ˜ function ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ๋งŒ ํ•œ๋‹ค๋ฉด ์˜ต์…˜ ์ „๋‹ฌ์ธ์ž delay ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. delay ๋ฅผ ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๊ณ  mark ๋Š” ํŠน์ •์‹œ์  ์ดํ›„๋ฅผ ๋ฐ€๋ฆฌ์ดˆ๋กœ ๋‚˜ํƒ€๋‚ธ ํƒ€์ž„์Šคํ…œํ”„ ์ •์ˆ˜๋‹ค. mark ๋ฅผ ์ƒ๋žตํ•˜๋ฉด Date.now()๋ผ ๊ฐ€์ •ํ•˜๋ฉฐ, ์ ์ ˆํ•œ ํƒ€์ž„์Šคํ…œํ”„๋ฅผ ์œ„ํ•œ data ๊ฐ์ฒด ๋ณ€ํ™˜์„ ์œ„ํ•ด Date.getTime๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

function ์ด ํ˜ธ์ถœ๋˜์•ผ ํ•˜๋Š” ์‹œ์ ์ด ํŠน์ • ์‹œ์ ์—์„œ ์ƒ๋Œ€์ ์ด๋„๋ก ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ delay ์™€ mark ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋‚ ์งœ๊ธฐ๋ฐ˜์˜ ์•ฝ์†์€ ๋‹ค์Œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

var appointment = new Date(2012, 09, 29, 14, 0, 0); // @ 29/sep/2012, 1400 hours
...
// ๋„ค์‹œ๊ฐ„ ํ˜น์€ ๊ทธ ์ „์— ํ™”๋ฉด์— ์•ฝ์†์„ ํ™˜๊ธฐ์‹œํ‚จ๋‹ค. delay์—๋Š” ์Œ์ˆ˜๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค!
d3.timer(flash_appointments_due, -4 * 3600 * 1000, appointment);

# d3.timer.flush()

ํƒ€์ด๋จธ๋ฅผ ์ง€์—ฐ์—†์ด ์ฆ‰์‹œ ์‹คํ–‰ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ '์ง€์—ฐ์—†๋Š”' ํŠธ๋žœ์ง€์…˜์€ ์•ฝ๊ฐ„์˜ ์ง€์—ฐ(10ms ๋ฏธ๋งŒ) ํ›„ ์‹คํ–‰๋œ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‘ ๋ฒˆ ๋žœ๋”๋ง ํ•  ๋•Œ ์‚ด์ง ๊นœ๋ฐ•์ด๋Š” ์›์ธ์ด ๋œ๋‹ค. ๋‘๋ฒˆ์˜ ๋žœ๋”๋ง์€ ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋๋‚ฌ์„ ๋•Œ ํ•œ ๋ฒˆ ์ผ์–ด๋‚˜๊ณ  ๋‚˜์„œ ์ฒซ ํƒ€์ด๋จธ ์ฝœ๋ฐฑ์—์„œ ๋ฐ”๋กœ ๋‹ค์‹œ ์ผ์–ด๋‚œ๋‹ค. ๋งŒ๋ฃŒ๋œ ํƒ€์ด๋จธ๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์ข…๋ฃŒ ์ง€์ ์— ํ๋กœ ์Œ“์•„์„œ ์ง€์—ฐ์—†๋Š” ํŠธ๋žœ์ง€์…˜์„ ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊นœ๋ฐ•์ž„์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

Interpolation

์˜ฎ๊ธด์ด: Interpolation์€ ๋‘ ๊ฐ’ ์‚ฌ์ด๋ฅผ ๋“ฑ๊ฐ„๊ฒฉ์˜ ๊ฐ’๋“ค๋กœ ๋งค๊พธ๋Š” ๋ณด๊ฐ„์„ ๋œปํ•œ๋‹ค. interpolator๋Š” ๊ทธ ์—ญํ™œ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๊ตณ์ด ์˜ฎ๊ธฐ๋ฉด '๋ณด๊ฐ„์ž'์ด์ง€๋งŒ ์ž˜ ์™€๋‹ซ์ง€ ์•Š๋Š”๊ฑด ๋™์ผํ•˜๊ธฐ์— ๊ทธ๋ƒฅ ์™ธ๋ž˜์–ด '์ธํ„ฐํด๋ ˆ์ดํ„ฐ'๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

D3๋Š” ์ž„์˜ ๊ฐ’๋“ค์„ ๊ฐ„๋‹จํžˆ ๋ณด๊ฐ„(interpolate)ํ•˜๊ธฐ ์œ„ํ•œ ๋งŽ์€ ์ข…๋ฅ˜์˜ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ(interpolator)๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ๋‹ค. ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” ์ •์˜์—ญ ๋ฒ”์œ„๊ฐ€ [0,1]์ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ t ๋ฅผ ์ƒ‰์ƒ, ์ˆซ์ž, ์ž„์˜ ๊ฐ’๊ณผ ๋งคํ•‘ํ•œ ํ•จ์ˆ˜๋‹ค.

# d3.interpolate(a, b)

a , b ๋‘ ๊ฐ’ ์‚ฌ์ด์˜ ๊ธฐ๋ณธ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ํƒ€์ž…์€ ์ข…๋ฃŒ๊ฐ’ b ์— ๊ธฐ๋ฐ˜ํ•œ๋‹ค. b ๊ฐ€ ์ˆซ์ž๋ฉด, a ๋ฅผ ์ˆซ์ž๋กœ ํŒ๋‹จํ•˜๊ณ  interpolateNumber๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. b ๊ฐ€ ๋ฌธ์ž์—ด์ด๋ฉด, /^(#|rgb\(|hsl\()/ ํ˜•ํƒœ์˜ ์ƒ‰์ƒ์œผ๋กœ ํ‘œํ˜„๊ฐ€๋Šฅํ•œ์ง€, CSS named colors ์ค‘ ํ•˜๋‚˜์ธ์ง€ ํ™•์ธ ์ž‘์—…์„ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ b ๊ฐ€ ์ƒ‰์ƒ์ด๋ฉด, a ๋„ RGB ์ƒ‰์ƒ์œผ๋กœ ๋ณด๊ณ  interpolateRgb๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋‘˜์ด ์•„๋‹ˆ๋ฉด interpolateString๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌธ์ž์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆซ์ž๋ฅผ ๋ณด๊ฐ„(interpolate) ์ž‘์—…ํ•œ๋‹ค. ์ด๊ฐ™์€ ๊ธฐ๋ณธ ์ธํ„ฐํฌ๋ ˆ์ดํ„ฐ ํƒ€์ž…์€ ์ถ”๊ฐ€ ํƒ€์ž…์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ d3.interpolators ๋ฐฐ์—ด์— ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์„œ(push) ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

# interpolate(t)

๋ฒ”์œ„ [0,1]์˜ ํŒŒ๋ผ๋ฏธํ„ฐ t ๋ฅผ ๋ฐ›์•„์„œ, ์—ฐ๊ด€๋œ ๋ณด๊ฐ„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž…๋ ฅ๊ฐ’ ์ •์˜์—ญ(ํŠน์ •๋Ÿ‰์˜ ์ˆ˜์น˜๊ฐ’)์„ ์ถœ๋ ฅ๊ฐ’ ์น˜์—ญ(์ƒ‰์ƒ์ด๋‚˜ ํ”ฝ์…€ ์ขŒํ‘œ์˜ ๋ฒ”์œ„)์œผ๋กœ ๋งคํ•‘ํ•˜๊ธฐ์œ„ํ•œ ์Šค์ผ€์ผ(scale) ๊ฒฐํ•ฉ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

# d3.interpolateNumber(a, b)

๋‘ ์ˆซ์ž a, b ์‚ฌ์ด์˜ ์ˆซ์žํ˜• ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜ํ™˜ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

function interpolate(t) {
  return a * (1 - t) + b * t;
}

์ฃผ์˜์‚ฌํ•ญ: attr ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•ด์„œ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ˆซ์ž 0์—์„œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋๋‚˜๋Š” ๋ณด๊ฐ„์ž‘์—…์€ ํ”ผํ•ด์•ผ ํ•œ๋‹ค. ๋ฌธ์žํ™” ํ–ˆ์„ ๋•Œ, ๋งค์šฐ ์ž‘์€ ๊ฐ’์€ ๊ณผํ•™์  ํ‘œ๊ธฐ๋ฒ•(scientific notation)์œผ๋กœ ๋ณ€ํ™˜๋ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” ๋ฌด์˜๋ฏธํ•œ ์†์„ฑ๊ฐ’์ด๋‚˜ ์Šคํƒ€์ผ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ์•ผ๊ธฐํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 0.0000001๋Š” ๋ฌธ์ž์—ด "1e-7"๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ์ด๋Š” ๋ถˆํˆฌ๋ช…๋„ ๊ฐ’์„ ๋ณด๊ฐ„ํ•  ๋•Œ ํ™•์‹คํžˆ ๋“ค์–ด๋‚œ๋‹ค. ๊ณผํ•™์  ํ‘œ๊ธฐ๋ฒ•์„ ํ”ผํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” 1e-6์—์„œ ํŠธ๋žœ์ง€์…˜์„ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋๋‚ด์•ผ ํ•œ๋‹ค. 1e-6์€ ๋ฌธ์ž์—ดํ™” ํ•  ๋•Œ, ์ง€์ˆ˜ ํ‘œ๊ธฐ๋ฒ•(exponential notation)์ด ๋˜์ง€ ์•Š๋Š” ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์ด๋‹ค.

# d3.interpolateRound(a, b)

a, b ๋‘ ์ˆ˜ ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” ์ˆซ์žํ˜• ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” interpolateNumber์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜์˜ฌ๋ฆผ ํ•œ๋‹ค.

# d3.interpolateString(a, b)

๋ฌธ์ž์—ด a, b ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” ๋ฌธ์ž์—ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” ๋‹ค์Œ ์ •๊ทœ์‹์œผ๋กœ a ์™€ b ๋ฌธ์ž์—ด์—์„œ ์ˆซ์ž๋ฅผ ์ฐพ๋Š”๋‹ค.

/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g

์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” b ๋ฌธ์ž์—ด์— ๋“ค์–ด์žˆ๋Š” ๊ฐ ์ˆซ์ž์— ๋Œ€ํ•ด์„œ a ์—์„œ ์ผ์น˜ํ•˜๋Š” ์ˆซ์ž๋ฅผ ์ฐพ๋Š”๋‹ค. ์ผ์น˜ํ•˜๋Š” ์ˆซ์ž๋ฅผ ์ฐพ์œผ๋ฉด, interpolateNumber๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ˆซ์žํ˜• ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. b ๋ฌธ์ž์—ด์—์„œ ๋‚จ์€ ๋ถ€๋ถ„์€ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. b ๋ฌธ์ž์—ด์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋ณด๊ฐ„์ž‘์—…์„ ์œ„ํ•œ ์ƒ์ˆ˜๊ฐ€ ๋˜๊ณ  ๋ณด๊ฐ„๋œ ์ˆซ์ž ๊ฐ’์ด ๊ทธ ํ…œํ”Œ๋ฆฟ์— ํฌํ•จ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, a ๊ฐ€ "300 12px sans-serif"์ด๊ณ  b ๊ฐ€ "500 36px Comic-Sans"์ด๋ฉด, ํฌํ•จ๋œ ์ˆซ์ž๋Š” ๋‘ ๊ฐœ๋‹ค. ๋ฌธ์ž์—ด์˜ ๋‚จ์€ ๋ณ€ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์€ ์ˆซ์ž๋“ค ์‚ฌ์ด์˜ ๊ณต๋ฐฑ(" ")๊ณผ ์ ‘๋ฏธ์‚ฌ("px Comic-Sans")๋‹ค. ๊ทธ๋ž˜์„œ t = .5 ์—์„œ ํ•ด๋‹น ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’์€ "400 24px Comic-Sans"์ด๋‹ค.

# d3.interpolateRgb(a, b)

๋‘ ์ƒ‰์ƒ a, b ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” RGB ์ƒ‰๊ณต๊ฐ„(color space) ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ƒ‰์ƒ a ์™€ b ์ด RBG์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ d3.rgb๋ฅผ ์‚ฌ์šฉํ•ด์„œ RGB๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ๋นจ๊ฐ•, ์ดˆ๋ก, ํŒŒ๋ž‘ ์ฑ„๋„์€ ๋ถ„์ˆ˜๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— interpolateRound์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ ํ˜• ๋ณด๊ฐ„๋œ๋‹ค. ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ RGB ์ƒ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ๋นจ๊ฐ•์ธ ๊ฒฝ์šฐ "rgb(255,0,0)"์ด๋‹ค.

# d3.interpolateHsl(a, b)

๋‘ ์ƒ‰์ƒ a, b ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” HSL ์ƒ‰๊ณต๊ฐ„(color space) ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ƒ‰์ƒ a ์™€ b ์ด HSL์ผ ํ•„์š”๋Š” ์—†์ง€๋งŒ d3.hsl๋ฅผ ์‚ฌ์šฉํ•ด์„œ HSL๋กœ ๋ณ€ํ•œ๋œ๋‹ค. ์ƒ‰์ƒ, ์ฑ„๋„, ๋ช…๋„๋Š” interpolateNumber์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์„ ํ˜• ๋ณด๊ฐ„๋œ๋‹ค. (์‹œ์ž‘๊ณผ ๋ ์ƒ‰์ƒ์‚ฌ์ด ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.) ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋ฐ˜ํ™˜๊ฐ’์€ RGB ์ƒ‰์ƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ๋นจ๊ฐ•์ธ ๊ฒฝ์šฐ "#ff0000"์ด๋‹ค. RGB ์ƒ‰์ƒ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ CSS์—์„œ HSL ์ƒ‰์ƒ์„ ๋ชจ๋‘ ์ง€์›ํ•˜์ง€๋Š” ์•Š์œผ๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ RGB ์ƒ‰์ƒ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# d3.interpolateLab(a, b)

๋‘ ์ƒ‰์ƒ a, b ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” L*a*b* ์ƒ‰๊ณต๊ฐ„(color space) ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด d3.lab๋ฅผ ์‚ฌ์šฉํ•ด์„œ L*a*b* ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ƒ‰์ƒ ์ฑ„๋„์€ interpolateNumber๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์„ ํ˜• ๋ณด๊ฐ„๋œ๋‹ค. ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ RGB ์ƒ‰์ƒ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋นจ๊ฐ•์ธ ๊ฒฝ์šฐ "#ff0000"์ด๋‹ค.

# d3.interpolateHcl(a, b)

๋‘ ์ƒ‰์ƒ a, b ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” HCL ์ƒ‰๊ณต๊ฐ„(color space) ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•„์š”ํ•˜๋‹ค๋ฉด d3.hcl๋ฅผ ์‚ฌ์šฉํ•ด์„œ HCL๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ƒ‰์ƒ ์ฑ„๋„์€ interpolateNumber์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ ํ˜• ๋ณด๊ฐ„๋œ๋‹ค. (์‹œ์ž‘๊ณผ ๋ ์ƒ‰์ƒ ์‚ฌ์ด ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.) ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ RGB ์ƒ‰์ƒ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋นจ๊ฐ•์ธ ๊ฒฝ์šฐ "#ff0000"์ด๋‹ค.

# d3.interpolateArray(a, b)

๋‘ ๋ฐฐ์—ด a, b ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” ๋ฐฐ์—ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์˜ ํƒฌํ”Œ๋ฆฟ์„ b ๋ฐฐ์—ด์˜ ๊ธธ์ด์™€ ๋™์ผํ•˜๊ฒŒ ์ƒ์„ฑํ•œ๋‹ค. b ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ ์ƒ‰์ธ์— ํ•ด๋‹นํ•˜๋Š” a ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋‘ ์›์†Œ๋ฅผ ์œ„ํ•ด interpolate๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ œ๋„ค๋ฆญ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์›์†Œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ…œํ”Œ๋ฆฟ์—์„œ b ์˜ ๋ฐฐ์—ด ์›์†Œ๊ฐ’์„ ๊ณ ์ •๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ t ๋ฅผ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์˜ ๋‚ด์žฅ๋œ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋“ค์„ ํ‰๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์—…๋ฐ์ดํŠธ๋œ ๋ฐฐ์—ด ํƒฌํ”Œ๋ฆฟ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด a ๊ฐ€ [0, 1]์ด๊ณ  ๋ฐฐ์—ด b ๊ฐ€ [1, 10, 100] ์ด๋ฉด, ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋ฐ˜ํ™˜๊ฐ’์€ t = .5์ผ ๋•Œ, [.5, 5.5, 100]์ด๋‹ค.

์ฃผ์˜: ํƒฌํ”Œ๋ฆฟ ๋ฐฐ์—ด์˜ ๋ฐฉ์–ด ๋ณต์‚ฌ๋ณธ(defensive copy)์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์˜ ๋ณ€๊ฒฝ์€ ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋‹ค์Œ ํ‰๊ฐ€์— ์•ˆ์ข‹์€ ์˜ํ–ฅ์„ ์ค„์ˆ˜๋„ ์žˆ๋‹ค. ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฃจํ”„๋ฌธ์˜ ์ผ๋ถ€์ผ ์ˆ˜ ์žˆ๋„๋ก ๋นจ๋ผ์•ผ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋ณธ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

# d3.interpolateObject(a, b)

a ์™€ b ๊ฐ์ฒด ์‚ฌ์ด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” ๊ฐ์ฒด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ์ฒด๋ณ„ ํ…œํ”Œ๋ฆฟ์€ b ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋™์ผํ•œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. a ๊ฐ์ฒด์— b ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์™€ ์ผ์น˜ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด interpolate๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‘ ํ”„๋กœํผํ‹ฐ๊ฐ„์˜ ์ œ๋„ค๋ฆญ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ผ์น˜ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ํ…œํ”Œ๋ฆฟ์— b ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๊ณ ์ •๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ t ๋ฅผ ์œ„ํ•œ ํƒฌํ”Œ๋ฆฟ์˜ ๋‚ด์žฅ๋œ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋“ค์„ ํ‰๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์—…๋ฐ์ดํŠธ๋œ ๋ฐฐ์—ด ํƒฌํ”Œ๋ฆฟ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ์ฒด a ๊ฐ€ {x: 0, y: 1}์ด๊ณ  ๊ฐ์ฒด b ๊ฐ€ {x: 1, y: 10, z: 100}์ด๋ฉด, ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋ฐ˜ํ™˜๊ฐ’์€ t = .5์ผ ๋•Œ, {x: .5, y: 5.5, z: 100}์ด๋‹ค.

๊ฐ์ฒด ๋ณด๊ฐ„์ž‘์—…์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์„ฑ์ด ์•„๋‹Œ ๋ณด๊ฐ„๋˜๋Š” ๋ฐ์ดํ„ฐ์ŠคํŽ˜์ด์Šค ๋ณด๊ฐ„์ž‘์—…(dataspace interpolation) ์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ด ์ฐจํŠธ์˜ ํ˜ธ(arc)๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ณด๊ฐ„ํ•˜๋Š” ๊ฒฝ์šฐ ์‹ ๊ทœ SVG ํŒจ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ d3.svg.arc๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ฃผ์˜: ํƒฌํ”Œ๋ฆฟ ๊ฐ์ฒด์˜ ๋ฐฉ์–ด ๋ณต์‚ฌ๋ณธ(defensive copy)์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์€ ์ด ์ธํ„ฐํด๋ ˆ์ดํ„ฐ์˜ ๋‹ค์Œ ํ‰๊ฐ€์— ์•ˆ์ข‹์€ ์˜ํ–ฅ์„ ์ค„์ˆ˜๋„ ์žˆ๋‹ค. ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฃจํ”„๋ฌธ์˜ ์ผ๋ถ€์ผ ์ˆ˜ ์žˆ๋„๋ก ๋นจ๋ผ์•ผ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋ณธ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.

# d3.interpolateTransform(a, b)

a ์™€ b ๋กœ ํ‘œํ˜„๋˜๋Š” ๋‘๊ฐœ์˜ 2D ์•„ํ•€(affine) ๋ณ€ํ™˜(transform) ์‚ฌ์ด์˜ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ ๋ณ€ํ™˜์€ ํ‘œ์ค€ ํ‘œํ˜„์ธ ์ด๋™(translate), ํšŒ์ „(rotate), x์ถ• ๋น„ํ‹€๊ธฐ(x-skew), ํฌ๊ธฐ๋ณ€๊ฒฝ(scale)์œผ๋กœ ๋ถ„ํ•ดํ•ด์„œ ๊ฐ ๋ณ€ํ™˜ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ณด๊ฐ„๋œ๋‹ค. ์ด๋Š” CSS์— ํ‘œ์ค€ํ™”๋˜์–ด์žˆ๋Š” ๋™์ž‘์ด๋‹ค. matrix decomposition for animation๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

(์—ญ์ž์ฃผ) affine transform์€ HTML ์บ”๋ฒ„์Šค์™€ CSS์—์„œ ์‚ฌ์šฉํ•˜๋Š” 2D ๊ธฐํ•˜ํ•™ ๋ณ€ํ™˜๋ฒ•์ด๋‹ค.

# d3.geo.interpolate(a, b)

d3.geo.interpolate๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

# d3.interpolators

d3.interpolate์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด์žฅ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ ํŒฉํ† ๋ฆฌ ๋ฐฐ์—ด์ด๋‹ค. ์ด ๋ฐฐ์—ด์˜ ๋์— ํ™•์žฅ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ ํŒฉํ† ๋ฆฌ๋ฅผ ์ถ”๊ฐ€(push)ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ „๋‹ฌ์ธ์ž๋กœ ๋„˜๊ธฐ๋Š” ๋‘๊ฐœ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๋ณด๊ฐ„์„ ์ง€์›ํ•˜๋ฉด ๊ฐ ํŒฉํ† ๋ฆฌ๋Š” ์ธํ„ฐํด๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŒฉํ† ๋ฆฌ๋Š” false ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‹ค๋ฅธ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ์‹œ๋„ํ•ด๋ณธ๋‹ค. ์ด ๋ฐฐ์—ด์˜ ์ดˆ๊ธฐ๊ฐ’์€ ์‹œ๋„ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • interpolateNumber - ํƒ€์ž…์ด ์ˆซ์ž์ธ ๊ฒฝ์šฐ
  • interpolateRgb - ํƒ€์ž…์ด ์ƒ‰์ƒ์ธ ๊ฒฝ์šฐ
  • interpolateString - ํƒ€์ž…์ด ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ
  • interpolateArray - ํƒ€์ž…์ด ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ
  • interpolateObject - ๋งˆ์ง€๋ง‰ ์ข…์ฐฉ์ง€

์˜ˆ๋ฅผ ๋“ค์–ด, ํ™”ํ ํ‘œ๊ธฐ(๋‹ฌ๋Ÿฌ์™€ ์„ผํŠธ)๋ฅผ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ธํ„ฐํด๋ ˆ์ดํ„ฐ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ์—, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค.

d3.interpolators.push(function(a, b) {
  var re = /^\$([0-9,.]+)$/, ma, mb, f = d3.format(",.02f");
  if ((ma = re.exec(a)) && (mb = re.exec(b))) {
    a = parseFloat(ma[1]);
    b = parseFloat(mb[1]) - a;
    return function(t) {
      return "$" + f(a + b * t);
    };
  }
});

d3.interpolate("$20", "$10")(1/3) ๋Š” $16.67๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ