[D3.js] 버전에 따른 사라진 함수 복원

D3.js/D3.js|2019. 10. 29. 09:00

[D3.js] 버전에 따른 사라진 함수 복원


예전에 처음 D3.js를 공부할 때 제일 애먹은 부분이 버전 별 함수가 변경 되거나 또는 사리지는 함수들 때문에 유튜브 동영상 강좌를 보면서 현재 버전을 공부할 때 에러와의 싸움에서 무지 답답하고 귀찮았습니다. 오늘 다루는 사라진 함수를 사용하고 싶을 때 복원하는 방법을 다루고자 합니다.

1. d3.svg.diagonal() 함수


V3 버전에서 사용되는 함수인데 V4버전에서는 사라진 함수입니다. 이 함수를 사용하면 V4버전 부터는 에러가 뜹니다. 물론 V5버전에서 에러가 뜨겠죠. 이 곡선과 유사한 곡선을 물론 V4버전에서 제공되는데 이 곡선함수를 사용하고 싶을 때에는 V3버전을 링크 걸어서 사용해야 합니다.

하지만, 꼭 링크를 걸어서 사용할 필요는 없습니다. d3.js를 공부하시는 분들이라면 이 함수를 복원하고 싶은 충동을 느끼신다면 한번 직접 만들어 봐야 겠죠.

우선 V3 버전으로 곡선을 그려 보고 분석 해보도록 하죠.

V3버전 d3.svg.diagonal() 함수 사용 :

<svg height="300" width="300" style="background: yellow">
</svg>

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

<script>
var diagonal = d3.svg.diagonal()
      .source({x:10,y:10})
      .target({x:290,y:290});
var path = d3.select("svg").append("path")
      .attr("fill","none")
      .attr("stroke","#0000ff")
      .attr("stroke-width","1.5px")
      .attr("d",diagonal);
</script>

[결과]


위 결과는 V3버전에서 사용할 경우에 한해서 결과가 출력합니다. V4버전 이후 부터는 사용 할 수 없습니다.

2. d3.svg.diagonal() 함수 곡선 분석


이 함수를 복원하기 위해서는 HTML 문서 상에서 어떤 코딩으로 곡선이 그려지는지 분석해야 합니다.

한번 위 예제소스를 실행시켜서 나온 결과에 오른쪽 마우스 버턴을 클릭하여 소스창보기를 할까요.

<path d="M10,10C10,150 290,150 290,290" stroke-width="1.5px" stroke="#0000ff" fill="none"></path>

위의 HTML 코딩 소스를 보시는 것과 같이 path태그속에서 M10,10에서 시작하여 숫자들이 나열되고 290,290지점으로 끝나게 됩니다. 뭔지는 모르지만 path 태그에서 d속성값을 위 숫자대로 대입하면 결과 이미지 처럼 나오게 됩니다.

정리를 하면,

diagonal = d3.svg.diagonal()
      .source({x:10,y:10})
      .target({x:290,y:290});

위 기준으로 시작하고 path 부분만 만들어 주면 됩니다. 그러면 패치 경로는 아래 HTML문서상의 코딩처럼 나오게 코딩해야 겠죠.

 <path d="M10,10C10,150 290,150 290,290" stroke-width="1.5px" stroke="#0000ff" fill="none"></path></svg>

위 path 경로의 d값만 코딩으로 표현하면 되는데 이 부분을 함수로 만들어 보겠습니다.

3. d3.svg.diagonal() 함수 만들기


 <path d="M10,10C10,150 290,150 290,290" stroke-width="1.5px" stroke="#0000ff" fill="none"></path></svg>

위 코딩 부분을 잘 풀어서 정리하면 아래와 같이 코딩 할 수 있습니다.

d =  "M"+source.x+","+ source.y+"C"+source.x+","+(target.y-140)+
    " "+target.x+","+(target.y-140)+ " " +target.x+","+target.y ;

이 부분을 함수로 만들어 정리하면,

function diagonaltest(){
  return "M"+source.x+","+ source.y+"C"+source.x+","+(target.y-140)+
    " "+target.x+","+(target.y-140)+ " " +target.x+","+target.y ;
}

이 코딩은 제 블로그에 예전에 공부할 때 정리한 코딩입니다.

4. d3.svg.diagonal()함수를 diagonaltest()함수로 변경


<svg height="300" width="300" style="background: yellow">
</svg>

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

<script>
var source = {x:10,y:10};
var target = {x:290,y:290};
var path = d3.select("svg").append("path")
    .attr("fill","none")
    .attr("stroke","#0000ff")
    .attr("stroke-width","1.5px")
    .attr("d",diagonaltest);

function diagonaltest(){
  return "M"+source.x+","+ source.y+"C"+source.x+","+(target.y-140)+
    " "+target.x+","+(target.y-140)+ " " +target.x+","+target.y ;
}
</script>

[결과]


마무리


대충 사라진 함수를 복원한 실험을 하였습니다.사실 예전에 D3.js를 처음 공부 할 때잠깐 실험했네 내용인데 스팀잇 공간에 소개하고 싶어서 post을 올립니다. 사실 사라진 함수는 새로운 함수가 나왔기 때문에 사라졌고 그 새로운 함수를 쓰면 좋지만 d3.js를 공부한다면 이 부분을 직접 복원해 보는 공부도 해보는 것이 좋을 것 같아서 이번 post의 주제로 정했네요.

사실 주말에 다른 일 때문에 post 연재가 막힐 것 같아서 예전에 실험한 내용을 기반으로 다시 정리를 했네요.

오늘 실험한 내용은 우선 과거 버전으로 코딩해서 나온 HTML의 결과 소스를 보고 분석하여 복원 함수를 만들었는데 여러분들도 과거버전 중 사라진 함수가 있다면 그 함수를 이런식으로 HTML 소스를 분석하여 직접 만들어 보셨으면 합니다.

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

[D3.js] TSV 파일 읽는법  (0) 2019.10.31
[D3.js] CSV 파일 읽는법  (0) 2019.10.30
[D3.js] HTML의 CSS  (0) 2019.10.28
[D3.js] HTML의 SVG 태그 D3로 코딩  (0) 2019.10.25
[D3.js] HTML의 SVG 태그  (0) 2019.10.24

댓글()

[D3.js] HTML의 SVG 태그 D3로 코딩

D3.js/D3.js|2019. 10. 25. 09:00

[D3.js] HTML의 SVG 태그 D3로 코딩


지난 시간에는 HTML SVG 그리기 태그들을 이용하여 기본 태그와 속성들을 살펴 보았습니다. 이제는 D3.js 함수들을 사용하여 지난 시간의 배운 태그들을 표현을 해보는 시간을 갖도록 하겠습니다.

1. SVG 태그


<svg width="300" height="300"></svg>

D3.js로 표현하면 다음과 같습니다.

<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var svg = d3.select("body").append("svg")
     .attr("width", "300")
     .attr("height", "300")
     .style("background-color","blue");
</script>

attr()함수로 태그의 속성값을 지정하고 style()함수로 태그의 스타일을 지정해 줍니다.

여기서 몇개 안되는 속성 지정은 그냥 attr()함수나 style()함수로 일일히 지정해 주면 되지만 속성과 스타일의 지정 갯수가 많을 경우는 반복 코딩으로 꽤 귀찮은 코딩이 되겠죠.

이부분에 대해서 살펴보니깐 다음과 같이 수정하면 되더군요.

<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var svg = d3.select("body").append("svg")
     .attrs({ width: 300, height: 300 })
     .style("background-color","yellow");
</script>

attrs()함수로 해서 여러개의 속성을 한번에 지정 할 수 있습니다.

2. 사각형 태그


기본 이미지 모양 태그 rect, circle, line, path, ellipse, polyline 등을 사용하여 그림을 그리게 되는데 그중 rect(사각형)을 D3.js로 어떻게 코딩되는지 살펴보도록 하죠.

위 SVG 코딩의 연장 선상에서 보시기 바랍니다.

var rect = svg.append("rect")  
   .attr("x","10")
   .attr("y","10")
   .attr("width","100")<center>![](https://i.imgur.com/gQiSnv4.jpg)</center>
   .attr("height","100")
   .attr("fill", "blue") //내부색
   .attr("stroke","red") //테두리색
   .attr("stroke-width","5") //테두리 두께
   .attr("opacity","0.5");  //불투명도



=> 내부색이 blue이고 테두리가 red인데 이미지가 이상하게 보일꺼에요. 불투명도 때문에 그렇습니다.

그런데 위와 같이 코딩을 하면 꽤 길고 귀찮게 attr()함수를 반복 코딩을 하는 번거로움이 발생합니다.

이부분을 간단히 코딩해 볼까요.

 var rect = svg.append("rect")
   .attrs({ x: 10, y: 10, width: 100, height: 100, fill: 'red', stroke: 'blue', 'stroke-width':5, opacity: '0.5' }) 

HTML에서 코딩하는 것처럼 속성 값들을 위와같이 나열하면 됩니다

다른방법으로,

 var rect = svg.append("rect")
   .attrs({ x: 10, y: 10, width: 100, height: 100})
   .styles({fill: 'red', stroke: 'blue', 'stroke-width': 5, opacity: 0.5 })

attrs()함수로 전체 속성을 지정해 주고 스타일 경우도 styles()함수로 전체 스타일을 지정해 주면 됩니다.

주의 : stroke-width의 경우는 따옴표로 묶어주셔야 합니다. '-'기호는 인식에서 에러가 발생하더군요. 그냥 HTML에서 쓰던 방식으로 코딩하면 안되고 일부 안되는 부분은 시행착오를 거쳐서 알아내야 하더군요.

그리고, attr() 함수의 인자인지 아니면 style()함수의 인자인지 참 애모한 경우가 있습니다. 일부 인자의 경우는 둘 모두에서 사용 될 수 있고 경우에 따라 한쪽에서만 사용되는 경우가 있는데 이건 연습이 필요해 보이네요.

3. 그외 태그들



<circle cx="100" cy="100" r="50" fill="red" stroke="blue" stroke-width="5"></circle>

타원


 <ellipse cx="100" cy="100" rx="50" ry="70" fill="red" stroke="blue" stroke-width="5"></ellipse>

라인


 <line x1="10" y1="10" x2="290" y2="290" stroke = "blue" stroke-width="5"> </line>

특수라인(path)


 <path d="M10,210 L110,120 110,210 110,220 210,250" fill="none" stroke="blue" stroke-width="5"></path>

폴리건


<polyline points="50,50 250,50 150,150 50,50" fill= "red" stroke="blue" stroke-width="5"></polyline>

위의 각 태그들은 사각형에서 표현했던 방식으로 여러분들이 수정해 보세요.

마무리


d3.js로 접근하는 함수에 대해 간단히 사각형으로 예를 들었고 그외 태그들은 복습 차원으로 다시 나열했습니다. 시험문제라고 생각하고 위 태그들을 사각형에서 코딩했던 방식으로 나머지 태그들을 어떻게 코딩을 해야 할지 한번 풀어 보세요.

댓글()

[D3.js] HTML의 SVG 태그

D3.js/D3.js|2019. 10. 24. 09:00

[D3.js] HTML의 SVG 태그


D3.js를 사용하기 위해서는 HTML에서 사용되는 태그들을 기본적으로 알아야 합니다. 그중에서도 SVG 태그는 꼭 숙지해 두셔야 나중에 차트와 같은 데이터 이미지화 할 때 효율적으로 사용할 수 있습니다. 오늘은 간단히 SVG에 자주 사용되는 태그들을 중점적으로 살펴보겠습니다.

1. 태그 SVG를 알자


웹상에서 그림을 그릴 때 HTML 태그 중 SVG로 그림을 그리는 영역을 잡고 기본 이미지 모양 태그 rect, circle, line, path, ellipse, polyline 등을 사용하여 그림을 그리게 됩니다.

SVG 태그 : 가로x세로(300x300)의 크기의 그림을 그리는 영역을 잡으면 아래와 같습니다.

<svg width="300" height="300"></svg>

그리고 그림 그리는 영역의 배경색을 넣을 때는 스타일로 지정을 하게 됩니다.

style="background: yellow"

svg 태그 안에서는 위와 같이 표현하면 됩니다.

<svg width="300" height="300" style="background: yellow"></svg> 


위 표현을 style을 앞에 표현한다면 이전 시간에 막대형 차트에서 보셨던 것 처럼 style 태그 안에다 해당 svg에 대한 스타일을 지정하면 됩니다.

<style>
  svg {
    background-color: yellow;
  }
</style>

<svg width="300" height="300" >

2. 이미지 모양 태그


1) 사각형


<rect x="10", y="10" width="100" height="100" fill="red" stroke="blue" stroke-widht="5" opacity="0.5"></rect>
  • x,y : 시작꼭지점 위치
  • width : 사각 너비 크기
  • height : 사각 높이 크기
  • fill : 내부색
  • stroke : 테두리 색
  • stroke-widht : 테두리 크기
  • opacity : 투명도

예) 300x300 캔버스에 100x100 크기의 사각형을 그리기

  <svg width="300" height="300" style="background: yellow">
    <rect x="10", y="10" width="100" height="100" fill="red" stroke="blue" stroke-widht="5" opacity="0.5"></rect>    
  </svg> 

[결과]


2) 원


<circle cx="100" cy="100" r="50" fill="red" stroke="blue" stroke-width="5"></circle>
  • cx,cy : 원 시작꼭지점(cx,cy)
  • r : 반지름
  • 기타 : 위 사각형과 동일함

예) 300x300 캔버스에 반지름이 50인 원을 그리기

  <svg width="300" height="300" style="background: yellow">
    <circle cx="100" cy="100" r="50" fill="red" stroke="blue" stroke-width="5"></circle>
  </svg> 

[결과]


3) 타원


 <ellipse cx="100" cy="100" rx="50" ry="70" fill="red" stroke="blue" stroke-width="5"></ellipse>
  • cx,cy : 시작꼭지점(cx,cy)
  • rx : x축으로 넓이 반지름
  • ry : y축으로 높이 반지름
  • 기타 : 위 사각형과 동일함

예) 300x300 캔버스에 반지름이 x축 반지름 50이고 y축 반지름이 70인 타원을 그리기

  <svg width="300" height="300" style="background: yellow">
    <ellipse cx="100" cy="100" rx="50" ry="70" fill="red" stroke="blue" stroke-width="5"></ellipse>
  </svg> 

[결과]


4) 라인


 <line x1="10" y1="10" x2="290" y2="290" stroke = "blue" stroke-width="5"> </line>
  • x1,y1 : 시작점(x1,y1)
  • x2,y2 : 끝점(x2,y2)

예) 300x300 캔버스에 시작꼭지점(10,10)에서 끝점(290,290)가지의 직선그리기

  <svg width="300" height="300" style="background: yellow">
    <line x1="10" y1="10" x2="290" y2="290" stroke = "blue" stroke-width="5"> </line>
  </svg> 

[결과]


5) 특수라인(path)


 <path d="M10,210 L110,120 110,210 110,220 210,250" fill="none" stroke="blue" stroke-width="5"></path>

M : 시작 위치로 이동 (M 10,210 => (10,210)꼭지점이 시작위치가 됨
L : 이동할 라인 좌표 (L 110,120 => (110,120)꼭지점으로 라인을 그음 )
C : 곡선 S : 부드러운곡선 Q : 차 베지에곡선 T : 부드러운 차 베지에 곡선 A : 호 Z = 끝경로(시작점과 이

예) 300x300 캔버스에 특수라인 그리기

  <svg width="300" height="300" style="background: yellow">
    <path d="M10,210 L110,120 110,210 110,220 210,250" fill="none" stroke="blue" stroke-width="5"></path>
  </svg> 

[결과]


6) 폴리건


<polyline points="50,50 250,50 150,150 50,50" fill= "red" stroke="blue" stroke-width="5"></polyline>
  • pints : 폴리건의 꼭지점들

예) 300x300 캔버스에 폴리건 그리기

  <svg width="300" height="300" style="background: yellow">
    <polyline points="50,50 250,50 150,150 50,50" fill= "red" stroke="blue" stroke-width="5"></polyline>
  </svg> 

[결과]


마무리


오늘은 d3.js에서 데이터 시각화를 할 때 자주 사용되는 태그와 속성들을 간단히 살펴보았습니다. HTML 태그로 되어 있는데 이 부분을 D3.js함수로 그리게 할 수 있는데 오늘 내용이 너무 길어서 서론만 이야기하고 본론인 D3.js 함수에 대해서 이야기를 못했네요. 그냥 오늘은 HTML에서 사용되는 그리기 태그들만 간단히 알아만 두세요.

댓글()