본문으로 바로가기

D3.js 공부 9 - 막대차트 그리기(part1)

category 웹/JavaScript,JQurey 2019. 4. 16. 00:47

D3.js는 다음과 같은 차트를 만드는데 유용합니다.

막대 차트
원 차트
파이 차트
도넛 형 차트
선 차트
버블 차트 

막대 차트는 개별 범주, 그룹의 수, 빈도, 평균 표시하고 비교할 때 사용합니다.

 

막대 높이 길이가 범주의 크기이겠죠.

 

x축은 범주 y축은 눈금이 있고 측정 단위를 나타냅니다.

 

막대형 차트는 rect를 이용하여 그려줍니다.

 

1단계 : rect요소 스타일 지정해주기.

 

svg rect {
   fill: gray;
}

위 css으로 rect 스타일을 지정해줍니다. 즉 회색으로 색칠 해준다는 뜻이죠.

 

2단계 : 텍스트 요소에 스타일을 지정해주기.

 

svg text {
   fill: yellow;
   font: 12px sans-serif;
   text-anchor: end;
}

위 css으로 text 스타일을 지정해줍니다. 색은 노란색, 크기는 12px 글씨체는 sans-serif

text 바의 오른쪽 끝에 배치하는 text-anchor를 지정해줍니다.

 

3단계 : 스크립트에 변수 정의하기.

 

<script>
   var data = [10, 5, 12, 15];
   var width = 300,
      scaleFactor = 20,
      barHeight = 30;
</script>

우선 스크립트에 사용할 data변수를 넣어주고

 

svg의 너비는 300, 스크린에 보이는 픽셀 값으로 스케일이 되는 scaleFactor를 20으로

 

막대 높이는 30으로 지정해줍니다.

 

4단계 : SVG 요소를 추가해주기.

 

d3에 svg 요소를 추가해줍니다.

 

var graph = d3.select("body")
   .append("svg")
   .attr("width", width)
   .attr("height", barHeight * data.length);

즉 body태그를 선택해주고 svg를 넣어주며 이때 SVG의 속성은 위에서 정의한 변수의 값을 넣어줍니다.

 

SVG의 높이는 막대 높이 X 데이터 수(30 X 4 = 120)

 

SVG 높이는 막대가 모두 들어와야 하기 때문에 총 4개의 막대가 각각 높이가 30이므로 총 120이 필요한거죠.

 

쉽게 쉽게 생각합시다.

 

너비는 300으로 지정해줍니다.

 

5단계 : 변환을 적용해주기.

 

바에 변환을 적용해줍니다.

 

var bar = graph.selectAll("g") 
   .data(data)
   .enter()
   .append("g")
   .attr("transform", function(d, i) {
      return "translate(0," + i * barHeight + ")";
   });

svg요소 내 그룹을 만들어줍니다.

 

각 그룹 요소는 수평 막대 차트를 서로 아래에 위치시킵니다.

 

즉 하나의 공식인 인덱스 X 바 높이를 사용해줍니다.

 

각 막대가 서로 위 아래로 배치시켜야 하므로 바의 높이는 30인데 이를 인덱스로 곱해주어서 

 

변환을 시켜주는거죠. 

 

즉 처음엔 0 -> 30 -> 60 -> 120 ->.....

 

그러면 바 높이는 각각 위에 처럼 변환이 되어 서로 위 아래로 위치시킬 수 있겠죠?

 

6단계 : 바에 rect 추가하기.

 

rect요소를 만들어준 bar에 적용시켜줍니다.

bar.append("rect")
   .attr("width", function(d) {
      return d * scaleFactor;
   })
   .attr("height", barHeight - 1);

즉 bar에 rect를 append하고 너비 속성은 데이터 값(d)에 정의해준 scaleFactor(20)을 곱해줍니다.

 

즉 너비라는 것은 각 비교를 해줄 수있는 바의 너비인 수평 바의 높낮이 입니다.

 

쉽게 말해 10하고 2는 막대가 10이 좌우로 더 길고 2가 더 짧겠죠.

 

높이는 여백 1을 빼줍니다. 서로 위아래로 공간은 있어야겠죠....

 

7단계 : 데이터를 표시해준다!!!(마지막 단계임)

 

드디어 막대차트의 막단계입니다.

 

각 막대에 수치를 적용시켜주는거죠. 사용자들이 보기 쉽게 ㅎㅎ

 

bar.append("text")
   .attr("x", function(d) { return (d*scaleFactor); })
   .attr("y", barHeight / 2)
   .attr("dy", ".35em")
   .text(function(d) { return d; });

rect를 적용해준 bar에 또 text를 append하여 text의 위치를 해당 수치값(막대 끝) x좌표로 줍니다.

그리고 텍스트의 높이는 바 높이(30)의 절반!! 15로 줍니다.

 

중요한 건 텍스트는 여백을 지원하지 않기 때문에 저희가 임의로 여백을 지정해줘야합니다.

 

즉 offset을 넣어주기위해서 dy에 .35em을 적용해줍니다.(텍스트 새로정렬)

 

<전체 코드>

<html>
   <head>
      <script type = "text/javascript" src = "https://d3js.org/d3.v4.min.js"></script>
      <style>
         svg rect {
            fill: gray;
         }
         
         svg text {
            fill: yellow;
            font: 12px sans-serif;
            text-anchor: end;
         }
      </style>
   </head>

   <body>
      <script>
         var data = [10, 5, 12, 15];
         
         var width = 300 
            scaleFactor = 20, 
            barHeight = 30;
         
         var graph = d3.select("body")
            .append("svg")
            .attr("width", width)
            .attr("height", barHeight * data.length);
         
         var bar = graph.selectAll("g")
            .data(data)
            .enter()
            .append("g")
            .attr("transform", function(d, i) {
               return "translate(0," + i * barHeight + ")";
            });
         bar.append("rect").attr("width", function(d) {
            return d * scaleFactor;
         })
         
         .attr("height", barHeight - 1);
         
         bar.append("text")
            .attr("x", function(d) { return (d*scaleFactor); })
            .attr("y", barHeight / 2)
            .attr("dy", ".35em")
            .text(function(d) { return d; });
      </script>
   </body>
</html>

 

<결과 화면>

 

 

 

 

' > JavaScript,JQurey' 카테고리의 다른 글

자바스크립트-틱택토 게임  (0) 2019.07.22
자바스크립트- 구구단 게임  (0) 2019.07.21
D3.js 공부 8 - 에니메이션  (0) 2019.04.16
D3.js 공부 7 - transition(전환)  (0) 2019.04.10
D3.js 공부 6 - SVG 변환  (0) 2019.04.10