D3

D3 - BarChart ๋งŒ๋“ค๊ธฐ

eddie0329 2021. 1. 7. 00:12
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ๋ชฉ๋ก

  • Introduction
  • Bar Chart ๋งŒ๋“ค๊ธฐ
  • Conclusion

๐Ÿ“Œ Introduction

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ ์ง€๋‚œ๋ฒˆ ์†Œ๊ฐœ ํ–ˆ๋˜ d3 ์˜ ๊ธฐ๋ณธ์„ ํ†ตํ•ด bar chart๋ฅผ ํ•œ๋ฒˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Bar Chart ๋งŒ๋“ค๊ธฐ

๋จผ์ € data๋ฅผ ์†Œ๊ฐœ ํ• ๊ฒŒ์š”. data๋Š” csvํŒŒ์ผ์— ์ €์žฅ์ด ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

"month","revenue","profit"
"January","13432","8342"
"February","19342","10342"
"March","17443","15423"
"April","26342","18432"
"May","34213","29434"
"June","50321","45343"
"July","54273","47452

์ด์ œ ์ •์‹์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ๋ณผ๊นŒ์š”?

const MARGIN = { LEFT: 100, RIGHT: 10, TOP: 10, BOTTOM: 130 };
const WIDTH = 600 - MARGIN.LEFT - MARGIN.RIGHT;
const HEIGHT = 400 - MARGIN.TOP - MARGIN.BOTTOM;

// csv ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
d3.csv("data/revenues.csv").then((data) => {
  // CONVERT DATA REVENUE TO NUMBER
  // data์˜ revenue๊ฐ€ string์œผ๋กœ ๋˜์–ด์žˆ์–ด์„œ number๋กœ parsing์„ ํ•ด์ค˜์š”
  data.forEach((d) => {
    d.revenue = Number(d.revenue);
  });

  // CREATE SVG
  const svg = d3
    .select("#chart-area")
    .append("svg")
    .attr("width", WIDTH + MARGIN.LEFT + MARGIN.RIGHT)
    .attr("height", HEIGHT + MARGIN.TOP + MARGIN.BOTTOM);

  // APPEND G FOR MARGIN
  const g = svg
    .append("g")
    .attr("transform", `translate(${MARGIN.LEFT}, ${MARGIN.TOP})`);

  // CREATE X SCALE
  const x = d3
    .scaleBand()
    .domain(data.map((d) => d.month))
    .range([0, WIDTH])
    .paddingInner(0.3)
    .paddingOuter(0.2);

  // CREATE Y SCALE
  const y = d3
    .scaleLinear()
    .domain([0, d3.max(data, (d) => d.revenue)])
    .range([HEIGHT, 0]); 

  // CREATE X-AXIS CALL
  const xAxisCall = d3.axisBottom(x);

  // APPEND X-AXIS
  g.append("g").call(xAxisCall).attr("transform", `translate(0, ${HEIGHT})`);

  // CREATE Y-AXIS CALL
  const yAxisCall = d3.axisLeft(y).tickFormat((d) => `$${d}`);

  // APPEND Y-AXIS
  g.append("g").call(yAxisCall);

  // CREATE X LABEL
  g.append("text")
    .attr("x", WIDTH / 2)
    .attr("y", HEIGHT + 50)
    .attr("text-anchor", "middle")
    .attr("font-size", "20px")
    .text("Month");

  // CREATE Y LABEL
  g.append("text")
    .attr("x", -(HEIGHT / 2))
    .attr("y", -60)
    .attr("transform", "rotate(-90)")
    .attr("text-anchor", "middle")
    .attr("font-size", "20px")
    .text("Revenue");

  // CREATE BAR
  const revenues = g.selectAll("rect").data(data);
  revenues
    .enter()
    .append("rect")
    .attr("x", (d) => x(d.month))
    .attr("y", (d) => y(d.revenue))
    .attr("width", 40)
    .attr("height", (d) => HEIGHT - y(d.revenue))
    .attr("fill", "gray");
});

๐Ÿ“Œ Conclusion

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ bar chart๋ฅผ ๋งŒ๋“ค์–ด ๋ดค์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด๊ฑธ ํ† ๋Œ€๋กœ ํ•œ๋ฒˆ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋งŒ๋“ค์–ด ๋ด์•ผ๊ฒ ์–ด์š”. ๊ทธ๊ฑด ๋˜ ๋‹ค๋ฅธ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์•ˆ๋…• ~~ ๐ŸŽ‰

๋ฐ˜์‘ํ˜•