[D3.js] Britecharts 사이트 소개

D3.js/D3.js|2020. 1. 7. 09:00

[D3.js] Britecharts 사이트 소개


D3.js를 공부하다가 재밌는 사이트를 발견했네요. Britecharts 사이트 인데 D3.js 기반의 라이브러리 API 함수를 제공해주는데 업그레이드 형태의 라이브러리인 것 같아요. 차트 시각화가 좀 더 정교하고 멋진 표현을 쉽게 만들 수 있게 해주는 것 같은데 아직 사용해 보지 않았고 코딩을 봐서는 꽤 깔끔하게 차트 코딩이 이루어지는 것 같아 보이네요. 간단히 소개만 합니다.

1. Britecharts 사이트


Britecharts 사이트 github 사이트에 등록된 곳이네요.

여기서, API 항목을 클릭하면 대충 각 차트 형태들을 아래 그림을 보는 것처럼 나누었고 사용방법에 대해서 자세히 소개하고 있네요.

위 API 에서 Bar를 클릭했는데 대충 영문으로 설명을 자세히 나와 있네요.

2. Britecharts 세팅


위의 사이트 이미지에서 Getting Started라는 걸 클릭하면 세팅하는 방법이 아래와 같이 나옵니다. 4가지 방식인데 설치를 하든 직접 링크 연결을 하든 선택해서 하면 되는 것 같더군요.


3. Britecharts 예제


사이트 보시면 Demos항목이 있는데 거기 Bar Chart를 한번 클릭해 봤네요.


code를 보시면 엄청 간결하죠. D3.js를 어느정도 공부하고 이걸고 공부하면 재밌을 것 같네요.

마무리


오늘은 우연히 발견한 Britecharts를 소개 해봤네요. 어느정도 D3.js 지식이 있는 상태에서 이걸 사용하여 차트 시각화하면 꽤 유용할 듯 싶네요. 나중에 d3.js가 정리가 되면 한번 이것도 공부해 봐야 겠네요.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] 축(Axis) 함수  (0) 2020.01.06
[D3.js] Color Scale 함수  (0) 2019.11.22
[D3.js] Color 함수  (0) 2019.11.21
[D3.js] 추가 Scale 함수  (0) 2019.11.20
[D3.js] scaleLinear 함수  (0) 2019.11.19

댓글()

[D3.js] 축(Axis) 함수

D3.js/D3.js|2020. 1. 6. 21:00

[D3.js] 축(Axis) 함수


차트을 보면 양쪽 사이드에 X축과 Y축을 그리는데 D3.js에서는 이 축을 그리는 함수를 제공해 줍니다. 그래서 오늘은 이 X,Y축을 그려보는 실험을 간단히 해보도록 하겠습니다.

1. 축(Axis) 함수


기본 4개의 함수를 살펴보도록 하죠.

  • d3.axisLeft () - 왼쪽 수직 축을 생성
  • d3.axisRight () - 세로 방향의 오른쪽 축을 생성
  • d3.axisBottom () - 하단 수평 축을 생성
  • d3.axisTop () - 상단 수평 축을 생성

2. 축(Axis) 그리기


축을 그리기 위해서 축을 그릴 위치를 아래와 같은 위치에 축을 정했습니다.


그릴 축은 캔버스 영역 안에서 그리게 되는데 한번 코딩을 해보도록 하죠.

1) 캔버스 영역 그리기


지난 시간에 캔버스 영역 그리기는 많이 해보았기 때문에 따로 설명 드리는 것은 생략하겠습니다. 간단히 body 태그에 append()함수로 svg 태그를 추가하고 widht, height 크기의 그리게 되고 배경색은 yellow으로 한다는 코딩입니다.

var width = 300, height = 300;
var svg = d3.select("body").append("svg")
   .attr("width", width)
   .attr("height", height)
   .style("background-color",'yellow');

2) X,Y 축(Axis) 그리기


우선, 축을 그리기 전에 축의 범위를 지정해야 합니다. 범위는 어떻게 지정할까요. 바로 차트를 그릴 읽어 온 데이터의 값의 범위로 축의 범위를 지정해 주면 됩니다.

[데이터]

var data = [100, 200, 300, 400, 500];

[X축 그리기]
위 데이터를 스케일함수를 이용하여 x축 크기를 만들어 봅시다.

 var xScale = d3.scaleLinear().domain([0, d3.max(data)])
   .range([0, width-50]);

위 코딩을 보면 x축 크기는 domain[0,데이터 최대값]을 기준으로 range[0,폭-50]로 반환하게 되면 캔버스 수평(width) 범위에 맞게 X축 scale를 지정해 주게 됩니다.

다음으로, X축을 그리기 위해서 X축 그릴 함수 3.axisBottom()를 사용게 됩니다.

var xAxis = d3.axisBottom().scale(xScale);

하단 수평으로 X축을 그리는데 그 scale은 방금 위에서 만든 xScale값을 scale()함수 안에 대입하면 됩니다.

이제는 캔버스에 X축을 그려 볼까요.

svg.append("g")
    .attr("transform", "translate(30, 280)")
    .call(xAxis)

위에 캔버스 영역 그린 svg에 X축 그리기 위해 g태그를 추가하고 그릴 캔버스 위치는 transform 속성에 translate()함수로 캔버스(30,280) 위치로 이동하게 됩니다. 바로 X축을 그리는 위치가 됩니다. call()함수로 안에 xAxis값을 대입하면 캔버스 안에 지정한 위치를 기준으로 X축을 그리게 됩니다.

[Y축 그리기]
Y축은 위 X축 그리기 과정과 동일합니다.

    var yScale = d3.scaleLinear().domain([0, d3.max(data)])
        .range([height-50, 0]);    
         
    var yAxis = d3.axisLeft().scale(yScale);
         
    svg.append("g")
        .attr("transform", "translate(30, 30)")
        .call(yAxis);

3) 전체 코딩


<body>
 <script type = "text/javascript" src = "https://d3js.org/d3.v5.min.js"></script>  
 <script>
   var width = 300, height = 300;
   var data = [100, 200, 300, 400, 500];
     
   var svg = d3.select("body").append("svg")
         .attr("width", width)
         .attr("height", height)
         .style("background-color",'yellow');
        
    var xScale = d3.scaleLinear().domain([0, d3.max(data)]).range([0, width-50]);

    var yScale = d3.scaleLinear().domain([0, d3.max(data)]).range([height-50, 0]);    
 
    var xAxis = d3.axisBottom().scale(xScale);         
    var yAxis = d3.axisLeft().scale(yScale);
         
    svg.append("g")
        .attr("transform", "translate(30, 30)")
        .call(yAxis);
        
    svg.append("g")
        .attr("transform", "translate(30, 280)")
        .call(xAxis)
        
      </script>
   </body>

4) 결과



마무리


D3.js API 함수를 이용하여 X, Y축을 간단히 그려 보았습니다.참고로 데이터를 그리는 코딩을 하면 코딩이 길어지고 오늘 알아 볼 Axis 관련 함수들에 대한 부분에 집중 하기 위해서 데이터를 그리는 코딩을 일부로 생략 했습니다.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] Britecharts 사이트 소개  (0) 2020.01.07
[D3.js] Color Scale 함수  (0) 2019.11.22
[D3.js] Color 함수  (0) 2019.11.21
[D3.js] 추가 Scale 함수  (0) 2019.11.20
[D3.js] scaleLinear 함수  (0) 2019.11.19

댓글()

[D3.js] Color Scale 함수

D3.js/D3.js|2019. 11. 22. 09:00

[D3.js] Color Scale 함수



지난 시간 Color 함수에 대해 살펴 보았습니다. 오늘은 Color에서 더 나아가 Categorical Colors 함수들에 대해 알아보고자 실험을 하였습니다.

1. Categorical Colors 변천 사


Categorical Colors 함수들이 각 버전 v3, v4, v5 별로 어떻게 변경이 되었는지 알아보도록 하죠

1) 버전 V3


  • d3.scale.category10()
  • d3.scale.category20()
  • d3.scale.category20b()
  • d3.scale.category20c()

위 4개의 함수들이 있습니다. 여기서 함수명의 숫자가 있는데 Color의 갯수라고 생각하시면 될 거에요. 실험은 d3.scale.category10() 함수를 테스트 하는데 위 참고자료의 소스를 인용하여 간단히 실험를 해보겠습니다.

d3.scale.category10() 함수은 10개의 Color를 가지고 있습니다. 그래서 원을 10개를 만들어서 각 Color를 출력하여 어떤 Color를 지니고 있는지 시각적으로 살펴 볼까요.

예) 참고자료 소스 일부 인용

<script src="https://d3js.org/d3.v3.min.js"></script>
  
<body>
<script>
  var color= d3.scale.category10();

  var svg = d3.select("body").append("svg")
                 .attr("width",500)
                 .attr("height",50)
                 .style("background-color",d3.rgb(255,255,0));
      svg.selectAll("circle").data( d3.range(10) )
         .enter()
         .append("circle")
         .attr("r", 18 )
         .attr("cx", d3.scale.linear().domain([-1, 10]).range([0, 500]) )
         .attr("cy", 25)
         .attr("fill", color );
</script>
</body>

[결과]


추가로, 나머지 3개의 함수들을 20가지의 Color를 가지고 있습니다. 한번 어떤 Color를 가지고 있는지 여러분들이 직접 출력 해보세요. 위 코딩은 10가지 색을 지정하는 코딩이였으니깐 20가지 핵으로 지정하려면 위 코딩에서 어떤 값을 수정해야 할까요. 자세히 보시면 10이라는 숫자가 들어가 있는 부분이 보일 꺼에요. 10이라는 수치가 들어가 있는 코딩 부분을 찾아서 20으로 바꾸시면 됩니다.

버전 v4


버전 v3에 사용되는 함수들이 아래아 같이 변경 되었습니다.

  • d3.scale.category10 -> d3.schemeCategory10
  • d3.scale.category20 -> d3.schemeCategory20
  • d3.scale.category20b -> d3.schemeCategory20b
  • d3.scale.category20c -> d3.schemeCategory20c

그럼 어떻게 코딩이 바뀌었는지 확인해 볼까요.

 var color= d3.scale.category10();

변경 후,

 var color = d3.scaleOrdinal(d3.schemeCategory10);

이제는 v4 버전에서도 정상적으로 출력 되는지 볼까요.
예)

<script src="https://d3js.org/d3.v4.min.js"></script>
<body>
<script>
  var color = d3.scaleOrdinal(d3.schemeCategory10);
  var svg = d3.select("body").append("svg")
                 .attr("width",500)
                 .attr("height",50)
                 .style("background-color",d3.rgb(255,255,0));
      svg.selectAll("circle").data( d3.range(10) )
         .enter()
         .append("circle")
         .attr("r", 18 )
         .attr("cx", d3.scaleLinear().domain([-1, 10]).range([0, 500]) )
         .attr("cy", 25)
         .attr("fill", color );
</script>
</body>

추가로,

  • d3.scale.linear() -> d3.scaleLinear()

[결과]
정상적으로 결과가 나왔네요.


버전 v5 변경


  • d3.scale.category10 -> d3.schemeCategory10

위 함수 표현만 남아있고 20가지 색을 지정해야 하는데 더이상 지원하지 않게 되었습니다. 즉, v4버전에서 d3.schemeCategory10 만 남기고 나머지 3개는 더 이상 사용 할 수 없게 되었네요. 다른 Color 지정 함수를 사용해야 합니다.

마무리


D3.js Color Scale 함수들을 공부하면서 좀 불편했네요. 이렇게 버전 별로 변경되는 부분이 많기 때문에 기존의 방식에 익숙한 분들은 매번 버전에 맞게 다시 공부해야 한다는 것이 약간 불편하더군요. 좀 더 개선되고 좋아지기는 하지만 실전에 사용하는 분이 아니라면 어느정도 공부를 해놓았어도 나중 되면 다시 새롭게 공부해야 한다는 것이 공부할 의욕을 약간 꺽는 것 같아요. 현재 써먹을 일이 없다면 나중에 필요할 때 공부하지 그렇게 되면 지금 D3.js를 공부하더라고 깊게 공부를 못하는 요인으로 작용하더군요.
예전에 v4 버전으로 처음 공부할 때 인터넷 자료들이 거의 v3을 기반으로 동영상 강의나 일반 자료들이 제공되기 때문에 따라서 공부하다가 v4버전으로 공부하기 참 힘들었던 것이 기억이 나네요. 초반 공부하다가 문득 v5 버전이 나오면 다시 공부해야하는 것 아냐! 라는 생각이 들고 이렇게까지 열심히 공부해야하냐! 생각도 들고 딱히 뭘 만들어서 시각화 할 대상도 없다 보니깐 중간에 포기했었네요. 이번에 다시 공부 한 이유는 우선 시각화 할 대상 스팀 블록체인이 있기 때문에 이걸 가지고 한번 공부해보고 싶어지니깐 어느정도 의욕이 생기네요.
현재 D3.js API 함수들을 집중적으로 공부하고 있는데 빨리 D3.js 차트 오픈 소스들을 보고 공부해서 제 것으로 만들어야 겠네요. 갈길이 멀군요.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] Britecharts 사이트 소개  (0) 2020.01.07
[D3.js] 축(Axis) 함수  (0) 2020.01.06
[D3.js] Color 함수  (0) 2019.11.21
[D3.js] 추가 Scale 함수  (0) 2019.11.20
[D3.js] scaleLinear 함수  (0) 2019.11.19

댓글()

[D3.js] Color 함수

D3.js/D3.js|2019. 11. 21. 21:00

[D3.js] Color 함수



Color 관련 scale 함수들을 다룰까 고민하다가 그냥 D3.js API에 나와 있는 함수들을 간단히 실험 해보겠습니다.

1. rgb(r,g,b) 함수


  • D3코딩 : d3.rgb(r,g,b);

Red, Green, Blue 값으로 RGB Color를 생성합니다. 우리가 잘 아는 기본 rgb()함수로 그냥 사용하시면 됩니다.

예) 캔버스 영역의 배경색 지정

 <script src="https://d3js.org/d3.v5.min.js"></script>
 
<body>
<script>
  var rgb = d3.rgb(255,0,0);
 
  var svg = d3.select("body").append("svg")
                 .attr("width",100)
                 .attr("height",100)
                 .style("background-color",rgb);
 
</script>
</body>

[결과]


2. hsl(h,s,l) 함수


  • D3코딩 :  d3.hsl(h,s,l);

색조(hue) , 채도(saturation), 명도(lightness) 값으로 HSL Color를 생성합니다.

예) 캔버스 영역의 배경을 색 지정

 <script src="https://d3js.org/d3.v5.min.js"></script>
 
<body>
<script>
  var hsl = d3.hsl(150,50,50);
  var svg = d3.select("body").append("svg")
                 .attr("width",100)
                 .attr("height",100)
                 .style("background-color",hsl);
</script>
</body>

[결과]


Color 문자열을 파싱해서 RGB Color 생성

 <script src="https://d3js.org/d3.v5.min.js"></script>
 
<body>
<script>
  var rgb = d3.rgb(255,0,0);
  var hsl = d3.hsl(d3.rgb(0,255,0));
 
  var svg = d3.select("body").append("svg")
                 .attr("width",100)
                 .attr("height",100)
                 .style("background-color",hsl);
</script>
</body>

[결과]


3. hcl(h, c, l) 함수


  • D3코딩 : d3.hcl(h, c, l);

예) 캔버스 영역의 배경을 색 지정

 <script src="https://d3js.org/d3.v5.min.js"></script>
 
<body>
<script>
  var hsl = d3.hsl(150,50,50);
  var svg = d3.select("body").append("svg")
                 .attr("width",100)
                 .attr("height",100)
                 .style("background-color",hsl);
</script>
</body>

[결과]


추가로, 위 hsl(color)에서와 마찬가지로 hcl(color)로 표현 할 수 있다.

var rgb = d3.rgb(255,0,0);
var hcl = d3.hcl(d3.rgb(0,255,0));

마무리


rgb()함수 하나만 하더라도 그와 관련 된 여러 함수들이 있는데 다음 D3.js 사이트에 가셔서 Color 편을 보시면 과련 함수들이 많기 때문에 다 거론 할 수 없고 직접 가셔서 각 함수들을 인자 값을 대입하여 확인하시기 바랍니다.


'D3.js > D3.js' 카테고리의 다른 글

[D3.js] 축(Axis) 함수  (0) 2020.01.06
[D3.js] Color Scale 함수  (0) 2019.11.22
[D3.js] 추가 Scale 함수  (0) 2019.11.20
[D3.js] scaleLinear 함수  (0) 2019.11.19
[D3.js] 데이터 배열 다룰 때 유용함 함수  (0) 2019.11.18

댓글()

[D3.js] 추가 Scale 함수

D3.js/D3.js|2019. 11. 20. 09:00

[D3.js] 추가 Scale 함수



Scale 관련 함수들을 정리하고 있습니다. 지난시간에 scaleLinear, scalePow, scaleLog 함수에 대해서 간단히 실험 하였고 오늘은 그외 다른 Scale 함수들을 몇개만 더 실험 해볼까 합니다. 과거 제 블로그에 정리하다가 만 내용인데 scaleThreshold(), scaleOrdinal(), scaleQuantize(), scaleQuantile() 함수에 대해서 다시 간단히 정리해 봅니다.

1. d3.scaleThreshold() 함수


  • 구조 : 임의의 수 x가 domain[1,10]의 범위를 가질 때 3가지 상황
    x < 1 일때 상황
    1 <= x < 10 일때 상황
    x >= 10 일때 상황

위와 같은 구조를 x가 값에 3가지 상황이 만들어 집니다.

쉽게 설명하자면,

예)

 <script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    var data = [0,1,2,3,4,5,6,7,8,9,10,11];

        var a = d3.scaleThreshold().domain([1, 10])
                    .range(["red", "green", "blue"]);
                            
    data.forEach(function (d){console.log(a(d)); }); 

  </script>
</body>

[결과]


위 결과를 보는 것 같이 0은 red이고 1~9까지는 green이고 마지막으로 10은 blue가 됩니다. 대충 scaleThreshold()함수가 어떤식으로 동작하는지 아시겠지요.

추가로,

  var a = d3.scaleThreshold().domain([1, 10, 20])
                    .range(["red", "green", "blue","yellow"]);

위와 같은 상황이면 어떻게 동작할까요.


x < 1 일때 => red
1 <= x < 10 일때 => green
10 < x < 20 일때 => blue
x >= 20 일때 => yellow


위와 같은 형태가 됩니다.

2. d3.scaleOrdinal() 함수


이 함수는 도메인의 값은 범위를 나타낸다기 보다는 지정된 고정값을 나타내고 그 고정값에 대한 매칭되는 반환값을 내놓는 방식인데 실제 동작하는 과정을 통해 이해하셔야 이 말의 뜻을 알 수 있습니다. 그리고 이 함수를 제대로 이해하시면 scalePoint()나 scaleBand() 함수들이 있는데 비슷한 동작을 수행합니다. 하나의 함수를 제대로 이해하시면 이 두 함수를 쉽게 이해하실 수 있습니다.

var b = d3.scaleOrdinal().domain([0, 1])
                .range(["red", "green", "blue"]);

이렇게 선언되었다고 하죠. 여기서 0~1의 범위가 아니라 딱 0일때 1일때 두가진 상황만 존재한다는 것이죠. 포인터값이라고 해도 되겠죠.

0일때 => red
1일때 => green

출력되는 것이죠. 그럼 "blue"은 뭐냐고 할 수 있겠죠 구지 두가지 값만 존재하는 도메인인데 어디냐 쓰냐고 아리송 하겠죠.

domain([1,10]) 하면 1~10까지이겠지 하겠지만 여기서 1과 10 두가지 상황 밖에 존재하지 않습니다.

이때

    console.log(b.domain());  
    console.log(b(2));
    console.log(b.domain());  
    console.log(b(-1)); 
    console.log(b(3));
    console.log(b(5));
    console.log(b.domain());

찍어보시면 엄청 재밌는 상황이 발생합니다.

b.domain() => [0,1]  당연 나옵겁니다.
b(2) => blue
b.domain() => [0,1,2] 가 나옴

갑자기 도메인에 2가 추가되고 2가 "blue"되어 버렸죠.

b(-1) => red
b(3) => green
b(5) => blue
b.domain() => [0,1,2,-1,3,5] 가 나옴

보는것처럼, 현재 도메인에 포한된 포인터값이 없다면 새롭게 도메인에 추가됩니다. 여기서 추가 된 세번째 "blue"라는 반환값을 갖게 됩니다.

즉, 순차적으로 반환값이 반환되는데
domain[0, 1, 2, -1, 3, 5]

range 반환값이 red=>green =>blue=>red=>green=>blue... 이런식으로 반환을 하게 됩니다. 여기서 3가지 색은 순차적으로 도메인 등록된 값 순으로 색이 지정되는것이죠.

그리고,

  var c = d3.scaleOrdinal().domain(["a","b","c"])
                .range([0, 10]);

도메인[a,b,c]인데 반환[0,10]이네 하면서 분명히 scaleLinear()함수에서 domain과 range범위는 일치하라고 했는데 뭐지 하시는분들이 있을 수 있습니다. 방금전 scaleOrdinal()의 동작 원리를 이해하신 분이라면 "a"=0, "b"=10이니 "c"=0이 겠구나 하고 떠올라야 합니다.
각 포인터 값들에 대해서 range() 반환값들이 순차적으로 매칭되어서 반환된다는 점만 기억하세요

예)

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    var data = [0,1,2,3,4,5,6,7];

    var b = d3.scaleOrdinal().domain([0, 1])
                .range(["red", "green", "blue"]);;
                            
    data.forEach(function (d){console.log(b(d)); console.log(b.domain()); }); 

  </script>
</body>

[결과]
아래 결과에서 도메인 값이 추가 과정을 잘 보세요.


3. d3.scaleQuantize() 함수


domain()의 범위를 range()반환 값에 맞춰서 자동으로 domain() 범위를 쪼개서 분류합니다. 여러분들이 생각을 할 때 반환값을 기준으로 역으로 도메인의 범위를 지정해준다고 생각하시면 될 거에요.

식 : y = m round(x) + b

 var c = d3.scaleQuantize()
                 .domain([0, 30])
                 .range(["red", "green", "blue"]);

위와 같은 코딩을 하게 되면 어떻게 될까요.

도메인 범위가 다음과 같이 지정이 됩니다.

red   => 0~9
green=> 10~19
blue  =>21~29

즉, 도메인 범위 0~9면 red, 10~19면 green, 21~29면 blue가 자동으로 지정 된다고 생각하시면 이해하는데 편하 실 거에요.

저는 이 함수를 보면서 로또 6개의 구슬이 연상이 되더군요. 45까지의 숫자를 기준으로 이 함수를 사용하게 되면 6개의 색을 range() 범위를 지정하면 알아서 45개의 숫자가 나누어서 domain() 범위를 지정 할 수 있겠군 하고 상상하게 되더군요.

쉽게 설명하자면,

예)

 <script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    var data = [0,1,2,3,4,5,6,7,8,9,10,11];

        var a = d3.scaleThreshold().domain([1, 10])
                    .range(["red", "green", "blue"]);
                            
    data.forEach(function (d){console.log(a(d)); }); 
        
    console.log(d.invertExtent("red"));
    console.log(d.invertExtent("green"));
    console.log(d.invertExtent("blue"));
  </script>
</body>

[결과]
아래 결과를 보시면 잘 쪼개져 있죠. 참고로 invertExtent()함수로 range()값에 해당되는 domain()값을 반환합니다. 어떻게 domain() 범위가 나뉘어 졌는지 확인 하실 수 있겠죠.


4. d3.scaleQuantile() 함수


scaleQuantize()와 유사한 동작을 수행 합니다. 이 함수는 그냥 간단히 예제로 살펴보도록 하죠.

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    var data = [0,1,2,3,4,5,6,7,8,9,10];

    var a = d3.scaleQuantile()
                     .domain([0, 10])
                     .range(["red", "green", "blue"]);                      
    data.forEach(function (d){console.log(a(d));}); 

    console.log(a.invertExtent("red"));
    console.log(a.invertExtent("green"));
    console.log(a.invertExtent("blue"));
  </script>
</body>

[결과]
scaleQuantize()와 같은 동일한 결과를 얻었습니다.


scaleQuantize()와 scaleQuantile() 차이점


scaleQuantile(), scaleQuantize() 이 두함수는 철자도 비슷하고 얼핏보면은 같은 함수라고 혼동할 정도로 참 닮았고 동작 또한 같아서 처음에 애먹은 함수입니다.

  d3.scaleQuantile().domain([0, 30, 50])
           .range(["red", "green", "blue"]);
 
  d3.scaleQuantize().domain([0, 30, 50])
          .range(["red", "green", "blue"]);

이렇게 주어졌을 때 결과를 보시면 다음과 같습니다.

예)

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    var data = [0,1,2,3,4,5,6,7,8,9,10];

    var a = d3.scaleQuantile().domain([0, 30, 50])
           .range(["red", "green", "blue"]);
 
    var b =  d3.scaleQuantize().domain([0, 30, 50])
          .range(["red", "green", "blue"]);;                        

    data.forEach(function (d){console.log(a(d));}); 
    console.log(a.invertExtent("red"));
    console.log(a.invertExtent("green"));
    console.log(a.invertExtent("blue"));

    data.forEach(function (d){console.log(b(d));}); 
    console.log(b.invertExtent("red"));
    console.log(b.invertExtent("green"));
    console.log(b.invertExtent("blue"));
  </script>
</body>

[결과]
invertExtent() 결과를 살펴보시면 확실히 차이점을 느끼 실 수 있을거에요.


즉, scaleQuanitle()함수는 0~30 범위를 고정해서 range()반환 갯수를 맞게 정의되지만, scaleQuantize()은 range() 반환 갯수에서 새롭게 추가된 50인 domain값에 맞게 재정의 된다는 차이점을 가지고 있습니다.

마무리


오늘 실험한 함수들은 scaleThreshold(), scaleOrdinal(), scaleQuantize(), scaleQuantile() 함수들에 대해 간단히 정리했습니다. 계속 관련 Scale함수들을 실험하면서 도대체 이 많은 함수들을 정확히 어떤 상황에 써야 할지 저도 좀 막막하긴 하네요. 나중에 예제들을 분석하면서 사용 방법을 터득해야 겠네요.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] Color Scale 함수  (0) 2019.11.22
[D3.js] Color 함수  (0) 2019.11.21
[D3.js] scaleLinear 함수  (0) 2019.11.19
[D3.js] 데이터 배열 다룰 때 유용함 함수  (0) 2019.11.18
[D3.js] Scale 함수 사용  (0) 2019.11.15

댓글()

[D3.js] scaleLinear 함수

D3.js/D3.js|2019. 11. 19. 09:00

[D3.js] scaleLinear 함수



scale 관련 함수들이 D3.js에 보시면 다양한 함수들이 나와 있습니다. 그중에서도 대표적인 함수가 scaleLinear 함수이고 위 참고 링크 예제를 보시면 scaleLinear 함수를 사용하여 Scale를 설정하는 방법이 나와 있습니다. 오늘은 이 scaleLinear 함수에 대해서 간단히 살펴보고 이 함수와 유사한 scalePow, scaleLog 함수에 대해서도 살펴 보도록 하죠.

1. scaleLinear 함수


  • 수학식 : y= mx + b
  • D3코딩 : d3.scaleLinear()

예)

    var data = [1,2,3,4,5,6,7,8,9,10];

    var scale_Linear = d3.scaleLinear().domain([1, 10]) //y = mx + b
              .range([0, 100])
                            
    data.forEach(function (d){console.log(scale_Linear(d)); }); 

[결과]


이미지 형태로 살펴보면,


2. scaleLinear와 유사한 함수들


(1) scalePow() 함수


  • 수학식 : y = mx^k + b
  • D3코딩 : d3.scalePow()

예)

    var data = [1,2,3,4,5,6,7,8,9,10];

    var scale_Pow = d3.scalePow().domain([1, 10]) // y = mx^k + b
              .range([0, 100])
                            
    data.forEach(function (d){console.log(scale_Pow(d)); }); 

[결과]


이미지 형태로 살펴보면,


(2) scaleLog () 함수


  • 수학식 : y = m log(x) + b
  • D3코딩 : d3.scaleLog()

예)

    var data = [1,2,3,4,5,6,7,8,9,10];

    var scale_Log = d3.scaleLog().domain([1, 10]) //y = m log(x) + b*
              .range([0, 100])
                            
    data.forEach(function (d){console.log(scale_Log(d)); }); 

[결과]


이미지 형태로 살펴보면,


마무리


오늘 실험한 함수들은 scaleLinear(), scalePow(), scaleLog() 함수들에 대해 간단히 실험을 하였습니다. 각 함수들은 어떤 수학식을 가지고 있는지를 잘 정리하고 나중에 적절하게 사용해 봐야 겠네요. 아직은 이 세 함수에 대해 정확히 어떤 상황에서 각 함수들을 사용하는지 약간 애매 합니다. 그래도 대충 그림으로 살펴보면 각 선이 어떤식으로 그려지는지 시각적으로 어느정도 구분하여 이해 할 수 있었네요. 약간은 Linear과 Pow가 비슷한 선이 그려졌고 위 실험에서는 차이점을 시각적으로 보여지지 않았서 약간 애매한 부분이 있고 Log는 차이나게 그려져서 확실히 구분 할 수 있었습니다.

아직은 어디에 어느 함수인지는 많은 예제들을 살펴보면서 사용방법을 정리해야 겠네요.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] Color 함수  (0) 2019.11.21
[D3.js] 추가 Scale 함수  (0) 2019.11.20
[D3.js] 데이터 배열 다룰 때 유용함 함수  (0) 2019.11.18
[D3.js] Scale 함수 사용  (0) 2019.11.15
[D3.js] 코딩의 가독성 높이기  (0) 2019.11.14

댓글()

[D3.js] 데이터 배열 다룰 때 유용함 함수

D3.js/D3.js|2019. 11. 18. 09:00

[D3.js] 데이터 배열 다룰 때 유용함 함수


예전에 제 블로그에 정리했던 배열 함수들인데 이번 D3.js를 정리하면서 다시 스팀 블록에 연재해볼까 합니다. 데이터를 다룰 때 사용되는 기본 함수들인데 알아 두시면 나중에 유용하게 쓸 수 있을 거라 생각 됩니다. 지난시간에 max()함수를 이용하여 읽어 온 데이터 중 가장 큰수를 찾아 낼 수 있었습니다. 이렇게 쉽게 큰수면 max()함수 작은수면 min()함수를 사용하여 원하는 결과를 쉽게 얻을 수 있습니다.

1. 실험 데이터


데이터를 다룰 때 유용한 함수들을 실험하는게 목적임으로 외부에서 데이터를 읽어오는 방식으로 실험하지 않고 간단히 데이터를 선언하여 실험을 하도록 하겠습니다.

var data = [1,2,5,6,7];

2. 배열을 다루는 유용한 함수


실험 할 함수는 min(), max(), extent(), sum(), mean(), median(), quantile(), variance(), deviation() 함수들입니다.

코딩은 아래와 같이 각각 변수를 선언하여 위에 선언된 배열데이터(data) 값을 기준으로 원하는 값을 찾게 됩니다.

    var min = d3.min(data); //최소
    var max = d3.max(data); //최대
    var extent = d3.extent(data); //[최소,최대]
    var sum = d3.sum(data); //합
    var mean = d3.mean(data); //산술평균치
    var median = d3.median(data); //배열위치의 중앙값
    var quantile1 = d3.quantile(data,0); //배열첫번째값
    var quantile2 = d3.quantile(data,1); //배열끝값
    var quantile3 = d3.quantile(data,0.15); //분위수(표본전체도수를 등분하여 등분값)
    var variance = d3.variance (data); //분산
    var deviation = d3.deviation(data); //표준편차

3. 코딩


이 부분은 다행이 V5 버전에서는 변동 사항이 없는 것 같네요. 정상적으로 결과가 나오네요.

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    var data = [1,2,5,6,7];
    var min = d3.min(data); //최소
    var max = d3.max(data); //최대
    var extent = d3.extent(data); //[최소,최대]
    var sum = d3.sum(data); //합
    var mean = d3.mean(data); //산술평균치
    var median = d3.median(data); //배열위치의 중앙값
    var quantile1 = d3.quantile(data,0); //배열첫번째값
    var quantile2 = d3.quantile(data,1); //배열끝값
    var quantile3 = d3.quantile(data,0.15); //분위수(표본전체도수를 등분하여 등분값)
    var variance = d3.variance (data); //분산
    var deviation = d3.deviation(data); //표준편차

    console.log("min : " + min);
    console.log("max : " + max);
    console.log("extent : " + extent);
    console.log("sum : " + sum);
    console.log("mean : " + mean);
    console.log("median : " + median);
    console.log("quantile1 : " + quantile1);
    console.log("quantile2 : " + quantile2);
    console.log("quantile3 : " + quantile3);
    console.log("variance : " + variance);
    console.log("deviation : " + deviation);
  </script>
</body>

[결과]

  • data = [1,2,5,6,7];

위 데이터를 기준으로 각 함수들의 결과가 어떻게 나왔는지 아래 결과 이미지를 보시고 이해해 주시기 바랍니다.


마무리


오늘 실험한 각 함수들은 결과 값을 보시고 각 함수가 어떤 결과를 만들어 내는지 위 결과 이미지를 보고 확인하시면 쉽게 이해 할 수 있을 거에요. 데이터 값을 여러분들이 직접 다른 데이터를 만들어 놓고 결과를 비교 분석 해보세요. 아니면 지난 시간에 데이터 파일을 읽는 법에서 사용한 몇가지 데이터 파일 형식 중 하나를 선택하여 외부 데이터 파일을 만들고 한번 읽어와서 오늘 실험한 함수들에 적용해 보세요.

오늘 다룬 내용은 데이터 시각화 하는데 어떻게 활용 되는지 잘 연상이 안되실 수 있습니다. 지난 시간에 Scale() 함수 예제에서 크기의 범위에서 최소, 최대값을 사용할 때 max() 함수를 사용했었는데 기억하실 지 모르겠네요. 우선은 위 함수들을 간단히 이런 함수들이 있구나 정도로 이해하시고 나서 나중에 D3.js 사이트의 있는 다양한 예제들 보시고 코딩 속의 있는 오늘 실험한 함수들을 찾아 보시고 어떻게 사용하는지 분석해보시면 재미있을 거에요.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] 추가 Scale 함수  (0) 2019.11.20
[D3.js] scaleLinear 함수  (0) 2019.11.19
[D3.js] Scale 함수 사용  (0) 2019.11.15
[D3.js] 코딩의 가독성 높이기  (0) 2019.11.14
[D3.js] CSV, TSV, JSON, XML 시각화  (0) 2019.11.13

댓글()

[D3.js] Scale 함수 사용

D3.js/D3.js|2019. 11. 15. 09:00

[D3.js] Scale 함수 사용



지난시간에 이여 CSV 데이터 파일을 읽어 Circle 모양으로 시각화 코딩을 했었습니다. 단순히 좌표(X,Y) 데이터 값을 통해 캔버스 위치에 Circle을 그리는 명령만 내렸는데 이제 좀 더 디테일적으로 Circle의 Scale을 적용해 보는 시간을 갖도록 합시다. 이 내용은 예전에 v4 번전 때 살짝 기초만 공부할 때 정리했던 내용인데 v5로 다시 정리를 해보네요.

1. CSV 데이터 파일


지난시간에 읽은 CSV 데이터 파일을 circle 모양으로 시각화 코딩을 복습해 볼까요.

[data.csv] : 데이터 간격은 콤마(,) 입니다.(반지름 r를 추가)

x,y,r
50,50,1
100,150,3
150,50,5
200,150,7
250,50,9

2. Scale 함수 사용


[기존 소스]

<script src="https://d3js.org/d3.v5.min.js"></script>
<body>
  <script>
    //배경
    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");
                    
    //데이터 출력
    function render(dataset){
      var circle = svg.selectAll("circle").data(dataset)
            .enter().append("circle")
             .attr("cx",function(d){return d.x;})
             .attr("cy",function(d){return d.y;})
             .attr("r",10)
             .attr("fill","red")
    }
        
    //데이터 읽기
    d3.csv("data.csv",type).then(function(data){      
         render(data);
    });
        
    //데이터 타입
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>
</body> 

위 소스를 보면 attr()함수 내에 r이라는 속성이 있는데 이것이 바로 반지름입니다. 이 반지름 값은 지난시간까지 10으로 고정시켰는데 이제는 크기를 조절하여 시각화를 하고자 합니다.

d3.scaleLinear() 함수를 이용하여 크기를 자동으로 조절 하여 볼까요.

 d3.scaleLinear()
      .domain([참조최소값, 참조최대값])
      .range([출력최소값, 출력최대값]);

위 코딩은 기본 틀로 숙지해주시는 것이 좋습니다. 갑자기 아두이노 생각이 나네요. 아두이노에서 사용하는 map()함수와 유사하네요.

  • map(입력값,참조최소값,참조최대값,출력최소값,출력최대값)

사설은 접고 위 기본구조는 domain(참조범위)이고 range(반환범위)로 이해하시면 되겠습니다.

**예) **

var scale = d3.scaleLinear().domain([0, 10]).range([0, 100]);

위와 같이 지정하면,

scale(1) => 10이 반환.
scale(5) => 50이 반환
scale(10) => 100이 반환

그러면 실제 그렇게 나오는지 살펴 볼까요.

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
 <script>
 
  var Scale = d3.scaleLinear().domain([0,10]).range([0,100]);

  console.log(Scale(1));
  console.log(Scale(5));
  console.log(Scale(10));

 </script>
</body>

[결과]


결과가 정상적으로 출력 되었습니다. 어떤 느낌인지 아시겠지요. 이 Scale 함수를 이용하여 Circle의 크기를 자동으로 조절하게 하면 데이터 시각화가 좀 더 그럴싸하게 표현 되겠죠.

3. 기존 소스에서 Scale함수를 적용하여 표현


    //데이터 출력
    function render(dataset){
      var circle = svg.selectAll("circle").data(dataset)
            .enter().append("circle")
             .attr("cx",function(d){return d.x;})
             .attr("cy",function(d){return d.y;})
             .attr("r",10)
             .attr("fill","red")
    }

기존 소스에서 수정할 부부는 위 데이터 출력 부분입니다. 경계를 나누어 코딩을 하니깐 어디를 수정해야 할지 쉽게 찾을 수 있게 되었죠.

수정 부분은 다음과 같습니다.

.attr("r",10) //반지름
.attr("fill","red") //원색

반지름 10이라고 기존에 고정했는데 Scale 함수를 이용하여 데이터 크기를 조절하겠습니다 그리고 고정 Red 색을 Color로 범위를 점해서 데이터 값에 따라서 Color를 지정해 봅시다.

위 Scale 기본구조에 맞게 한번 지정해 보았습니다.

var rScale = d3.scaleLinear()
                     .domain([0,10])
                     .range([0,50]);

데이터 참조범위는 0~10사이로 잡아놓고 반환 범위는 0~50사이로 해서 반지름의 크기를 조정했습니다. 데이터 값이 너무 클수도 있고 찾을 수도 있습니다. 그렇게 되면 캔버스 영역을 벗어나거나 너무 작게 Circle이 그려질 수 있기 때문에 캔버스의 영역에 맞게 데이터 전체의 Scale를 조절하기 위해서 위와 같이 코딩합니다.

다시, 3줄로 코딩을 나열하는게 좀 보기가 그러니깐 한줄로 표현해보죠. 추가로 Color도 동일하게 지정해 보겠습니다.

var rScale = d3.scaleLinear().domain([0,10]).range([0,50]);
var ColorScale = d3.scaleLinear().domain([0,10]).range(["red","blue"]);

이렇게 해서 Circle의 반지름과 Color를 만들어 놓았습니다. 이제는 참조 데이터 값에 맞게 반환 range()값만 가져와서 실제 캔버스에 그려주면 됩니다.

출력 데이터 값들을 순차적으로 Circle의 r, fill의 값을 지정하여 캔버스에 그리면 됩니다.

.attr("r",function(d){return rScale(d.r);})
.attr("fill",function(d){return ColorScale(d.r);});

종합해보면,
[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>
<body>
  <script>
    var rScale = d3.scaleLinear().domain([0,10]).range([0,50]);
    var ColorScale = d3.scaleLinear().domain([0,10]).range(["red","blue"]);

    //배경
    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");
                    
    //데이터 출력
    function render(dataset){
      var circle = svg.selectAll("circle").data(dataset)
            .enter().append("circle")
             .attr("cx",function(d){return d.x;})
             .attr("cy",function(d){return d.y;})
             .attr("r",function(d){return rScale(d.r);})
             .attr("fill",function(d){return ColorScale(d.r);});
    }
        
    //데이터 읽기
    d3.csv("data.csv",type).then(function(data){      
         render(data);
    });
        
    //데이터 타입
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>
</body> 

[결과]


위 그림처럼 좀 더 그럴싸하게 데이터가 시각화 된 모습을 보실 수 있죠.

여기서, 여러분들은 먼가 아쉬운 점을 찾아야 합니다. 그 아쉬움은 뭘까요. 바로 domain()함수에 있습니다. 자세히 살펴보시면 참조 범위가 0~10사이로 고정되어 있습니다. 데이터를 시각화하는데 참조 데이터를 고정된 값의 범위로 묶어 둔다는 것은 좀 그렇죠. 만약 데이터가 20일 때는 프로그램 소스에 가셔서 직접 해당 위치의 값을 수정해야 합니다.

자연스럽게 참조값의 범위를 읽어 온 데이터 값에 따라 맞춰서 표현하고 싶을 때 그부분을 코딩에 담아 낸다면 좀 더 멋지겠죠.

다음은 그 부분에 대해 이야기 하겠습니다.

4. d3.max 함수로 참조 데이터 범위를 지정


D3.js 함수에는 min(), max()함수가 있습니다. 오늘 사용할 함수는 max()함수 입니다. 사용법은 동일하니깐 max() 사용법을 잘 보시고 나중에 최소값 사용할 일이 있으면 max 대신에 min으로 수정하세요.

그럼 d3.max( ) 함수를 사용해 볼까요.

var rScale = d3.scaleLinear().domain([0,10]).range([0,50]);

위 코딩이 있다면 domain([0,10])함수의 0~10사이의 참조범위를 지정할 때 이때 max값 10을 읽어 올 데이터의 최대값으로 지정해 봅시다.

예) 위의 data.csv 파일에 반지름은 r에 들어 있습니다. 그러면 다음과 같이 코딩하여 max값을 찾아 냅니다.

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>
<body>
  <script>

    //데이터 읽기
    d3.csv("data.csv",type).then(function(data){
      var max_r = d3.max(data, function(d) { return d.r; });
      console.log(max_r);
    });

    //데이터 타입
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>
</body>     

[결과]


보시는 것과 같이 읽어 온 데이터 값 중의 최대값이 9가 나왔네요. 이렇게 해서 최대값을 캔버스의 나타낼 수 있는 최대값 범위가 되었네요.

최대값을 Scale 함수에 지정

 var rScale ;
 var max_r = d3.max(data, function(d) { return d.r; });
 
 rScale = d3.scaleLinear().domain([0,max_r]).range([0,50]);

위 코딩은 대충 의미를 아시겠지요.

종합해보면,

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
 <script>

   var rScale ;
   var ColorScale ;
   var svg = d3.select("body").append("svg")
         .attr("width",500)
         .attr("height",500)
         .style("background-color","yellow");

   function render(dataset){
     var circle = svg.selectAll("circle").data(dataset)
           .enter().append("circle")
            .attr("cx",function(d){return d.x;})
            .attr("cy",function(d){return d.y;})
            .attr("r",function(d){return rScale(d.r);})
            .attr("fill",function(d){return ColorScale(d.r);});
   }

   d3.csv("data.csv",type).then(function(data){
        var max_r = d3.max(data, function(d) { return d.r; });
        rScale = d3.scaleLinear().domain([0,max_r]).range([0,50]);
        ColorScale = d3.scaleLinear().domain([0,max_r]).range(["red","blue"]);
        render(data);
   });

   function type(d){
     d.x=+d.x;  //parseFloat(d.x);
     d.y=+d.y;  //parseFloat(d.y);
     return d;
   }
 </script>
</body>

[결과]


아래와 같이 결과를 얻었습니다. 그런데 별 차이가 없어 보일 꺼에요. 그 이유는 기존 data.csv 파일을 사용했기 때문입니다.


마무리


CSV 데이터 파일을 시각화 할때 Scale 함수를 사용하는 방법을 살펴 보았습니다. 하다보니 꽤 내용이 길어졌는데 간단히 정리하면 딱 두줄 입니다.

var rScale = d3.scaleLinear().domain([0,10]).range([0,50]);
var ColorScale = d3.scaleLinear().domain([0,10]).range(["red","blue"]);

이걸 배우기 위해서 내용을 정리가 좀 안되고 길게 쓰게 되었네요. 한번 간단히 읽어보는 기분으로 보시고 방금 이야기한 이 두줄의 의미만 정확히 이해하시면 됩니다.

[출력]

  • rScale(데이터)
  • ColorScale(데이터)

이렇게 해서 D3.js를 이용하여 캔버스 크기에 맞게 자동으로 크기를 조절할 수 있게 되었습니다.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] scaleLinear 함수  (0) 2019.11.19
[D3.js] 데이터 배열 다룰 때 유용함 함수  (0) 2019.11.18
[D3.js] 코딩의 가독성 높이기  (0) 2019.11.14
[D3.js] CSV, TSV, JSON, XML 시각화  (0) 2019.11.13
[D3.js] XML 파일 읽는법  (0) 2019.11.11

댓글()

[D3.js] 코딩의 가독성 높이기

D3.js/D3.js|2019. 11. 14. 09:00

[D3.js] 코딩의 가독성 높이기



한번에 쭉 명령어를 나열하는 것보다 함수 단위로 쪼개서 명령 동작을 구분하여 가독성을 높이는 작업을 한번 해볼까 합니다. 오늘 실험하는 코딩법은 그냥 하나의 방법일 뿐 보는 관점에 따라 좋은 방법일 수도 아닐 수도 있습니다. 더 큰 틀로 묶는게 나을 수도 있지만 이렇게 쪼개서 나누는 것이 나을 수도 있습니다. 단지 예를 들어 이런식으로도 접근해 볼 수 있다는 의미의 접근법입니다.

1. CSV 데이터 파일 읽기


지난시간에 읽은 CSV 데이터 파일을 circle 모양으로 시각화 코딩을 복습해 볼까요.

[data.csv] : 데이터 간격은 콤마(,) 입니다.

x,y
50,50
100,150
150,50
200,150
250,50

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>
<body>
  <script>

    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");

    d3.csv("data.csv").then(function(data){
        var circle = svg.selectAll("circle").data(data)
               .enter().append("circle")
                 .attr("cx",function(d){return d.x;})
                 .attr("cy",function(d){return d.y;})
                 .attr("r",10)
                 .attr("fill","red");
    });
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>
</body>

[결과]


이 부분은 지난시간에 했던 내용이고 이 부분을 각 동작을 구분 지어서 나눠어 보도록 하겠습니다.

2. CSV 데이터 파일 구분지어 코딩


위 코딩은 큰틀에서 세부분으로 나뉩니다.

[구분]

  • svg 캔버스 영역
  • csv 데이터 읽기
  • circle 형태로 데이터 출력

(1) svg 캔버스 영역


var svg = d3.select("body").append("svg")
       .attr("width",500)
       .attr("height",500)
       .style("background-color","yellow");

위 부분은 그냥 두겠습니다.

(2) csv 데이터 읽기


d3.csv("data.csv").then(function(data){      
     render(data);
});

위 부분은 데이터를 읽는 부분으로 안에는 사용자정의함수 호출만 해놓고 더이상 코딩하지 않습니다. 이렇게 하면 이부분만 보면 "아! 데이터를 읽는 부분이군!" 이렇게 가독성을 높일 수 있습니다. 데이터를 읽어와 render()함수에 data를 넘겨줘서 뭔가 동작을 수행하게 되는 거구나 하고 쉽게 해석 할 수 있습니다.

(3) circle 형태로 데이터 출력


function render(dataset){
      var circle = svg.selectAll("circle").data(dataset)
            .enter().append("circle")
             .attr("cx",function(d){return d.x;})
             .attr("cy",function(d){return d.y;})
             .attr("r",10)
             .attr("fill","red")
}

위 코딩을 보면 읽어 온 데이터를 실제 출력하는 부분으로 어떻게 데이터를 출력하는지 전체 소스에서 해당 출력 영역의 경계를 명확하게 구분지을 수 있습니다. 뭔지는 모른데 circle로 데이터를 출력하는 거구나 하고 구분지어 쉽게 해석 할 수 있습니다.

3. 소스


 <script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    //배경
    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");
                    
    //데이터 출력
    function render(dataset){
      var circle = svg.selectAll("circle").data(dataset)
            .enter().append("circle")
             .attr("cx",function(d){return d.x;})
             .attr("cy",function(d){return d.y;})
             .attr("r",10)
             .attr("fill","red")
    }
        
    //데이터 읽기
    d3.csv("data.csv",type).then(function(data){      
         render(data);
    });
        
    //데이터 타입
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>
</body> 

4. 결과


결과는 아래와 같이 정상적으로 출력 되었네요.


마무리


CSV 데이터 파일을 시각화 할때 이렇게 나누니깐 보기가 훨씬 편해졌죠. 함수단위로 나뉘어서 해당 부분이 어떤 동작을 수행하는지 가독성이 높아졌습니다. 이것은 짧은 코딩 예제를 나눈거라서 구지 저렇게 할 필요가 있을까 생각 할 수 있습니다 하지만 중요한 것은 이렇게 함수 단위로 구분지어 넣으면 나중에 수정하거나 특정 코딩부분을 다른 곳에 이식 할 때 유용합니다. 하나의 틀 형태로 쭉 코딩을 써내려 갈 수 도 있지만 이렇게 분산된 캡슐 형태로 함수 단위로 쪼개어 놓으면 이점이 더 많습니다.

오늘은 그냥 이런식으로 코딩 스타일이 있구나 정도로 알아 두시면 좋습니다.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] 데이터 배열 다룰 때 유용함 함수  (0) 2019.11.18
[D3.js] Scale 함수 사용  (0) 2019.11.15
[D3.js] CSV, TSV, JSON, XML 시각화  (0) 2019.11.13
[D3.js] XML 파일 읽는법  (0) 2019.11.11
[D3.js] JSON 파일 읽는법  (0) 2019.11.01

댓글()

[D3.js] CSV, TSV, JSON, XML 시각화

D3.js/D3.js|2019. 11. 13. 09:00

[D3.js] CSV, TSV, JSON, XML 시각화


오늘은 지금까지 CSV, TSV, JSON, XML 데이터 파일을 읽어오는 실험만 하였습니다. 정확히 해당 데이터 값을 콘솔창에서 확인 햇는데 이번에는 특정 이미지화 해서 데이터를 시각화 하는 실험을 하겠습니다.

1. CSV 데이터 파일 시각화


지난시간에 읽은 CSV 데이터 파일을 circle 모양으로 시각화를 한번 해보았습니다.

[data.csv] : 데이터 간격은 콤마(,) 입니다.

x,y
50,50
100,150
150,50
200,150
250,50

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>
<body>
  <script>

    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");

    d3.csv("data.csv").then(function(data){
        var circle = svg.selectAll("circle").data(data)
               .enter().append("circle")
                 .attr("cx",function(d){return d.x;})
                 .attr("cy",function(d){return d.y;})
                 .attr("r",10)
                 .attr("fill","red");
    });
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>
</body>

[결과]


2. TSV 데이터 파일 시각화


지난시간에 읽은 TSV 데이터 파일을 circle 모양으로 시각화를 한번 해보았습니다.

[data.tsv] : 데이터 간격은 Tab 간격입니다.

x   y
50  50
100 150
150 50
200 150
250 50

[소스] : 코딩은 CSV랑 동일합니다.

<script src="https://d3js.org/d3.v5.min.js"></script>
<body>
  <script>

    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");

    d3.tsv("data.tsv").then(function(data){
        var circle = svg.selectAll("circle").data(data)
               .enter().append("circle")
                 .attr("cx",function(d){return d.x;})
                 .attr("cy",function(d){return d.y;})
                 .attr("r",10)
                 .attr("fill","red");
    });
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>
</body>

[결과]


3. JSON 데이터 파일 시각화


지난시간에 읽은 JSON 데이터 파일을 circle 모양으로 시각화를 한번 해보았습니다.

[data.json]

[
  {
    "x": "50",
    "y": "50"
  },
  {
    "x": "100",
    "y": "150"
  },
  {
    "x": "150",
    "y": "50"
  },
  {
    "x": "200",
    "y": "150"
  },
  {
    "x": "250",
    "y": "50"
  }
]

[소스] : 코딩은 CSV랑 유사 합니다.

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>

    var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");

    d3.json("data.json",type).then(function(data){
        var circle = svg.selectAll("circle").data(data)
               .enter().append("circle")
                 .attr("cx",function(d){return d.x;})
                 .attr("cy",function(d){return d.y;})
                 .attr("r",10)
                 .attr("fill","red");
    });
    function type(d){
      d.x=+d.x;  //parseFloat(d.x);
      d.y=+d.y;  //parseFloat(d.y);
      return d;
    }
  </script>

</body>

[결과]


4. XML 데이터 파일 시각화


지난시간에 읽은 XML 데이터 파일을 막대형 차트 모양으로 시각화를 한번 해보았습니다.

[data.xml]

<?xml version="1.0" encoding="UTF-8" ?>

<data>
  <x>50</x>
  <x>100</x>
  <x>150</x>
  <x>200</x>
  <x>250</x>  
</data>

[소스] : 데이터가 한개임으로 지난시간 배운 막대형 차트를 이용하여 적용해 보죠.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>codingman</title>
    <style>
    .chart div {
      font: 10px sans-serif;
      background-color: steelblue;
      text-align: right;
      padding: 3px;
      margin: 1px;
      color: white;
    }
    </style>
  </head>
  <body>
    <div class="chart"></div>
    <script src="https://d3js.org/d3.v5.min.js"></script>
    <script>

      d3.xml("data.xml").then(function(data){
       d3.select(".chart").selectAll("div").data(data.documentElement.getElementsByTagName("x"))
          .enter().append("div")
          .style("width", function(d) { return  d.textContent + "px"; })
          .text(function(d) { return d.textContent; });
         });
    </script>
  </body>
</html>

[결과]


마무리


CSV, TSV, JSON은 동일한 데이터 형식으로 만들었기 때문에 차트 시각화는 동잏한 방식으로 circle 모양으로 출력하였고 xml은 데이터 값이 한종류로 이루어져서 그냥 막대형 차트 형식으로 출력해 보았습니다.

이렇게 해서 데이터 읽기는 마무리 하도록 하죠. 다음에는 이렇게 읽어 온 데이터를 어떤식으로 시각화 할지 d3.js 함수들을 이용하여 실험해 보도록 하죠.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] Scale 함수 사용  (0) 2019.11.15
[D3.js] 코딩의 가독성 높이기  (0) 2019.11.14
[D3.js] XML 파일 읽는법  (0) 2019.11.11
[D3.js] JSON 파일 읽는법  (0) 2019.11.01
[D3.js] TSV 파일 읽는법  (0) 2019.10.31

댓글()

[D3.js] XML 파일 읽는법

D3.js/D3.js|2019. 11. 11. 09:00

[D3.js] XML 파일 읽는법


지난시간에는 CSV, TSV, JSON 파일을 읽어 보았는데 오늘은 마지막으로 XML 파일을 읽어 보도록 하죠. 실험은 ATOM 편집기에서 이루어 집니다. 웹브라우저 설정이 귀찮아서 그냥 ATOM 편집기로 실험하게 되었네요.

1. XML 실험 데이터

실험 데이터는 간단하게 아래와 같은 데이터를 만들었습니다.

[data.xml]

<?xml version="1.0" encoding="UTF-8" ?>

<data>
  <x>50</x>
  <x>100</x>
  <x>150</x>
  <x>200</x>
  <x>250</x>  
</data>

2. V4 버전에서 XML 파일 열기

V4 버전에서 아래와 같은 함수로 간단히 읽어 올 수 있습니다.

d3.xml("데이터파일", function(error,data){

});
이제 위에 만들어 놓은 XML 데이터를 읽어 봅시다.

[소스]

<script src="https://d3js.org/d3.v4.min.js"></script>

<body>
  <script>

    d3.xml("data.xml", function(data) {
      console.log(data);
    });
  </script>
</body>

[결과]


3. V5 버전에서 XML 파일 열기

d3.XML("데이터파일").then(function(data) {
});

위와 같은 형태로 변경 되었으며 정상적으로 읽어오는지 살펴 보죠.

[소스]

 <script src="https://d3js.org/d3.v5.min.js"></script>

<body>
  <script>
    d3.xml("data.xml").then(function(data) {
      console.log(data);
    });
  </script>
</body>

[결과]


ATOM 편집기에서 에러가 발생해서 문제가 있는 줄 알고 한동한 삽질 했는데 편집기 자체 문제였더군요. 파이어폭스 웹브라우저에서는 정상적으로 출력 되었네요.

파이어폭스에서는 console.log()함수을 통해 나온 데이터 값들이 좀 보기 불편합니다. 이게 정상적으로 출력이 된 건지 처음 보시는분들은 외계어처럼 보일 수 있고 어디에 데이터 값이 있는지도 참 불편하지요. 그래서 rect 모양으로 차트 형태로 데이터를 한번 찍어서 시각화를 통해 정상적으로 데이터를 읽어 왔는지 확인을 한번 해볼까 합니다.

4. V5 버전에서 XML 차트 출력으로 테스트


간단히 데이터 값을 rect 모양으로 출력 시켰습니다.

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>

<body>
 <script>
  var svg = d3.select("body").append("svg")
          .attr("width",500)
          .attr("height",500)
          .style("background-color","yellow");
                    
 d3.xml("data.xml").then(function(data) {

    var rect = svg.selectAll("rect").data(data.documentElement.getElementsByTagName("x"))
             .enter().append("rect")
               .attr("width",function(d){return d.textContent;})
               .attr("height",50)
               .attr("y",function(d,i){return i*100})
               .attr("fill","blue");
    });
 </script>

[결과]


정상적으로 XML 데이터를 읽어 왔네요.

마무리


지금까지 CSV, TSV, JSON, XML 데이터 파일을 읽어오는 연습을 한번 해보았습니다. 다음에는 읽어 온 데이터를 간단히 차트 시각화를 한번 해보도록 하죠.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] 코딩의 가독성 높이기  (0) 2019.11.14
[D3.js] CSV, TSV, JSON, XML 시각화  (0) 2019.11.13
[D3.js] JSON 파일 읽는법  (0) 2019.11.01
[D3.js] TSV 파일 읽는법  (0) 2019.10.31
[D3.js] CSV 파일 읽는법  (0) 2019.10.30

댓글()

[D3.js] JSON 파일 읽는법

D3.js/D3.js|2019. 11. 1. 09:00

[D3.js] JSON 파일 읽는법


지난시간에는 CSV, TSV 파일을 읽어 보았는데 오늘은 JSON 파일을 읽어 보도록 하죠. 실험은 ATOM 편집기에서 이루어 집니다. 웹브라우저 설정이 귀찮아서 그냥 ATOM 편집기로 실험하게 되었네요.

1. JSON 실험 데이터


실험 데이터는 간단하게 아래와 같은 데이터를 만들었습니다.

[data.json]

[
  {
    "x": "50",
    "y": "50"
  },
  {
    "x": "100",
    "y": "150"
  },
  {
    "x": "150",
    "y": "50"
  },
  {
    "x": "200",
    "y": "150"
  },
  {
    "x": "250",
    "y": "50"
  }
]

2. V4 버전에서 JSON 파일 열기


V4 버전에서 아래와 같은 함수로 간단히 읽어 올 수 있습니다.

d3.json("데이터파일", function(error,data){
   
});

이제 위에 만들어 놓은 JSON 데이터를 읽어 봅시다.

[소스]

<script src="https://d3js.org/d3.v4.min.js"></script>

<body>
  <script>

    d3.json("data.json", function(error,data){
        if (error) throw error;

        data.forEach(function(d){
            console.log(d.x+","+d.y);
        });
    });
  </script>
</body>

[결과]


3. V5 버전에서 JSON 파일 열기


d3.json("데이터파일").then(function(data) {
});

위와 같은 형태로 변경 되었으며 정상적으로 읽어오는지 살펴 보죠.

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>
 
<body>
  <script>
    d3.json("data.json").then(function(data) {
      //console.log(data);
            data.forEach(function(d){
                console.log(d.x+","+d.y);
            });
    });
  </script>
</body>

[결과]


정상적으로 JSON 데이터를 읽어 왔네요.

마무리


지금까지 CSV, TSV와 마찬가지로 JSON 함수도 동일한 방식으로 읽어 옵니다. 잘 봐두셨다가 나중에 여러분들이 사용하는 데이터 형식에 맞게 D3.js 함수를 이용하여 활용하시면 됩니다.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] CSV, TSV, JSON, XML 시각화  (0) 2019.11.13
[D3.js] XML 파일 읽는법  (0) 2019.11.11
[D3.js] TSV 파일 읽는법  (0) 2019.10.31
[D3.js] CSV 파일 읽는법  (0) 2019.10.30
[D3.js] 버전에 따른 사라진 함수 복원  (0) 2019.10.29

댓글()

[D3.js] TSV 파일 읽는법

D3.js/D3.js|2019. 10. 31. 09:00

[D3.js] TSV 파일 읽는법


지난시간에는 CSV 파일을 읽어 보았는데 오늘 TSV 파일을 읽어보는 실험을 하도록 하겠습니다. TSV 파일도 버전 4와 버전 5에서 읽는 법이 CSV 파일을 읽는 방식처럼 변경 되었습니다. 두 가지 방식으로 같이 간단히 어떻게 읽어오는지 살펴보도록 하죠.

1. ATOM 편집기에서 실험


TSV 파일을 읽는 실험은 ATOM 편집기에서 "preview HTML"에서 확인 하도록 하겠습니다.


TSV 실험 데이터


메모장에서 지난 시간의 CSV 파일은 콤마(",")로 이루어졌는데 오늘 배우는 TSV 파일은 데이터 간의 간격이 tab키로 맞춰졌습니다. ATOM에서는 tab키를 누르고 저장하면 간격이 스페이스바 키의 값의 간격으로 맞춰져서 정상적인 TSV 데이터 파일이 만들어지지 않으니깐 꼭 메모장에서 작업해서 위 이미지처럼 데이터 파일을 만드세요.

2. V4 버전 TSV 파일 열기


V4 버전에서는

d3.tsv("데이터파일", 타입, function(error,data){
   
});

이렇게 정의되어 있으며 아래에서 간단히 위에서 만든 TSV 데이터 파일을 열어 보죠.

[소스]

<script src="https://d3js.org/d3.v4.min.js"></script>
 
<body>
 <script>
   d3.tsv("data.tsv", type, function(error,data){
       if (error) throw error;
 
       data.forEach(function(d){
           console.log(d.x+","+d.y);
       });
   });
 
   function type(d){
     d.x=+d.x;  //parseFloat(d.x);
     d.y=+d.y;  //parseFloat(d.y);
     return d;
   }
 </script>
</body>

[결과]


결과를 보시면 정상적으로 데이터를 읽어왔네요. 데이터는 타입을 지정하고 consol.log()함수로 해당 데이터를 읽어오게 됩니다.

3. V5 버전 TSV 파일 열기


d3.tsv("데이터파일",타입).then(function(data) {
});

위와 같은 형태로 변경 되었으며 정상적으로 읽어오는지 살펴 보죠.

[소스]

<script src="https://d3js.org/d3.v5.min.js"></script>
 
<body>
 <script>
 
 d3.tsv("data.tsv",type).then(function(data) {
  //console.log(data);
        data.forEach(function(d){
            console.log(d.x+","+d.y);
        });
 });
 
 function type(d){
  d.x=+d.x;  //parseFloat(d.x);
  d.y=+d.y;  //parseFloat(d.y);
  return d;
 }
 </script>
</body>

[결과]


V4 버전와 같은 결과를 읽어 왔네요.

마무리


V4 버전에서 사용된 TSV()함수가 V4 버전에서 달라졌고 저도 처음에 왜! 못 읽지 했네요. 여러 종류의 데이터 파일들을 읽는 방식이 전부 변경 되었네요.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] XML 파일 읽는법  (0) 2019.11.11
[D3.js] JSON 파일 읽는법  (0) 2019.11.01
[D3.js] CSV 파일 읽는법  (0) 2019.10.30
[D3.js] 버전에 따른 사라진 함수 복원  (0) 2019.10.29
[D3.js] HTML의 CSS  (0) 2019.10.28

댓글()

[D3.js] CSV 파일 읽는법

D3.js/D3.js|2019. 10. 30. 09:00

[D3.js] CSV 파일 읽는법


Data 형식이 CSV파일로 되어 있을 때 CSV 파일을 D3.js에서 읽는 실험을 간단히 해보도록 하죠. 엑셀로 DB작업을 했을 때 그 파일을 CSV 파일형식으로 변환을 많이 합니다. CSV 파일 형태로 된 데이터를 많이 다루게 됩니다. D3.js에서 CSV 파일을 어떻게 읽어오는지 알아두시면 좋겠죠.

1. 크롬 웹브라우저에서 파일 열기


D3.js의 결과를 보기 위해서 웹브라우저 창에서 열게 됩니다. CSV 파일을 웹브라우저에서 읽고 결과를 출력하기 위해서는 사전 세팅이 필요합니다. 제가 처음에 연습했을 때는 그냥 ATOM 편집기를 이용하여 가상 웹서버 플로그를 통해 http형식으로 열어 CSV 파일을 쉽게 열었는데 ATOM 편집기가 안깔린 노트북에서 실험을 하다 보니 크롬 웹브라우저 "file:///C:/" 열면 Cross domain 문제로 ERROR가 발생합니다. "보안 어쩌구 저쩌구" 문제로 열리지 않습니다. 그래서 크롬 속성창의 속성 정보를 수정해야 합니다.

크롬 속성창에서 대상 부분에 "--allow-file-access-from-files "를 추가하면 되는데 제 노트북에서 안되더군요. 그래서 검색을 좀 하니 저와 같은 문제를 해결한 post가 있어 겨우 크롬 문제를 해결했네요.

삽입 문장 : "--disable-web-security --user-data-dir"

삽입 할 문장은 아래 그림에서 대상 부분에 이여서 삽입문장을 복사해서 붙이시면 됩니다.


2. CSV 파일 열기


[data.csv]


(1) 버전 4에서 열기


d3.csv("data.csv", function(error, data) {
  if (error) throw error;
  console.log(data);
});

[결과] 크롬


(2) 버전 5에서 열기



버전 5에서는 기존의 버전4 d3.csv()함수는 작동하지 않고 변경 되었네요. 위 출처에 가셔서 한번 어떤게 바뀌게 되었는지 읽어 보시기 바랍니다.

d3.csv("data.csv").then(function(data) {
  console.log(data);
});

[결과] 파이어폭스


위 코딩도 지원하는 최신 웹브라우저에서 사용이 가능 하고 구버전에서는 작동이 되지 않더군요. 좀 불편하다면 그냥 버전 4로 기존 방식을 사용하는게 좋을 듯 싶네요. 크롬 버전이 낮아서 그런지 크롬에서 정상작동하지 않아서 파이어폭스로 실행해 보았네요.

3. ATOM 편집기에서 열기


웹브라우저의 속성창을 수정 할 필요 없이 그냥 열 수 있습니다. 처음부터 ATOM에서 연습하시면 귀찮은 부분은 없어집니다.


다운받아서 설치하시면 그냥 단순한 편집기로 별 다른 기능은 없습니다. 패키지를 설치해야 하는데 여러분들이 공부하고 싶은 패키지를 검색하셔서 설치하시면 됩니다. 오늘 post의 실험을 하기 위해서는 preview HTML 패키지를 설치하시면 됩니다. 혹시 가상서버로 여시고 싶을 때는 Live Server 패키지를 설치하시면 됩니다. 참고로 여러가 패키지가 있는데 각자 선호하는 기능들이 다르기 때문에 구글 검색에서 ATOM 편집기에 사용하기 좋은 패키지를 한번 검색하셔서 원하는 패키지를 설치하시기 바랍니다.

(1) 버전 4 CSV 파일 열기



(2) 버전 5 CSV 파일 열기



마무리


버전 5에서는 CSV()함수가 좋아졌는데 좀 불편한 감이 없잖아 있네요. 계속 개선은 되는데 개선 될 때 마다 버전 별 코딩이 바뀌니깐 매번 체크해 줘야 한다는 점이 D3.js를 공부하는 장애가 되고 있네요. 현재까지 잘 사용하던 함수가 새로운 버전이 나와 바뀌게 될 경우 코딩에 에러가 발생한다는 점이 지금 써먹지 못한다면 구지 최신 버전에 맞게 공부 할 필요성이 있는지라는 코딩 의욕을 꺾는 요소가 되는 것 같아요.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] JSON 파일 읽는법  (0) 2019.11.01
[D3.js] TSV 파일 읽는법  (0) 2019.10.31
[D3.js] 버전에 따른 사라진 함수 복원  (0) 2019.10.29
[D3.js] HTML의 CSS  (0) 2019.10.28
[D3.js] HTML의 SVG 태그 D3로 코딩  (0) 2019.10.25

댓글()

[D3.js] 버전에 따른 사라진 함수 복원

D3.js/D3.js|2019. 10. 29. 09:00

[D3.js] 버전에 따른 사라진 함수 복원


예전에 처음 D3.js를 공부할 때 제일 애먹은 부분이 버전 별 함수가 변경 되거나 또는 사리지는 함수들 때문에 유튜브 동영상 강좌를 보면서 현재 버전을 공부할 때 에러와의 싸움에서 무지 답답하고 귀찮았습니다. 오늘 다루는 사라진 함수를 사용하고 싶을 때 복원하는 방법을 다루고자 합니다.

1. d3.svg.diagonal() 함수


V3 버전에서 사용되는 함수인데 V4버전에서는 사라진 함수입니다. 이 함수를 사용하면 V4버전 부터는 에러가 뜹니다. 물론 V5버전에서 에러가 뜨겠죠. 이 곡선과 유사한 곡선을 물론 V4버전에서 제공되는데 이 곡선함수를 사용하고 싶을 때에는 V3버전을 링크 걸어서 사용해야 합니다.

하지만, 꼭 링크를 걸어서 사용할 필요는 없습니다. d3.js를 공부하시는 분들이라면 이 함수를 복원하고 싶은 충동을 느끼신다면 한번 직접 만들어 봐야 겠죠.

우선 V3 버전으로 곡선을 그려 보고 분석 해보도록 하죠.

V3버전 d3.svg.diagonal() 함수 사용 :

<svg height="300" width="300" style="background: yellow">
</svg>

<script src="https://d3js.org/d3.v3.min.js"></script>

<script>
var diagonal = d3.svg.diagonal()
      .source({x:10,y:10})
      .target({x:290,y:290});
var path = d3.select("svg").append("path")
      .attr("fill","none")
      .attr("stroke","#0000ff")
      .attr("stroke-width","1.5px")
      .attr("d",diagonal);
</script>

[결과]


위 결과는 V3버전에서 사용할 경우에 한해서 결과가 출력합니다. V4버전 이후 부터는 사용 할 수 없습니다.

2. d3.svg.diagonal() 함수 곡선 분석


이 함수를 복원하기 위해서는 HTML 문서 상에서 어떤 코딩으로 곡선이 그려지는지 분석해야 합니다.

한번 위 예제소스를 실행시켜서 나온 결과에 오른쪽 마우스 버턴을 클릭하여 소스창보기를 할까요.

<path d="M10,10C10,150 290,150 290,290" stroke-width="1.5px" stroke="#0000ff" fill="none"></path>

위의 HTML 코딩 소스를 보시는 것과 같이 path태그속에서 M10,10에서 시작하여 숫자들이 나열되고 290,290지점으로 끝나게 됩니다. 뭔지는 모르지만 path 태그에서 d속성값을 위 숫자대로 대입하면 결과 이미지 처럼 나오게 됩니다.

정리를 하면,

diagonal = d3.svg.diagonal()
      .source({x:10,y:10})
      .target({x:290,y:290});

위 기준으로 시작하고 path 부분만 만들어 주면 됩니다. 그러면 패치 경로는 아래 HTML문서상의 코딩처럼 나오게 코딩해야 겠죠.

 <path d="M10,10C10,150 290,150 290,290" stroke-width="1.5px" stroke="#0000ff" fill="none"></path></svg>

위 path 경로의 d값만 코딩으로 표현하면 되는데 이 부분을 함수로 만들어 보겠습니다.

3. d3.svg.diagonal() 함수 만들기


 <path d="M10,10C10,150 290,150 290,290" stroke-width="1.5px" stroke="#0000ff" fill="none"></path></svg>

위 코딩 부분을 잘 풀어서 정리하면 아래와 같이 코딩 할 수 있습니다.

d =  "M"+source.x+","+ source.y+"C"+source.x+","+(target.y-140)+
    " "+target.x+","+(target.y-140)+ " " +target.x+","+target.y ;

이 부분을 함수로 만들어 정리하면,

function diagonaltest(){
  return "M"+source.x+","+ source.y+"C"+source.x+","+(target.y-140)+
    " "+target.x+","+(target.y-140)+ " " +target.x+","+target.y ;
}

이 코딩은 제 블로그에 예전에 공부할 때 정리한 코딩입니다.

4. d3.svg.diagonal()함수를 diagonaltest()함수로 변경


<svg height="300" width="300" style="background: yellow">
</svg>

<script src="https://d3js.org/d3.v5.min.js"></script>

<script>
var source = {x:10,y:10};
var target = {x:290,y:290};
var path = d3.select("svg").append("path")
    .attr("fill","none")
    .attr("stroke","#0000ff")
    .attr("stroke-width","1.5px")
    .attr("d",diagonaltest);

function diagonaltest(){
  return "M"+source.x+","+ source.y+"C"+source.x+","+(target.y-140)+
    " "+target.x+","+(target.y-140)+ " " +target.x+","+target.y ;
}
</script>

[결과]


마무리


대충 사라진 함수를 복원한 실험을 하였습니다.사실 예전에 D3.js를 처음 공부 할 때잠깐 실험했네 내용인데 스팀잇 공간에 소개하고 싶어서 post을 올립니다. 사실 사라진 함수는 새로운 함수가 나왔기 때문에 사라졌고 그 새로운 함수를 쓰면 좋지만 d3.js를 공부한다면 이 부분을 직접 복원해 보는 공부도 해보는 것이 좋을 것 같아서 이번 post의 주제로 정했네요.

사실 주말에 다른 일 때문에 post 연재가 막힐 것 같아서 예전에 실험한 내용을 기반으로 다시 정리를 했네요.

오늘 실험한 내용은 우선 과거 버전으로 코딩해서 나온 HTML의 결과 소스를 보고 분석하여 복원 함수를 만들었는데 여러분들도 과거버전 중 사라진 함수가 있다면 그 함수를 이런식으로 HTML 소스를 분석하여 직접 만들어 보셨으면 합니다.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] TSV 파일 읽는법  (0) 2019.10.31
[D3.js] CSV 파일 읽는법  (0) 2019.10.30
[D3.js] HTML의 CSS  (0) 2019.10.28
[D3.js] HTML의 SVG 태그 D3로 코딩  (0) 2019.10.25
[D3.js] HTML의 SVG 태그  (0) 2019.10.24

댓글()

[D3.js] HTML의 CSS

D3.js/D3.js|2019. 10. 28. 09:00

[D3.js] HTML의 CSS


CSS를 알아두면 D3.js를 사용할 때 편합니다. CSS은 HTML의 각 태그들의 스타일을 지정해 줍니다. 태그의 스타일을 D3.js 함수로 지정하여 멋지게 태그의 스타일을 만들기 때문에 미리 CSS의 개념을 잡아 놓으시면 나중에 D3.js에서 사용하실 때 효율적으로 코딩을 할 수 있습니다.

1. CSS(Cascading Style Sheets)


[기본 배치] : 3가지 형태로 CSS를 표현 합니다.

  • HTML 문서에 삽입하는 경우 :
<style>
svg {
  background-color: yellow;  
}
</style>
  • HTML 태그 속에 삽입하는 경우(svg) :
<svg width="300" height="300" style="background: yellow"></svg> 
  • 외부 CSS파일로 빼놓을 경우 :
<link rel="stylesheet" href="style.css" />

style.css 파일

svg {
  background-color: yellow;  
}


3. CSS 기본 코딩


스타일 지정 방식에서 특정 태그의 스타일을 지정하는 방식으로는 태그명, 클래스명, ID명으로 해당 태그의 스타일을 지정 할 수 있다.

<style>
     svg{
       background-color: yellow;
     }
     .a{
       fill:red;
       stroke:blue;
       stroke-width:5;
     }
     #b{
       fill:blue;
       stroke:red;
       stroke-width:5;
     }
</style>
<svg width="300" height="300">
   <rect class="a" x="10" y="10" width="50" height="30" />
   <rect id="b" x="100" y="100" width="50" height="30" />
</svg>      

위 예제는 3가지 접근 방법인데 svg 태그명으로 접근하면 html 문서상에 모든 svg 태그의 스타일을 지정하게 되고, 클래스명으로 접근하면 해당 클래명을 가진 태그만 스타일을 지정하게 된다. id명도 마찬가지입니다.

[결과]


2. D3.js로 스타일 지정


<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var svg = d3.select("body").append("svg")
     .attr("width", "300")
     .attr("height", "300")
     .style("background-color","yellow");
</script>

지난 시간의 예제 소스 입니다. 보시면 style()함수가 있고 각 개별적으로 스타일 속성을 지정해 주시면 svg 태그의 스타일이 변경됩니다.

묶어서 한번에 스타일을 지정 하고 싶을 때에는 rect 태그를 기준으로 코딩하면 다음과 같습니다.

  .styles({fill: 'red', stroke: 'blue', 'stroke-width': 5, opacity: 0.5 })

즉, 한개씩 수정할 때는 style()함수를 사용하고 여러개를 한번에 수정할 때에는 styles()함수를 사용한다.

참고로, attrs()나 styles()함수를 사용하기 위해서는 다음과 같은 링크 태그를 삽입해 놓아야 합니다.

<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>

마무리


CSS은 간단한 기본 지정만 하고 끝냈는데 사실 다양한 기능들이 있습니다. CSS를 얼마나 많은 사전지식을 가지고 있느냐에 따라 데이터 시각화의 스케일이 달라지게 됩니다. 애니메이션 효과도 부여 할 수 있고 스타일을 좀 더 정교하게 지정을 할 수 있는데 이건 CSS 래퍼런스를 좀 깊게 공부해 보세요. 나중에 D3.js로 데이터 시각화 할 때 CSS의 사전 지식을 어느정도 가지고 있으면 고퀄리티 작품을 만들 수 있을 거라 생각됩니다.

오늘 post에서는 간단히 CSS라는 것이 대충 어떤 느낌인지만 알아보는 시간이기 때문에 CSS 기교는 모두 뺐습니다. 이부분은 여러분들이 한번 CSS에 대한 문법을 공부한 뒤에 D3.js에서 CSS를 다뤄 보세요.

댓글()

[D3.js] HTML의 SVG 태그 D3로 코딩

D3.js/D3.js|2019. 10. 25. 09:00

[D3.js] HTML의 SVG 태그 D3로 코딩


지난 시간에는 HTML SVG 그리기 태그들을 이용하여 기본 태그와 속성들을 살펴 보았습니다. 이제는 D3.js 함수들을 사용하여 지난 시간의 배운 태그들을 표현을 해보는 시간을 갖도록 하겠습니다.

1. SVG 태그


<svg width="300" height="300"></svg>

D3.js로 표현하면 다음과 같습니다.

<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var svg = d3.select("body").append("svg")
     .attr("width", "300")
     .attr("height", "300")
     .style("background-color","blue");
</script>

attr()함수로 태그의 속성값을 지정하고 style()함수로 태그의 스타일을 지정해 줍니다.

여기서 몇개 안되는 속성 지정은 그냥 attr()함수나 style()함수로 일일히 지정해 주면 되지만 속성과 스타일의 지정 갯수가 많을 경우는 반복 코딩으로 꽤 귀찮은 코딩이 되겠죠.

이부분에 대해서 살펴보니깐 다음과 같이 수정하면 되더군요.

<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var svg = d3.select("body").append("svg")
     .attrs({ width: 300, height: 300 })
     .style("background-color","yellow");
</script>

attrs()함수로 해서 여러개의 속성을 한번에 지정 할 수 있습니다.

2. 사각형 태그


기본 이미지 모양 태그 rect, circle, line, path, ellipse, polyline 등을 사용하여 그림을 그리게 되는데 그중 rect(사각형)을 D3.js로 어떻게 코딩되는지 살펴보도록 하죠.

위 SVG 코딩의 연장 선상에서 보시기 바랍니다.

var rect = svg.append("rect")  
   .attr("x","10")
   .attr("y","10")
   .attr("width","100")<center>![](https://i.imgur.com/gQiSnv4.jpg)</center>
   .attr("height","100")
   .attr("fill", "blue") //내부색
   .attr("stroke","red") //테두리색
   .attr("stroke-width","5") //테두리 두께
   .attr("opacity","0.5");  //불투명도



=> 내부색이 blue이고 테두리가 red인데 이미지가 이상하게 보일꺼에요. 불투명도 때문에 그렇습니다.

그런데 위와 같이 코딩을 하면 꽤 길고 귀찮게 attr()함수를 반복 코딩을 하는 번거로움이 발생합니다.

이부분을 간단히 코딩해 볼까요.

 var rect = svg.append("rect")
   .attrs({ x: 10, y: 10, width: 100, height: 100, fill: 'red', stroke: 'blue', 'stroke-width':5, opacity: '0.5' }) 

HTML에서 코딩하는 것처럼 속성 값들을 위와같이 나열하면 됩니다

다른방법으로,

 var rect = svg.append("rect")
   .attrs({ x: 10, y: 10, width: 100, height: 100})
   .styles({fill: 'red', stroke: 'blue', 'stroke-width': 5, opacity: 0.5 })

attrs()함수로 전체 속성을 지정해 주고 스타일 경우도 styles()함수로 전체 스타일을 지정해 주면 됩니다.

주의 : stroke-width의 경우는 따옴표로 묶어주셔야 합니다. '-'기호는 인식에서 에러가 발생하더군요. 그냥 HTML에서 쓰던 방식으로 코딩하면 안되고 일부 안되는 부분은 시행착오를 거쳐서 알아내야 하더군요.

그리고, attr() 함수의 인자인지 아니면 style()함수의 인자인지 참 애모한 경우가 있습니다. 일부 인자의 경우는 둘 모두에서 사용 될 수 있고 경우에 따라 한쪽에서만 사용되는 경우가 있는데 이건 연습이 필요해 보이네요.

3. 그외 태그들



<circle cx="100" cy="100" r="50" fill="red" stroke="blue" stroke-width="5"></circle>

타원


 <ellipse cx="100" cy="100" rx="50" ry="70" fill="red" stroke="blue" stroke-width="5"></ellipse>

라인


 <line x1="10" y1="10" x2="290" y2="290" stroke = "blue" stroke-width="5"> </line>

특수라인(path)


 <path d="M10,210 L110,120 110,210 110,220 210,250" fill="none" stroke="blue" stroke-width="5"></path>

폴리건


<polyline points="50,50 250,50 150,150 50,50" fill= "red" stroke="blue" stroke-width="5"></polyline>

위의 각 태그들은 사각형에서 표현했던 방식으로 여러분들이 수정해 보세요.

마무리


d3.js로 접근하는 함수에 대해 간단히 사각형으로 예를 들었고 그외 태그들은 복습 차원으로 다시 나열했습니다. 시험문제라고 생각하고 위 태그들을 사각형에서 코딩했던 방식으로 나머지 태그들을 어떻게 코딩을 해야 할지 한번 풀어 보세요.

댓글()

[D3.js] HTML의 SVG 태그

D3.js/D3.js|2019. 10. 24. 09:00

[D3.js] HTML의 SVG 태그


D3.js를 사용하기 위해서는 HTML에서 사용되는 태그들을 기본적으로 알아야 합니다. 그중에서도 SVG 태그는 꼭 숙지해 두셔야 나중에 차트와 같은 데이터 이미지화 할 때 효율적으로 사용할 수 있습니다. 오늘은 간단히 SVG에 자주 사용되는 태그들을 중점적으로 살펴보겠습니다.

1. 태그 SVG를 알자


웹상에서 그림을 그릴 때 HTML 태그 중 SVG로 그림을 그리는 영역을 잡고 기본 이미지 모양 태그 rect, circle, line, path, ellipse, polyline 등을 사용하여 그림을 그리게 됩니다.

SVG 태그 : 가로x세로(300x300)의 크기의 그림을 그리는 영역을 잡으면 아래와 같습니다.

<svg width="300" height="300"></svg>

그리고 그림 그리는 영역의 배경색을 넣을 때는 스타일로 지정을 하게 됩니다.

style="background: yellow"

svg 태그 안에서는 위와 같이 표현하면 됩니다.

<svg width="300" height="300" style="background: yellow"></svg> 


위 표현을 style을 앞에 표현한다면 이전 시간에 막대형 차트에서 보셨던 것 처럼 style 태그 안에다 해당 svg에 대한 스타일을 지정하면 됩니다.

<style>
  svg {
    background-color: yellow;
  }
</style>

<svg width="300" height="300" >

2. 이미지 모양 태그


1) 사각형


<rect x="10", y="10" width="100" height="100" fill="red" stroke="blue" stroke-widht="5" opacity="0.5"></rect>
  • x,y : 시작꼭지점 위치
  • width : 사각 너비 크기
  • height : 사각 높이 크기
  • fill : 내부색
  • stroke : 테두리 색
  • stroke-widht : 테두리 크기
  • opacity : 투명도

예) 300x300 캔버스에 100x100 크기의 사각형을 그리기

  <svg width="300" height="300" style="background: yellow">
    <rect x="10", y="10" width="100" height="100" fill="red" stroke="blue" stroke-widht="5" opacity="0.5"></rect>    
  </svg> 

[결과]


2) 원


<circle cx="100" cy="100" r="50" fill="red" stroke="blue" stroke-width="5"></circle>
  • cx,cy : 원 시작꼭지점(cx,cy)
  • r : 반지름
  • 기타 : 위 사각형과 동일함

예) 300x300 캔버스에 반지름이 50인 원을 그리기

  <svg width="300" height="300" style="background: yellow">
    <circle cx="100" cy="100" r="50" fill="red" stroke="blue" stroke-width="5"></circle>
  </svg> 

[결과]


3) 타원


 <ellipse cx="100" cy="100" rx="50" ry="70" fill="red" stroke="blue" stroke-width="5"></ellipse>
  • cx,cy : 시작꼭지점(cx,cy)
  • rx : x축으로 넓이 반지름
  • ry : y축으로 높이 반지름
  • 기타 : 위 사각형과 동일함

예) 300x300 캔버스에 반지름이 x축 반지름 50이고 y축 반지름이 70인 타원을 그리기

  <svg width="300" height="300" style="background: yellow">
    <ellipse cx="100" cy="100" rx="50" ry="70" fill="red" stroke="blue" stroke-width="5"></ellipse>
  </svg> 

[결과]


4) 라인


 <line x1="10" y1="10" x2="290" y2="290" stroke = "blue" stroke-width="5"> </line>
  • x1,y1 : 시작점(x1,y1)
  • x2,y2 : 끝점(x2,y2)

예) 300x300 캔버스에 시작꼭지점(10,10)에서 끝점(290,290)가지의 직선그리기

  <svg width="300" height="300" style="background: yellow">
    <line x1="10" y1="10" x2="290" y2="290" stroke = "blue" stroke-width="5"> </line>
  </svg> 

[결과]


5) 특수라인(path)


 <path d="M10,210 L110,120 110,210 110,220 210,250" fill="none" stroke="blue" stroke-width="5"></path>

M : 시작 위치로 이동 (M 10,210 => (10,210)꼭지점이 시작위치가 됨
L : 이동할 라인 좌표 (L 110,120 => (110,120)꼭지점으로 라인을 그음 )
C : 곡선 S : 부드러운곡선 Q : 차 베지에곡선 T : 부드러운 차 베지에 곡선 A : 호 Z = 끝경로(시작점과 이

예) 300x300 캔버스에 특수라인 그리기

  <svg width="300" height="300" style="background: yellow">
    <path d="M10,210 L110,120 110,210 110,220 210,250" fill="none" stroke="blue" stroke-width="5"></path>
  </svg> 

[결과]


6) 폴리건


<polyline points="50,50 250,50 150,150 50,50" fill= "red" stroke="blue" stroke-width="5"></polyline>
  • pints : 폴리건의 꼭지점들

예) 300x300 캔버스에 폴리건 그리기

  <svg width="300" height="300" style="background: yellow">
    <polyline points="50,50 250,50 150,150 50,50" fill= "red" stroke="blue" stroke-width="5"></polyline>
  </svg> 

[결과]


마무리


오늘은 d3.js에서 데이터 시각화를 할 때 자주 사용되는 태그와 속성들을 간단히 살펴보았습니다. HTML 태그로 되어 있는데 이 부분을 D3.js함수로 그리게 할 수 있는데 오늘 내용이 너무 길어서 서론만 이야기하고 본론인 D3.js 함수에 대해서 이야기를 못했네요. 그냥 오늘은 HTML에서 사용되는 그리기 태그들만 간단히 알아만 두세요.

댓글()

[D3.js] 애니메이션 효과 순환 동작

D3.js/D3.js|2019. 10. 23. 09:00

[D3.js] 애니메이션 효과 순환 동작


지난 시간에 post 애니메이션 효과편으로 간단한 동작 실험을 했었죠. 오늘은 순환 호출 함수를 통해 애니메이션 효과 동작을 실행하는 원리를 살펴보고자 합니다.

1. 순환 호출 함수 원리


순환 호출이란 뭘까요. A라는 동작을 수행을 끝내고 난 뒤에 다시 A라는 동작을 호출하여 수행하는 반복 수행을 하는 것을 말합니다. 즉, 계속 똑같은 작업을 반복 수행한다고 생각하면 되겠죠.

D3.js에서 어떤 함수인지 살펴보도록 하죠.

transition.on(typenames[, listener]) (출처 : https://github.com/d3/d3-transition)
[타입] :

  • start - when the transition starts.
  • end - when the transition ends.
  • interrupt - when the transition is interrupted.

2. 순환 호출 실험


transition.on.on(start, 순환호출함수)

위 표현을 오늘 실험 합니다.

지난시간의 애니메이션 효과편에서 다룬 코딩을 이여서 실험을 해보도록 하죠.

배경 :

var svg = d3.select("body").append("svg")
    .attr("width", "300") //너비
    .attr("height", "300") //높이
    .style("background-color","blue"); //캔버스 배경색   

빨간원 :

var circle = svg.append("circle")
    .attr("r", 30) //원의 반지름
    .attr("cx", 50) //캔버스 영역의 x좌표
    .attr("cy", 50) //캔버스 영역의 y좌료
    .attr("fill","red") //원의 색

여기서, 순환함수 호출

circle.transition()
        .duration(2000)
        .on("start", move); 

빨간원에서 사용자정의함수인 move()함수를 호출하게 됩니다. move()함수 내 애니메이션 효과 코딩 명령을 수행하게 되는 것이죠.

애니메이션 효과 : 간단히 캔버스 영역을 한바퀴 도는 동작을 수행하는 명령으로 실험을 하겠습니다.

function move() {
  d3.active(this)   //자기자신을 가져오는건데 위를 지칭하겠죠
      .attr("cx", 250) //cx=250으로 이동
     .transition()    
      .attr("cy", 250) //cy=250으로 이동
     .transition()  
      .attr("cx", 50) //cx=50으로 이동
    .transition()
      .attr("cy", 50) //cy=50으로 이동
    .transition()
      .on("start", move); // 한바퀴돌고 난뒤에 다시 move 순환호출하는것인데 이러면 반복되겠죠
}

예전에 만들었던 동작으로 스팀잇 post로 가져왔네요. 한바퀴 돌게 됩니다. 여기서, cx와 cy은 캔버스 영역이고 이 값을 여러분들이 다른 숫자로 바꿔서 실험해 보세요. 어떻게 움직이는지 살펴 보셨으면 해요.

3. 결과


(1) 종합 코딩


<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>

<script src="https://d3js.org/d3.v5.min.js"></script>
  
  <script>

//var width=300, height=300;
var m_cx=250, m_cy=250;
var svg = d3.select("body").append("svg")
    .attr("width", "300")
    .attr("height", "300")
    .style("background-color","blue");    

var circle = svg.append("circle")
    .attr("r", 30)
    .attr("cx", 50)
    .attr("cy", 50)
    .attr("fill","red")
    .transition()
     .duration(2000)
     .on("start", move); 

function move() {
  d3.active(this)   //자기자신을 가져오는건데 위를 지칭하겠죠
      .attr("cx", 250) //cx=250으로 이동
     .transition()    
      .attr("cy", 250) //cy=250으로 이동
     .transition()  
      .attr("cx", 50) //cx=50으로 이동
    .transition()
      .attr("cy", 50) //cy=50으로 이동
    .transition()
      .on("start", move); // 한바퀴돌고 난뒤에 다시 move 순환호출하는것인데 이러면 반복되겠죠
}
</script>
</body>
</html>

(2) 결과



마무리


오늘은 d3.js에서 지난시간에 애니메이션 효과에서 맛보기로 살펴 보았는데 오늘도 맛보기 두번째 시간으로 캔버스 안에 빨간원을 다른 움직임을 만들고 그 움직임을 반복 수행하도록 하기 위해서 on()함수를 살펴보았습니다. 뭔가 간단히 시각화 움직임을 처음에 만들어 내는 모습을 보셔야 D3.js에 흥미를 가질 수 있기 때문에 초반 post에 거론하게 되었네요.

댓글()

[D3.js] 막대형 차트에 애니메이션 효과 부여

D3.js/D3.js|2019. 10. 22. 09:00

[D3.js] 막대형 차트에 애니메이션 효과 부여


지난 시간에 막대형 차트와 간단한 애니메이션 효과를 실험해 보았습니다. 지난 시간에 다룬 내용을 기반으로 두가지 내용을 합쳐서 간단한 실험을 해보도록 하겠습니다. 내용은 막대형 차트를 기본베이스로 하고 이 막대 이미지를 애니메이션 효과를 부여하는 실험입니다.

1. 막대형 차트 예제



<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>codingman</title>    
    <style>
    .chart div {
      font: 10px sans-serif;
      background-color: steelblue;
      text-align: right;
      padding: 3px;
      margin: 1px;
      color: white;
    }
    </style>
  </head>
  <body>
    <div class="chart"></div>
    <script src="https://d3js.org/d3.v5.min.js"></script>
    <script>
      var data = [10, 20, 30, 40, 50];

      d3.select(".chart").selectAll("div").data(data)
        .enter().append("div")
        .style("width", function(d) { return d*10 + "px"; })
        .text(function(d) { return d; });
    </script>    
  </body>
</html>

위 기본소스는 지난시간에 다룬 내용입니다. 위 내용을 모를 경우 [D3.js] 막대형 차트로 보는 D3.js post를 읽고 오시면 됩니다.

[결과]


2. 위 막대형 차트를 애니메이션 효과 부여


       .transition() 
         .duration(2000)  
                 이동좌표;

위 코딩만 사용 합니다. 막대이니간 막대를 2초동안 특정이동좌표로 이동하라는 명령코딩을 내릴 수 있습니다.

막대형 차트와 합쳐서 코딩을 하면 다음과 같습니다.

  <script>
       var data = [10, 20, 30, 40, 50];

      var div = d3.select(".chart").selectAll("div").data(data)
           .enter().append("div")
             .style("width", "0px")
             .transition()   
             .duration(2000)               
             .style("width", function(d) { return d*10 + "px"; })
           .text(function(d) { return d; });
</script>  

위 코딩은 style()함수로 초기 시작위치는 width값을 0px로 하였습니다. 그리도 애니메이션 효과로 데이터 값의 길이만큼 그려지게 표현 했네요.

[결과]


3. 역방향 애니메이션 효과


위에서 왼쪽에서 오른쪽으로 막대가 이동했다면 반대로 이동하는 것을 궁금해 해야 합니다. 그러면 반대의 경우는 어떻게 이동 할까요.

방금 했던 코딩에서 한줄만 제거 하시면 됩니다.

  <script>
       var data = [10, 20, 30, 40, 50];

      var div = d3.select(".chart").selectAll("div").data(data)
           .enter().append("div")
//           .style("width", "0px")
             .transition()   
             .duration(2000)               
               .style("width", function(d) { return d*10 + "px"; })
             .text(function(d) { return d; });
</script>  

시작 위치를 0px로 안하면 됩니다.

[결과]


마무리


오늘은 d3.js에서 막대형 차트와 애니메이션 효과를 합쳐서 표현해 보았습니다.단순히 막대형 차트로만 표현하면 밋밋한 모습이였지만 딱 두줄이 추가함으로 뭔가 있어 보이는 표현이 되었네요.

오늘 내용은 지난시간의 다룬 내용을 합친 실험입니다.

'D3.js > D3.js' 카테고리의 다른 글

[D3.js] HTML의 SVG 태그  (0) 2019.10.24
[D3.js] 애니메이션 효과 순환 동작  (0) 2019.10.23
[D3.js] 애니메이션 효과  (0) 2019.10.21
[D3.js] 막대형 차트로 보는 D3.js  (0) 2019.10.18
[D3.js] Data 실시간 처리  (0) 2019.10.17

댓글()