D3 - Update pattern
๐ ๋ชฉ์ฐจ
- Introuduction
- d3.interval
- Update pattern
- Conclusion
๐Introduction
์๋ ํ์ธ์. ์ค๋์ D3์์์ update pattern์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
๐ d3.interval
update pattern์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ ์ ์ d3์ interval์ ๋ํด์ ์๊ฐํ ๊น ํฉ๋๋ค. d3.interval์ setInterval๊ณผ ๋งค์ฐ ๋น์ทํฉ๋๋ค. ๋จ clearInterval์ ์ํด์ค๋ ๋๋ค๋ ์ฅ์ ์ด ์์ด์.
d3.interval(() => {
console.log("hello") // hello๊ฐ 1์ด์ ํ๋ฒ์ฉ ์ฐํ
}, 1000);
๐ Update pattern
updateํจํด์ data join๋ถํฐ ์์์ด ๋ฉ๋๋ค.
const rects = g.selectAll("rect").data(data, d => d.month);
์ฌ๊ธฐ์๋ ๋ถ๋ช rect๊ฐ ์์ง ์์์ ๊ฑฐ์์. ๊ทผ๋ฐ ๋ค์ ์ด๋ ๊ฒ enter๋ฅผ ์ฐ๋๊ฑธ ๋ณธ์ ์ด ์์ผ์ค๊ฒ๋๋ค.
// DATA JOIN
const rects = g.selectAll("rect").data(data, d => d.month);
// ENTER
rects
.enter()
.append("rect")
.attr("fill", "grey")
.attr("y", y(0))
.attr("height", 0)
.attr("x", (d) => x(d.month))
.attr("y", (d) => y(d[value]))
.attr("width", x.bandwidth)
.attr("height", (d) => HEIGHT - y(d[value]));
์ด๋ rects๋ฅผ ํ๋ฒ ์ฐ์ด๋ณด๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์ฌ๊ฑฐ์์. exit, enter, parent, group์ด๋ ๊ฒ ๋์ฌ๊ฑฐ์์. ๊ทธ๋์ update๋ ์ด ์ค๊ฐ์ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ ๋ฌด์จ๋ง์ธ๊ฐ ์ถ์ง์? ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณด์ธ์.
const rects = g.selectAll("rect").data(data, (d) => d.month);
// EXIT
rects
.exit()
.attr("fill", "red")
.transition(t)
.attr("height", 0)
.attr("y", y(0))
.remove();
// UPDATE
rects
.transition(t)
.attr("y", (d) => y(d[value]))
.attr("x", (d) => x(d.month))
.attr("width", x.bandwidth)
.attr("height", (d) => HEIGHT - y(d[value]));
yLabel.text(flag ? "Profit ($)" : "Revenue ($)");
// ENTER
rects
.enter()
.append("rect")
.attr("fill", "grey")
.attr("y", y(0))
.attr("height", 0)
.attr("x", (d) => x(d.month))
.attr("y", (d) => y(d[value]))
.attr("width", x.bandwidth)
.attr("height", (d) => HEIGHT - y(d[value]));
์ด๋ ๊ฒ enter์ exit์ ํ์ง ์๋ ๋ถ๋ถ์ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
๐Conclusion
์ด๋ ๊ฒ ์ค๋์ ํ๋ฒ update ํจํด์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ๊ทธ๋ผ ๋ค์์๊ฐ์๋ scatter plot์ ๋ํด์ ํ๋ฒ ์์๋ณผ๊ฒ์!