Post

D3.js 시작하기 (기초)

D3.js 시작하기 (기초)

D3.js란?

D3.js(Data-Driven Documents)는 웹 브라우저에서 데이터를 시각화하기 위한 자바스크립트 라이브러리다. HTML, SVG, CSS를 사용해 데이터를 시각적으로 표현하며, 강력한 시각화 컴포넌트들을 제공한다.

주요 특징:

  • 웹 표준 기술 사용 (HTML, SVG, CSS)
  • 유연한 데이터 바인딩
  • 다양한 상호작용 구현 가능
  • 애니메이션 지원

D3.js 기본 문법

1. 선택과 수정 (Selection)

D3.js는 CSS 선택자를 사용하여 DOM 요소를 선택하고 수정한다.

1
2
3
4
5
6
7
8
9
10
11
12
// 요소 선택하기
d3.select('#chart')      // id로 선택
d3.selectAll('.bar')     // class로 선택

// 속성 설정
d3.select('#chart')
    .attr('width', 500)   // 속성 설정
    .style('color', 'red')// 스타일 설정

// 콘텐츠 수정
d3.select('text')
    .text('Hello D3!')    // 텍스트 내용 변경

2. 메서드 체이닝

D3.js는 메서드 체이닝 패턴을 사용한다. 각 메서드는 선택된 요소를 반환하므로 연속적으로 메서드를 호출할 수 있다.

1
2
3
4
5
d3.select('#chart')
    .append('svg')        // SVG 요소 추가
    .attr('width', 500)   // 너비 설정
    .attr('height', 300)  // 높이 설정
    .style('background', '#f0f0f0'); // 배경색 설정

개발 환경 설정

1. HTML 파일 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>D3.js 시작하기</title>
    <!-- D3.js 라이브러리 추가 -->
    <script src="https://d3js.org/d3.v7.min.js"></script>
</head>
<body>
    <!-- 시각화를 위한 컨테이너 -->
    <div id="chart"></div>
    <script src="app.js"></script>
</body>
</html>

2. JavaScript 파일 생성 (app.js)

1
2
3
4
5
6
7
8
// D3.js 버전 확인
console.log('D3 Version:', d3.version);

// 기본 SVG 컨테이너 생성
const svg = d3.select('#chart')
    .append('svg')
    .attr('width', 600)
    .attr('height', 400);

SVG 기초

SVG 요소의 기본 속성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// rect (사각형) 요소의 주요 속성
svg.append('rect')
    .attr('x', 50)        // x 좌표
    .attr('y', 50)        // y 좌표
    .attr('width', 100)   // 너비
    .attr('height', 100)  // 높이
    .style('fill', 'steelblue')    // 채우기 색상
    .style('stroke', 'black')      // 테두리 색상
    .style('stroke-width', 2);     // 테두리 두께

// circle (원) 요소의 주요 속성
svg.append('circle')
    .attr('cx', 250)      // 중심 x 좌표
    .attr('cy', 100)      // 중심 y 좌표
    .attr('r', 50)        // 반지름
    .style('fill', 'coral');

// line (선) 요소의 주요 속성
svg.append('line')
    .attr('x1', 0)        // 시작점 x 좌표
    .attr('y1', 0)        // 시작점 y 좌표
    .attr('x2', 100)      // 끝점 x 좌표
    .attr('y2', 100)      // 끝점 y 좌표
    .style('stroke', 'black');     // 선 색상

데이터 바인딩

D3.js의 데이터 바인딩은 데이터 배열의 각 항목을 DOM 요소와 연결하는 과정이다.

1. 기본 데이터 바인딩

1
2
3
4
5
6
7
8
9
const data = [10, 20, 30, 40, 50];

// 데이터 바인딩의 기본 패턴
svg.selectAll('circle')   // 아직 존재하지 않는 circle 요소들을 선택
    .data(data)          // 데이터 배열을 바인딩
    .join('circle')      // circle 요소 생성 및 업데이트
    .attr('cx', (d, i) => i * 100 + 50)  // d: 데이터값, i: 인덱스
    .attr('cy', 200)
    .attr('r', d => d)   // 데이터값을 반지름으로 사용

2. enter, update, exit 패턴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 상세한 데이터 바인딩 패턴
const circles = svg.selectAll('circle')
    .data(data);

// enter: 새로운 데이터에 대한 처리
const enterCircles = circles.enter()
    .append('circle')
    .attr('cx', (d, i) => i * 100 + 50)
    .attr('cy', 200)
    .attr('r', d => d);

// update: 기존 데이터 업데이트
circles
    .attr('r', d => d)
    .style('fill', 'blue');

// exit: 제거될 요소 처리
circles.exit()
    .style('fill', 'red')
    .transition()
    .duration(1000)
    .remove();

실습: 데이터가 있는 막대 그래프 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 데이터 준비
const data = [
    {name: 'A', value: 10},
    {name: 'B', value: 20},
    {name: 'C', value: 15},
    {name: 'D', value: 25}
];

// SVG 컨테이너 생성
const width = 600;
const height = 400;
const margin = {top: 20, right: 20, bottom: 30, left: 40};

const svg = d3.select('#chart')
    .append('svg')
    .attr('width', width)
    .attr('height', height);

// 막대 그래프 그리기
const bars = svg.selectAll('rect')
    .data(data)
    .join('rect')
    // 각 속성에 대한 설명
    .attr('x', (d, i) => i * 100 + margin.left)  // 막대 x위치
    .attr('y', d => height - margin.bottom - d.value * 10)  // 막대 y위치
    .attr('width', 80)  // 막대 너비
    .attr('height', d => d.value * 10)  // 막대 높이
    .style('fill', 'steelblue');  // 막대 색상

// 레이블 추가
svg.selectAll('text')
    .data(data)
    .join('text')
    .text(d => d.name)
    .attr('x', (d, i) => i * 100 + margin.left + 40)
    .attr('y', height - margin.bottom + 20)
    .style('text-anchor', 'middle');
This post is licensed under CC BY 4.0 by the author.