데이터분석/d3.js

<D3.js> 가로막대 그래프 그리기(4) x축 눈금 표시

창조적생각 2022. 6. 26. 22:42

  x축과 눈금을 그리기 위해서 알아야할 D3 메서드는 scaleLinear(), axisBottom() 입니다.

scaleLinear()는 숫자로 표현된 선형으로 된 눈금을 생성합니다.

.domain() 과 .range()로 출력 범위를 정해줍니다.

var xScale = d3.scaleLinear()
.domain([0,500])
.range([0,500])

현재 가로막대그래프가 500이하의 값들로 이뤄져있기에 .domain([0,500])으로 0~500 사이의 값을 데이터의 범위로 설정합니다.

range()는 domain을 표시하는 눈금의 범위입니다.

그리고 range([0,500])으로 1:1로 대응하게 출력합니다.

 

 

axisBottom()은 그래프 아래에 축을 넣을 때 사용하는 메서드입니다.

축을 위로 올리려면 axisTop()

왼쪽은 axisLeft()

오른쪽 axisRight()를 사용해주면 됩니다.

.call(d3.axisBottom(xScale))

작성한 x축과 눈금을 화면에 표시하려면 기존의 SVG에 "g" 요소를 통해서 추가해줘야 합니다.

스타일 시트에서 g 요소의 x축과 눈금의 스타일을 지정하기 위해 attr("class","axis")로 클래스를 지정해줍니다.

 

눈금들 사이의 거리는 transform 속성으로 조절합니다.

translate(x,y)는 x방향으로 x만큼, y방향으로 y만큼 이동하라는 코드입니다.

d3.select("#myGraph")
.append("g")
.attr("class","axis")
.attr("transform","translate(10,"+((1+dataSet.length)*20+5)+")")
.call(d3.axisBottom(xScale))

위의 요소들을 합치면 x축과 눈금을 그릴 수 있습니다.

var xScale = d3.scaleLinear()
.domain([0,500])
.range([0,500])
d3.select("#myGraph")
.append("g")
.attr("class","axis")
.attr("transform","translate(10,"+((1+dataSet.length)*20+5)+")")
.call(d3.axisBottom(xScale))

 

 

이전에 만들었던 막대그래프와 합쳐보면

 

test.html

<!DOCTYPE html>
<html>
    <head>
        <style>
        svg{
            width: 500px; height: 150px; border:1px solid black;
        }
        #myGraph rect{
            stroke : rgb(0, 100, 0);
            stroke-width: 1px;
            fill:rgb(0, 160, 0)
        }
        .axis text{
            font-family: sans-serif;
            font-size: 12px;
        }
        .axis path,.axis line{
            fill:none;
            stroke: black;
        }
        </style>
        <script src="https://d3js.org/d3.v7.min.js" charset="utf-8"></script>
        
    </head>
<body>
    <h1>가로형 막대그래프</h1>
    <button id = "update">업데이트</button>
    <br>
    <svg id="myGraph">
       
    </svg>
    <script src="auto.js"></script>
    <br/>
    
</body>   
  

</html>

 

auto.js

var dataSet = [400,200,90,190,240];

d3.select("#myGraph") //svg 요소 선택
.selectAll("rect")
.data(dataSet)
.enter()
.append("rect")
.attr("x",0)
.attr("y",function(d,i){
    return i * 25;
})
.attr("width",function(d,i){
    return d + "px";
})
.attr("height","20px")

d3.select("#update")
.on("click",function(){
    for(var i = 0; i < dataSet.length;i++){
        dataSet[i] = Math.floor(Math.random()*400);
    }

d3.select("#myGraph")
.selectAll("rect")
.data(dataSet)
.transition()
.delay(function(d,i){return i*500;})
.duration(2500)
.attr("width",function(d,i){
    return d + "px";
})
})

var xScale = d3.scaleLinear()
.domain([0,500])
.range([0,500])
d3.select("#myGraph")
.append("g")
.attr("class","axis")
.attr("transform","translate(10,"+((1+dataSet.length)*20+5)+")")
.call(d3.axisBottom(xScale))

<실행결과>

가로형 막대그래프



 

728x90