웹 개발 공부

Angular 공부 ( D3.js )

지금해냥 2023. 1. 11. 14:01

0. D3.js

- D3.js는 데이터를 기반으로 문서를 조작하기 위한 JavaScript 라이브러리

- HTML, SVG 및 CSS를 사용하여 데이터에 생명을 불어넣도록 도와줌

- D3는 강력한 시각화 구성 요소와 DOM 조작에 대한 데이터 중심 접근 방식을 결합하여 브라우저의 모든 기능을 제공

- D3를 사용하면 임의의 데이터를 DOM(문서 개체 모델)에 바인딩한 다음 데이터 기반 변환을 문서에 적용 가능

 

1. D3 개발환경 세팅

1-1. 공식사이트 설치

- 공식사이트 링크에서 설치하여 폴더에 첨부

- 공식사이트 : https://d3js.org/

 

D3.js - Data-Driven Documents

D3 is a JavaScript library for visualizing data with HTML, SVG, and CSS.

d3js.org

 

1-2. CDN 방식

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

- 해당 스크립트 문구를 작성

 

1-3. npm 설치

npm install d3
npm i --save-dev @types/d3
npm install d3-axis

- npm 명령어를 이용하여 설치

 

2. D3 기본 문법

● d3.select – 특정 태그 하나를 선택한다.

● d3.selectAll – 특정 태그 전체를 선택한다.

● selection.attr – 선택 태그의 속성값 지정한다.

● selection.data – 집어넣을 즉 차트에 사용할 데이터를 가져온다.

● selection.enter – 데이터 개수만큼 태그가 부족할 시에 추가한다.

                               (ex 데이터가 5개, p태그가 3개일시 데이터 개수에 맞게 p태그 2개를 더 추가한다.)

● selection.exit– 데이터 개수보다 태그가 많을 시에 제거한다.

                               (ex 데이터가 5개, p태그가 3개일시 데이터 개수에 맞게 p태그 2개를 더 추가한다.)

● selection.append – 새로운 태그를 추가한다.

● selection.remove– 새로운 태그를 제거한다.

 

- 추가 문법 참조 : https://github.com/zziuni/d3/wiki/API-Reference

 

GitHub - zziuni/d3: D3.js API Doc Translated to korean.

D3.js API Doc Translated to korean. . Contribute to zziuni/d3 development by creating an account on GitHub.

github.com

 

3. 간단한 도형그리기

⚫기본세팅 

const canvas = d3.select('.canvas');

const svg = canvas.append('svg') //추가
   .attr('height', 1000) // 속성 지정
   .attr('width', 1000);

 

- HTML 태그 요소 받아와 svg 태그 생성

 

⚫텍스트 ( text )

svg.append('text') // 추가, text 형태로 추가
   .attr('x', 200)
   .attr('y', 200) // 좌측 하단 기준 좌표
   .text('hello world')
   .style('font-weight', 'bold')
   .style('font-size', '34px')
   .style('font-family', 'Pacifico');

- .append('text').attr('x',좌표).attr('y', 좌표).text(문구).style('옵션','값')

- 해당 태그 내부에 좌표값에 따른 텍스트 생성

 

⚫선 ( line )

svg.append('line')
   .attr('x1', 200) // x축 시작
   .attr('y1', 200) // y축 시작
   .attr('x2', 300) // x축 끝
   .attr('y2', 300) // y축 끝
   .attr('stroke', 'red');

- .append('line').attr('x1',좌표).attr('y1', 좌표).attr('x2',좌표).attr('y2', 좌표).attr('stroke','색상')

- 시작점과 끝점을 연결하는 라인 생성

- 시작점 ( x1, y1 ), 끝점 ( x2, y2 ) 좌표 연결

- stroke 는 선 색상

- stroke-width 는 선 굵 

 

⚫사각형 ( rect )

svg.append('rect') // 추가, 사각형 형태로 추가
   .attr('x', 200)
   .attr('y', 200)
   .attr('width', 200)
   .attr('height', 200)
   .attr('fill', 'hotpink');

- .append('line').attr('x',좌표).attr('y', 좌표).attr('width',가로크기).attr('height', 세로크기).attr('fill','색상')

- x,y좌표를 기준으로 사각형 생성

- width는 가로크기, height는 세로 크기

- fill은 채우는 색상

- stroke 적용 가능

 

⚫원 ( circle )

svg.append('circle') // 추가, 원 형태로 추가
            .attr('cx', 200) // x 축
            .attr('cy', 200) // y 축
            .attr('r', 50)
            .attr('fill', 'blue');

- .append('line').attr('cx',좌표).attr('cy', 좌표).attr('r',반지름).attr('fill','색상')

- 중심좌표 ( cx, cy )를 기준으로 반지름 r인 원 생성

- fill은 채우는 색상

- stroke 적용 가능

 

4.SVG

4-1. SVG란?

- 확장 가능한 벡터 그래픽 (scalable vector graphics)으로 XML 기반 2차원 그래픽

- HTML 태그의 집합으로 css와 javascript로 컨트롤 가능

 

4-2. SVG의 장점

- 아무리 확대를 해도 이미지가 깨지지않음

- 이미지의 크기를 키워도 용량이 늘어나지 않음

 

4-3. SVG의 단점

- 코드로 이루어진 이미지이기 때문에 복잡한 이미지일수록 파일 사이즈가 커짐

- 단순한 모양일수록 효율이 좋음

- 복잡한 이미지를 굳이 svg로 표현하고자 하면 오히려 용량이 너무 거대해져 역효과가 날 수 있음

- 단순한 아이콘, 로고, 도형 등을 구현할 때 많이 사용

 

▶ PNG ↔ SVG 변환 사이트 : https://convertio.co/kr/png-svg/

 

PNG SVG 변환 (온라인 무료) — Convertio

png 파일(들) 업로드 컴퓨터, Google Drive, Dropbox, URL에서 선택하거나 이 페이지에서 드래그하여 선택해 주세요.

convertio.co

 

5. 데이터 로드 ( csv, tsv, json, xml )

- csv : Comma-Separated Value

- tsv : Tap-Separated Value

파일 명령어
csv d3.csv('경로')
tsv d3.tsv('경로')
json d3.json('경로')
xml d3.xml('경로')

- angular에서 사용할 때 경로를 적으면 연결된 url주소로 이동

- 따라서 assets폴더에 넣어주고 경로 지정하면 url이 아닌 파일 경로로 호출

 

// 프로미스 형식으로 나옴
console.log(d3.json("/assets/data/data.json"))

//then, catch 구문을 이용하여 사용
d3.json("/assets/data/data.json")
  .then(data=> {
            console.log(data)
        });
   .catch(err => {
             console.log(err)
        });

- promise 형식으로 데이터 값을 불러오기 때문에 then, catch 구문을 이용하여 데이터 사용 

 

6. 데이터 컨트롤

  - domain : 데이터 값의 범위

  - range : 화면 출력 값의 범위

6-1. scalePoint()

  - 간격에 맞게 값을 변경

// range는 전체 width
// domain의 전체 count를 range 값으로 '동일하게' 분할하여 분배
const f1 = d3.scalePoint().range([0, 100]).domain([10, 12, 20, 30, 40])
console.log(f1(40))

const f2 = d3.scalePoint().range([0, 100]).domain(['a', 'b', 'c', 'd'])
console.log(f2('c'))

// padding이 붙었을 경우 각 요소의 간격에 padding을 곱하여 양쪽 여백으로 줌
const f3 = d3.scalePoint().range([0, 100]).domain(['a', 'b', 'c', 'd']).padding(0.3)
console.log(f3('d'))

const f4 = d3.scalePoint().range([100, 200]).domain(['a', 'b', 'c', 'd'])
console.log(f4('b'))

6-2. scaleLinear()

  - 비율에 맞게 값을 변경

const f1 = d3.scaleLinear().range([0, 100]).domain([0, 500])
        console.log(f1(250))
        console.log(f1(0))
        console.log(f1(500))
        console.log(f1(100))
        console.log(f1(1000))

        crayons = d3.scaleLinear()
        .domain([-1, 0, 1])
        .range(["orange", "white", "green"])
        console.log(crayons(0.3))

6-3. scaleBand()

  -  숫자가 아니라 키 값으로 할당

const f = d3.scaleBand().domain(["one", "two", "three", "four"]).range([0, 100])
        console.log(f('one'));
        console.log(f('two'));
        console.log(f('three'));

6-4. scaleTime()

  -  시간에 맞게 값을 변경

const f1 = d3.scaleTime().domain([Date.now(), Date.now() + 24 * 60 * 60 * 1000])

 

참조 :

D3.js : https://d3js.org/

 

D3.js - Data-Driven Documents

D3 is a JavaScript library for visualizing data with HTML, SVG, and CSS.

d3js.org

공식 Github :  https://github.com/zziuni/d3/wiki

 

GitHub - zziuni/d3: D3.js API Doc Translated to korean.

D3.js API Doc Translated to korean. . Contribute to zziuni/d3 development by creating an account on GitHub.

github.com

한국어 번역 Github : https://github.com/d3/d3/blob/main/API.md

 

GitHub - d3/d3: Bring data to life with SVG, Canvas and HTML.

Bring data to life with SVG, Canvas and HTML. :bar_chart::chart_with_upwards_trend::tada: - GitHub - d3/d3: Bring data to life with SVG, Canvas and HTML.

github.com

API전체 : https://runebook.dev/ko/docs/d3/d3-array

 

D3.js - d3-array JavaScript의 데이터는 종종 iterable(배열, 집합 또는 생성기 등)로 표현되며 시각화 분

JavaScript의 데이터는 종종 iterable (예 : array , set 또는 generator )로 표시되므로 데이터를 분석하거나 시각화 할 때 반복 가능한 조작이 일반적인 작업입니다. 예를 들어 배열의 연속 슬라이스 (하위

runebook.dev

 

D3 강의 : https://www.inflearn.com/course/%EC%A7%80%EA%B8%88%EB%B0%94%EB%A1%9C-d3/dashboard

 

지금 바로 D3.js 시작하기 : 웹 데이터 시각화 - 인프런 | 강의

🤔 D3를 공부하고 싶지만 너무 어려워 고민하셨나요?? 지금 바로! 이 강의로 D3에 대한 기본 개념과 활용법을 익혀 쉽고 빠르게 나만의 시각화 결과물을 만들어보세요, - 강의 소개 | 인프런...

www.inflearn.com

블로그 : https://cyberx.tistory.com/211

 

D3.js를 이용하여 웹차트 만들기1 – 개념 및 예제

D3.js란? 안녕하세요. 자바스크립트 라이브러리 중 하나인 D3.js에 대해서 소개해드리려고 합니다. D3.js란 자바스크립트 라이브러리를 처음 들어보신 분도 또는 자주 사용해보셨던 분들도 계시겠

cyberx.tistory.com

 

LIST