Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

테스트 환경

내 사이트(JoinC)에서 테스트를 진행했다. 사이트 환경은 다음과 같다.
  • Apache 2.2.10
  • PHP 5
  • Moniwiki 1.5

D3 설정

먼저 d3 javascript를 다운로드 받아서 설치해야 한다. d3js.org에서 최신 버전을 다운로드 받았다. 2013년 5월 현재 최신버전은 3.1.9다.
  • Root Directory : /var/www/moniwiki
  • d3.js : /var/www/moniwiki/local
    # cd /var/www/moniwiki/local 
    # wget http://d3js.org/d3.v3.zip
앞축을 풀고나서 다음과 같은 코드를 HTML 문서에 삽입하는 것으로 준비완료.
<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type='text/javascript' src='/modules/moniwiki/local/d3.v3.min.js'></script>
</head>

엘리먼트 추가

d3는 SVG 기반의 툴이긴 하지만, 다른 DOM 엘리먼트들도 제어할 수 있다. d3를 이용해서 엘리먼트를 추가하는 간단한 예제다.
<div id="test_01"></div>
<script>
d3.select("#test_01").append("li").text("Perl")
d3.select("#test_01").append("li").text("Cpp")
d3.select("#test_01").append("li").text("Ruby")
</script>

아래는 실행 결과다.

데이터 연동

Data Driven Documents라는 취지에 맞게, 데이터를 연동해보도록 한다. 간단하게 로컬변수로 데이터를 정의한 다음, 이 데이터를 출력하는 예제다.
<div id="test_02"></div>
<script>
var dataset = ["Perl", "Cpp", "Ruby", "Python"] ;
d3.select('#test_02').selectAll('li')
  .data(dataset)
  .enter()
  .append('li')
  .text(function(d) { return d; });
</script>
  • dataset : 출력을 위한 데이터를 정의했다.
  • select : select는 CSS 셀렉터로 매칭되는 첫번째 DOM 엘리먼트를 가져온다. selectAll을 이용해서 하나이상의 앨리먼트를 선택할 수 있다.
  • data : Driven할 데이터를 가져온다.
  • append : 새로운 DOM 엘리먼트를 추가한다.
  • text : 현재 선택된 엘리먼트의 opening 태그와 closing 태그사이에 텍스트를 추가한다.
예제에서 나는 anonymous function을 만들었다. 이 함수의의 매개변수 d로 data의 값들이 들어간다. 따라서 이 anonymous function은 dtaset에 있는 값들을 return 한다.

아래는 출력 결과다.

div로 그래프 그리기

div를 이용해서 그래프를 그려보려한다. 2000년 초반 HTML가지고 장난칠 때 Table을 제어하는 방법과 함께 사용했던 방법이다. 어떤 식으로 DOM 엘리먼트를 제어하는지를 확인하는데 의의를 두자.

<style>
div.bar {
    display: inline-block;
    width: 20px;
    height: 75px;   /* We'll override this later */
    background-color: teal;
}
</style>
<div id="test_03"></div>
<script>
var dataset = [50, 40, 70, 30, 60, 80, 120, 100];
d3.select('#test_03').selectAll('div')
  .data(dataset)
  .enter()
  .append('div')
  .attr('class', 'bar')
  .style('height', function(d) {
    return d + 'px';
  });
</script>
  • 테스트에 사용할 데이터셋을 마련했다.
  • div css를 정의한다.
  • style를 이용해서 div의 height를 dataset의 값으로 변경한다.
실행 결과는 아래와 같다.

그럭저럭 괜찮게 나오기는 하는 것 같은데, 뭔가 좀 어색하다. 그래서 css를 변경하고
margin-right: 2px;  

그래프의 스케일을 조정했다.
  .style('height', function(d) {
    return (d * 5) + 'px';
  });

랜덤 데이터를 이용해서 좀더 많은 데이터를 표현했다.
<script>
var dataset = [50, 40, 70, 30, 60, 80, 120, 100];
for (var i = 0; i < 25; i++) {
  var randNum = Math.random() * 30
  dataset.push(randNum);
}
d3.select('#test_05').selectAll('div')
  .data(dataset)
  .enter()
  .append('div')
  .attr('class', 'bar2')
  .style('height', function(d) {
    return (d * 2) + 'px';
  });
</script>

디버깅

크롬브라우저의 console 도구를 이용해서, 자바스크립트 코드를 디버깅할 수 있다.

https://lh6.googleusercontent.com/-fA3aiYphIwU/UZ429AzL0XI/AAAAAAAADE4/cQRm37eRSTg/s640/chrom_console01.png

참고

  • http://alignedleft.com/tutorials/d3/