본문 바로가기

Programming/D3.js

[01. D3.js] 002. D3-Scale

728x90

D3.js의 기본 목적은 데이터를 시각화하는 것인데, D3-Scale은 이 과정에서 데이터 값을 적절한 범위로 변환하는 중요한 역할을 한다. 1~10,000 범위의 데이터를 크기가 100인 차트에 표시하기 위해 scale을 조정한다고 생각하면 이해하기 쉽다. 다양한 방식으로 데이터를 scale할 수 있다.

 

<script src="https://cdn.jsdelivr.net/npm/d3@7"></script>

 

html파일에 위 코드 하나만 추가하면 d3js를 온라인으로 사용할 수 있게 된다.

 

 

Linear scales

선형 scale이다. 예를 들면 1~100의 데이터를 1~5,000 또는 100~1,000 등의 범위로 변환시켜준다.

 

<script>
    const x = d3.scaleLinear().domain([0, 100]).range([0, 500]);
    console.log(x(0), x(100), x(105)); // 0 500 525
    console.log(x.invert(0), x.invert(525)); // 0 105

    const xc = d3.scaleLinear().domain([0, 100]).range([0, 500]).clamp(true);
    console.log(xc(0), xc(100), xc(105)); // 0 500 500
    console.log(xc.invert(0), xc.invert(525)); // 0 100

    const scale = d3.scaleLinear().rangeRound([0, 511]).unknown(999); // range를 설정하고 interpolateRound를 적용
    console.log(scale(0.5)); // 256 (반올림된 결과)
    console.log(scale(NaN)); // 999

    const xn = d3.scaleLinear([0.241079, 0.969679], [0, 960]).nice(40);
    console.log(xn.domain()) // [0.24, 0.98]
</script>

 

x(100)은 domain 100이 range 500에 해당되는 값이라고 알려주고 invert를 사용하면 range에서 domain값을 구할 수 있다.

 

clamp(true)는 scale의 출력 값을 도메인의 최소 및 최대 값으로 제한한다.

rangeRound는 출력된 range값을 반올림해준다.

unknown은 정의되지 않은 값을 입력하면 미리 약속된 값을 출력하게 한다

nice(40)은 domain값을 좀 더 읽기 쉽게 조정해준다. 그리고 40은 domain의 간격 수를 조절해서 40으로 나누어지도록 한다.

 

 

Time scales

시간을 scale해준다. 시계열 차트에 유용하게 쓰일 수 있다.

 

<script>
    const x = d3.scaleTime([new Date(2000, 0, 1), new Date(2000, 0, 2)], [0, 960]);
    console.log(x(new Date(2000, 0, 1, 5))); // 200
    console.log(x(new Date(2000, 0, 1, 16))); // 640
    console.log(x.invert(200)); // Sat Jan 01 2000 05:00:00 GMT+0900 (한국 표준시)
    console.log(x.invert(640)); // Sat Jan 01 2000 16:00:00 GMT+0900 (한국 표준시)

    const xu = d3.scaleUtc([new Date("2000-01-01"), new Date("2000-01-02")], [0, 960]);
    console.log(xu(new Date("2000-01-01T05:00Z"))); // 200
    console.log(xu(new Date("2000-01-01T16:00Z"))); // 640
    console.log(xu.invert(200)); // Sat Jan 01 2000 14:00:00 GMT+0900 (한국 표준시)
    console.log(xu.invert(640)); // Sun Jan 02 2000 01:00:00 GMT+0900 (한국 표준시)

    const xz = d3.scaleUtc().domain([new Date("2000-01-01T12:34Z"), new Date("2000-01-01T12:59Z")]).nice();
    console.log(xz.domain()); // ['2000 Jan 01 12 AM', '2000 Jan 01 06 AM', '2000 Jan 01 12 PM', '2000 Jan 01 06 PM', '2000 Jan 02 12 AM']
</script>

 

2000년 1월 1일 ~ 1월 2일까지의 범위를 0~960으로 scale해준다. nice()도 사용가능하다.

 

 

Pow scales

지수함수를 적용한 scale이다. 지수 값에 의해 값을 계산하고 계산된 값을 range에 맞춰 출력한다.

 

<script>
    const scale = d3.scalePow()
                    .exponent(2)
                    .domain([0, 10])
                    .range([0, 50]);

    console.log(scale(5)); // 12.5
    console.log(scale(10)); // 50
</script>

 

 

Log scales

로그함수를 적용한 scale이다. 기본적으로 로그 밑(base)는 10이나 다른 밑을 사용할 수 있다. Log 역시 nice()도 사용가능하다.

 

<script>
    const xl = d3.scaleLog([1, 10], [0, 960]);
    const xlb = d3.scaleLog([1, 1024], [0, 960]).base(2);
    console.log(xl(5)); // 671.011204162578
    console.log(xlb(500)); // 860.7152913275603

    const x = d3.scaleLog([0.201479, 0.996679], [0, 960]).nice();
    console.log(x.domain()); // [0.1, 1]
</script>

 

 

Ordinal scales

불연속적인 domain과 range간의 변환을 해주는 scale이다.

 

<script>
    const color = d3.scaleOrdinal(["a", "b", "c"], ["red", "green", "blue"]);
    console.log(color('a')); // red
    console.log(color('b')); // green
</script>

 

a,b,c 순서대로 각각 red, green, blue로 변환된다.

 

 

Band scales

Band는 막대그래프를 그릴 때 유용하다. 예시를 보면 한 눈에 이해가 갈 것이다.

 

<script>
    const x = d3.scaleBand([0, 960]).domain(["a", "b", "c", "d"]);
    console.log(x("b")); // 240
    console.log(x("c")); // 480
</script>

 

 

domain이 늘어날수록 밴드의 위치가 조정된다.

 

 

Point scales

Band scales에서 Bandwidth가 0인 버전이다.

 

<script>
    const x = d3.scalePoint(["a", "b", "c"], [0, 960]);
    console.log(x("a")); // 0
    console.log(x("b")); // 480
    console.log(x("c")); // 960
    console.log(x("d")); // undefined
</script>

 

 

 

Quantile scales

데이터 값을 특정 수의 구간(quantile)으로 나누어 매핑하는데 사용된다. 이 scale은 입력 데이터의 분포를 기준으로 구간을 나누고, 각 구간에 해당하는 출력 값을 할당한다. 이는 데이터가 고르게 분포되지 않았을 때 유용하며, 데이터의 상대적인 순위를 기준으로 시각화를 하고자 할 때 자주 사용된다.

 

<script>
    const scale = d3.scaleQuantile()
                    .domain([0, 100, 500, 1000])  // 입력 값의 범위 설정 (다양한 값 포함)
               	    .range([0, 1, 2, 3]);  // 출력 값의 범위 설정

    console.log(scale.quantiles()) // [75, 300, 625]
    console.log(scale(50));  // 결과: 0 (첫 번째 구간)
    console.log(scale(200)); // 결과: 1 (두 번째 구간)
    console.log(scale(600)); // 결과: 2 (세 번째 구간)
    console.log(scale(1000)); // 결과: 3 (네 번째 구간)
</script>

 

지금까지 scale에 대해 알아보았다. 이외에 다양한 scale 및 함수들이 존재한다. 더 많은 정보를 알고 싶다면 공식사이트(https://d3js.org/d3-scale)를 방문해 보도록 하자.

728x90

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

[01. D3.js] 004. D3-Selection  (0) 2025.02.06
[01. D3.js] 003. D3-Axis  (0) 2024.10.02
[01. D3.js] 001. D3.js란  (0) 2024.07.14