# ๋ทฐ์์ D3 ์ฌ์ฉํ๊ธฐ
D3๋ ๋ทฐ์ ์ ์ฌํ ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉํ๋ ค๊ณ ํ๋ฉด ๋ ผ๋ฆฌ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. D3๋ ์ํ์ ๊ณ์ฐ์ ์ํํ์ฌ ๋ฐ์ดํฐ ์๊ฐํ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ๋ทฐ๋ ๋ฐ์์ฑ์ ์์ฉํ๋ฉด์ ๋์ ์กฐ์ํ์ฌ ์ด ์ถฉ๋์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์์ ๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
# ์ผ๋ฐฉ์ ์ธ D3 ์ฌ์ฉ
์์ ์ฑํฐ์์ ์งํํ ์์ ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ๋ทฐ์์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
์คํํด๋ณด๊ธฐ (opens new window)
<!-- VueLineChart.vue -->
<template>
<svg ref="line"></svg>
</template>
<script>
import * as d3 from "d3";
export default {
data() {
return {
data: [90, 72, 75, 25, 10, 92],
};
},
mounted() {
const svg = d3
.select(this.$refs.line)
.attr("width", 500)
.attr("height", 300);
svg
.append("path")
.datum(this.data)
.attr("fill", "none")
.attr("stroke", "#76BF8A")
.attr("stroke-width", 3)
.attr("d", this.line);
},
computed: {
line() {
return d3
.line()
.x((d, i) => this.xScale(i))
.y((d) => this.ySclae(d));
},
xScale() {
return d3
.scaleLinear()
.range([20, 480])
.domain(d3.extent(this.data, (d, i) => i));
},
ySclae() {
return d3.scaleLinear().range([280, 20]).domain([0, 100]);
},
},
};
</script>
์ ์ฝ๋๋ select
, append
, datum
์ ๊ฐ์ D3์ Selections API๋ฅผ ์ฌ์ฉํด์ ๋์ ์ ๊ทผํ๊ณ
์์ ํด์ ๋ฐ์ดํฐ๋ฅผ ๋์ ๊ฒฐํฉํฉ๋๋ค.
์ด๋ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ์ฌ ๋ฐ์ํ์ผ๋ก ๋์ํ๋ ๋ทฐ์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ, ๋ ๋๋ง(rendering) ์์ญ๊ณผ ๊ฒน์ณ์ ํผ๋์ค๋ฝ์ต๋๋ค.
# ์กฐํ๋ก์ด D3 ์ฌ์ฉ
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ ๋ ๋๋ง ์์ญ์ ๋ทฐ ํ ํ๋ฆฟ(template)์์ ๋ด๋นํ๊ณ ๋ฐ์ดํฐ ์๊ฐํ๋ฅผ ์ํ ์ํ์ ์ฐ์ฐ์๋ง D3 ์ ํธ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋จผ์ ์ด ์์ ์์๋ mounted
ํ
์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ path
์์์ ๊ฒฐํฉ์ํค๋ ์ฝ๋๋ฅผ ๋ทฐ ํ
ํ๋ฆฟ์์ ์์ฑํ๊ธฐ ์ํด
computed
์์ฑ์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
// computed
.
.
pathData() {
return this.line(this.data);
},
์ด์ mounted
ํ
์ ์ง์ฐ๊ณ ๋ทฐ ํ
ํ๋ฆฟ์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๊ณผ ๋ ๋๋ง ์์๋ฅผ ๋งํฌ์
์ผ๋ก ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
<template>
<svg :width="width" :height="height">
<path fill="none" stroke="#76BF8A" stroke-width="3" :d="pathData"></path>
</svg>
</template>
.
.
- ์ ์ฒด ์ฝ๋
์คํํด๋ณด๊ธฐ (opens new window)
<template>
<svg :width="width" :height="height">
<path fill="none" stroke="#76BF8A" stroke-width="3" :d="path"></path>
</svg>
</template>
<script>
import * as d3 from "d3";
export default {
data() {
return {
data: [90, 72, 75, 25, 10, 92],
width: 500,
height: 300,
padding: 20,
};
},
computed: {
path() {
return this.line(this.data);
},
line() {
return d3
.line()
.x((d, i) => this.xScale(i))
.y((d) => this.ySclae(d));
},
xScale() {
return d3
.scaleLinear()
.range([this.padding, this.width - this.padding])
.domain(d3.extent(this.data, (d, i) => i));
},
ySclae() {
return d3.scaleLinear().range([this.height - this.padding, this.padding]).domain([0, 100]);
},
},
};
</script>
๋ณ๊ฒฝ๋ ์ฝ๋๋ ๋ทฐ์ ๊ฐ์ ๋์ ํน์ฑ์ ๊ทธ๋๋ก ํ์ฉํ๊ณ ๊ณ์ฐ๊ณผ ๋ ๋๋ง(rendering) ์์ญ์ด ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฑ์์๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.