# D3.js
D3(Data-Driven Documents)๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์ด๊ณ ์ธํฐ๋ํฐ๋ธํ ์ ๋ณด ์๊ฐํ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ JavaScript(์๋ฐ์คํฌ๋ฆฝํธ)๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
# SVG ์ฌ์ฉ
SVG์ HTML5, CSS ๋ฑ ์น ํ์ค์ ๊ธฐ๋ฐํด ๊ตฌํ๋์ด ์์ต๋๋ค.
SVG(Scalable Vector Graphics)๋ ๊ทธ๋ํฝ์ ๋งํฌ์ ํ๊ธฐ ์ํ ์ธ์ด๋ก ์๋ ๋ทฐ ๋ก๊ณ ์ ๊ฐ์ ๊ทธ๋ํฝ ๋ฑ์ ํํํ ์ ์์ต๋๋ค. HTML์ด ํค๋, ๋ฌธ๋จ, ํ์ ๊ฐ์ ์๋ฆฌ๋จผํธ(Element)๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ฒ๋ผ SVG๋ ์, ์ฌ๊ฐํ, ๊ฐ๋จํ ๊ณก์ ๊ณผ ๋ณต์กํ ๊ณก์ ์ ๊ทธ๋ฆด ์ ์๋ ์๋ฆฌ๋จผํธ๋ค์ ์ ๊ณตํฉ๋๋ค.
TIP
SVG์ ๋ํ ๊ธฐ์ ์ ์ธ ์ธ๋ถ์ฌํญ์ MDN ๋ฌธ์ (opens new window)์ ํํ ๋ฆฌ์ผ์ ํ์ธํด ์ฃผ์ธ์.
# ๋ฐ์ดํฐ ์๊ฐํ
๋ค์๊ณผ ๊ฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ด ์์ต๋๋ค. ์ด ๋ฐ์ดํฐ๋ฅผ SVG์ ํจ์ค(path) ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํด์ ์ ๋ชจ์์ผ๋ก ์๊ฐํํ ์ ์์ต๋๋ค.
const data = [90, 72, 75, 25, 10, 92];
ํจ์ค์ ๋ชจ์์ ํน์ ์ํ๋ฒณ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ช
๋ น๊ณผ XY ์ขํ๋ก ์ด๋ฃจ์ด์ง d ์์ฑ์ผ๋ก ๋ง๋ค์ด์ง๋๋ฐ,
์๋ ์์ ์ "M20,45.99999999999999L112,92.80000000000001L204,85L296,215L388,254L480,40.79999999999999"
๋ฌธ์์ด์ด data
๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ์๊ฐํํ๋๋ฐ ์ฌ์ฉ๋ ๊ฐ์
๋๋ค.
<svg width="500" height="300">
<g transform="translate(0, 0)">
<path
fill="none"
stroke="#76BF8A"
stroke-width="3"
d="M20,45.99999999999999L112,92.80000000000001L204,85L296,215L388,254L480,40.79999999999999"
></path>
</g>
</svg>
์์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ SVG ๊ทธ๋ํฝ ์์๋ก ์๊ฐํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์ฑ ๊ฐ๋ค์ ๊ณ์ฐํ ๋ D3์์ ์ ๊ณตํ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const xScale = d3
.scaleLinear()
.range([20, 480])
.domain(d3.extent(data, (d, i) => i));
const yScale = d3.scaleLinear().range([280, 20]).domain([0, 100]);
const line = d3
.line()
.x((d, i) => xScale(i))
.y((d) => yScale(d));
console.log(line(data)) // M20,45.99999999999999L112,92.80000000000001L204,85L296,215L388,254L480,40.79999999999999
# ๋ฌธ์ ์กฐ์
jQuery(์ ์ด์ฟผ๋ฆฌ)์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์ ์ ๊ทผํด์ ๊ณ์ฐ๋ ๋ฐ์ดํฐ ๊ฐ์ ๋ฐ์ธ๋ฉํ๊ณ ์คํ์ผ์ ์ค์ ํ๊ณ ํ๋ฉด์ ๋ ๋๋ง(rendering) ํฉ๋๋ค.
const svg = d3.select('svg')
.attr('width', 500)
.attr('height', 300)
svg
.append('path')
.datum(data)
.attr("fill", "none")
.attr("stroke", "#76BF8A")
.attr("stroke-width", 3)
.attr("d", line);