๐๋ชฉ๋ก
- Introduction
- Scale
- min, max, extent
- Axes
- Conclusion
๐ Introduction
์๋ ํ์ธ์. ์ค๋์ d3์์์ scale๊ณผ axes์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. scale ๊ฐ์ ๊ฒฝ์ฐ svg๋ณด๋ค ๋๊ฑฐ๋ ๋์ ๊ฐ์ด ๋์ค๋ฉด ํจ์จ์ ์ผ๋ก ๋์์ ํด์ฃผ๊ฒ ๋ฉ๋๋ค. ํผ์ผํธ์ ๋น์ทํ ๊ฐ๋ ์ด๋ผ๊ณ ๋ณด์๋ฉด ์ข์๊ฑฐ ๊ฐ์์. ๊ทธ๋ผ ํ๋ฒ ์์ํด๋ณด๊ณ์ต๋๋ค.
๐ Scale
๋จผ์ scale์ ์ฐธ ๋ง์ scale์ ๊ฐ์ง๊ณ ์์ด์.
- Linear Scale
- Logarithmic Scale
- Time Scale
- Ordinal Scale
- Band Scales
์ฐจ๋ก๋๋ก ์์ ๋ณด๊ฒ ์ต๋๋ค.
1. Linear Scale
๊ธฐ๋ณธ์ ์ธ scale์ ๋ฌธ๋ฒ์ ๋ํด์ ์๊ธฐ ์ ์ domain๊ณผ range์ ๋ํด์ ์์์ผ ํด์.
domain์ ์๋ฃ ๊ฐ์ min๊ณผ max ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ range๋ ๋ณํ ๋ output์ min๊ณผ max๊ฐ์ด์์.
Linear Scale์ด๋ ์ด๋ฆ์ฒ๋ผ linearํ scale์ ๋ง๋ค์ด ์ฃผ๋ ํจ์ ์ ๋๋ค. ํผ์ผํ ์ด์ง๋ก ๋ณํ ํด์ฃผ์ ๋ค๊ณ ์๊ฐํ๋ฉด ์ข์๊ฑฐ ๊ฐ์์. ํ๋ฒ ์์ ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
// ์๋ฃ ๊ฐ์ 0~828๊น์ง๋ก ์ค์ ์ ํด์ฃผ๊ณ output์ range๋ 0~400์ผ๋ก ์ค์ ์ ํด์ค๋๋ค.
const y = d3.scaleLinear().domain([0, 828]).range([0, 400]);
// ๊ทธ๋ผ 100 ์ 48์ ๊ฐ์ด ๋์ค๊ฒ ๋ฉ๋๋ค.
console.log(y(100)); // 48
// ๋ฐ๋๋ก 48์ ๊ฐ์ invert๋ฅผ ์ํค๋ฉด 100์ด ๋์ค๊ฒ ๋ฉ๋๋ค.
console.log(y.invert(48)); // 100
2. Logarithmic Scale
Logarithmic Scale์ log๋ฅผ ์์ด scale์ ๋งํฉ๋๋ค. ์ธ๊ตฌ ์ฆ๊ฐ์์ ๊ฐ์ด exponential growth ๊ฐ์ ๊ฐ๋ค์ ๋ํ๋ด๊ธฐ์ ์ข์์.
const x = d3.scaleLog().domain([300, 150000]).range([0, 400]).base(10);
console.log(x(500)); // 32.9
console.log(x.invert(32.9)); // 500
3. Time Scale
Time Scale์ linear scale์ ์ข ๋ฅ์ค ํ๋์ ๋๋ค. ๋ค๋ง domain์ด time์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
const timeScale = d3
.scaleTime()
.domain([new Date(2000, 0, 1), new Date(2001, 0, 1)])
.range([0, 400]);
console.log(timeScale(new Date(2000, 7, 1))); // 232
console.log(timeScale.invert(232)); // Tue Aug 01 2000
4. Ordinal Scale
Oridinal Scale์ ์ฃผ๋ก color๋ฅผ scale๋ก ๋ง๋ค๋ ์ฌ์ฉ๋ฉ๋๋ค.
const color = d3
.scaleOrdinal()
.domain(["AFRICA", "N.AMERICA", "EUROPE", "S.AMERICA", "ASIA"])
// โญ๏ธ D3์์ ๋ฏธ๋ฆฌ ์ ํด๋์ color scheme์ ์ฌ์ฉํด๋ ์ข์์
// .range(d3.schemeCategory10);
.range(["RED", "ORANGE", "YELLOW", "GREEN", "BLUE", "INDIGO", "GREY"]);
console.log(color("ASIA")); // BLUE
5. Band Scale
BandScale์ bar chart์ x-axis๋ฅผ ๋ง๋ค๋ ์ฐธ ์ ์ฉํฉ๋๋ค.
Band Scale์ ordinal scale๊ณผ๋ ๋ค๋ฅด๊ฒ domain์ ์๋ ๊ฑธ ์ง์ด๋ฃ๊ฒ๋๋ฉด undefined๋ฅผ return ํฉ๋๋ค.
const band = d3
.scaleBand()
.domain(["AFRICA", "N.AMERICA", "EUROPE", "S.AMERICA", "ASIA"])
.range([0, 400])
.paddingInner(0.3)
.paddingOuter(0.2);
console.log(band("ASIA")); // 329
console.log(band.bandwidth()); // 54
console.log(band("EDDIE")); // undefined
๐ min, max, extent
min๊ณผ max๋ data์ min๊ณผ max๋ฅผ ๋ฐํํ๋ ํจ์ ์ ๋๋ค.
const data2 = [
{ grade: "A", value: 4 },
{ grade: "B", value: 3 },
{ grade: "C", value: 2 },
];
const min = d3.min(data2, (d) => d.value);
console.log("min", min); // 2
const max = d3.max(data2, (d) => d.value); // 4
console.log("max", max);
extent๋ min๊ณผ max๋ฅผ ํ๋ฒ์ ๊ตฌํด์ค์. array๋ฅผ returnํ๊ฒ ๋๊ณ min๊ณผ max๋ฅผ 0 index, 1 index๋ก ๋ฐํํฉ๋๋ค.
const extent = d3.extent(data2, (d) => d.value);
console.log("extent", extent); // [2, 4]
๐ Axes
axes๋ ์ด 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- left (axisLeft())
- right (axisRight())
- top (axisTop())
- bottom (axisBottom())
tick size๋ฅผ ํตํด ๋๊ธ์ ์กฐ์ ํ ์ ์์ด์.
tickInner๋ ์์ ์๋ ๊ฒ๋ค์ด๊ณ tickOuter๋ ๋ฐ์ 2๊ตฐ๋ฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ชจ๋๋ฅผ ํฌํจํ๋๊ฑด tickSize์ด์์.
๋ํ ๋๊ธ์ ๊ฐฏ์๋ text๋ฅผ ์ค์ ํ ์๋ ์์ต๋๋ค.
ticks์ผ๋ก๋ ๋๊ธ์ ๊ฐฏ์๋ฅผ ์ค์ ํ ์ ์๊ณ , textFormat์ผ๋ก๋ text๋ฅผ, tickValue๋ก๋ ์ค์ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
// How many?
d3.axisBottom(scale).ticks(10);
// Text format
d3.axisTop(scale).tickFormat(d3.format(",.0f")));
d3.axisTop(scale).tickFormat(() => "Tick Format");
// Expicit Values
d3.axisTop(scale).tickValues([1, 2, 3, 4, 5]);
๐ Conclusion
์ค๋์ ์ด๋ ๊ฒ ํ๋ฒ d3์ scale๊ณผ axes์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ๋ง์ด ์์ํ๊ณ ์ด๋ ต๊ธฐ๋ ํ๋ค์ฉ. ํ๋ฒ ์ค์ ๋ก bar chart๋ฅผ ๋ง๋ค์ด ๋ด์ผํ ๊ฑฐ ๊ฐ์์. ๊ทธ๋ผ ๋ค์ ํฌ์คํ ์์ ๋ง๋์ ์๋ ~~๐
'D3' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
D3 - Update pattern (0) | 2021.01.13 |
---|---|
D3 - BarChart ๋ง๋ค๊ธฐ (0) | 2021.01.07 |
D3 - Baisc (0) | 2021.01.03 |