2017-01-05 13 views
1

아직 D3에 대한 역량을 향상시키는 과정에서 SVG 요소에 확대/축소 곡선을 그릴 때 문제가 발생합니다. 해당 플롯이 확대/축소시 여백을 침범하지 않도록하는 clipPath rect)이지만 clipPath 여백은 d3.symbols의 표시를 플롯에서 잘라냅니다.d3.symbols가 ClipPath 영역에 의해 잘리고 있습니다.

당신이 묘사되어 삼각형 기호의 일부만을 볼 수있는이 경로에 의해 0,0 그려 절단되어 있기 때문에 내 생각, 플롯

var margin = {top: 20, right: 60, bottom: 30, left: 30}, 
    w = 960 - margin.left - margin.right, 
    h = 500 - margin.top - margin.bottom; 

var svg = d3.select("body").append("svg") 
       .attr("width", w + margin.left + margin.right) 
      .attr("height", h + margin.top + margin.bottom) 
      .append("g") 
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

svg.append("defs").append("clipPath") 
     .attr("id", "clip") 
    .append("rect") 
     .attr("width", w) 
     .attr("height", h); 

// The curve I want to plot: y=x^2 
var my_curve = d3.range(10).map(function(d) { var my_y = d * d; return { "x" : d, "y" : my_y }; }); 

var x_range_min = d3.min(my_curve, function(d) { return d.x; }); 
var x_range_max = d3.max(my_curve, function(d) { return d.x; }); 
var y_range_min = d3.min(my_curve, function(d) { return d.y; }); 
var y_range_max = d3.max(my_curve, function(d) { return d.y; }); 

var xScale = d3.scaleLinear().domain([x_range_min, x_range_max]).range([0, w]); 
var yScale = d3.scaleLinear().domain([y_range_max, y_range_min]).range([0, h]); 

var xAxis = d3.axisBottom().scale(xScale); 
var yAxis = d3.axisLeft().scale(yScale); 


// symbols 
svg.selectAll(".my_pts").data(my_curve).enter().append("path") 
    .attr("class", "my_pts") 
    .attr("d", d3.symbol().type(d3.symbolTriangle).size(200)) 
    .attr("transform", function(d) { return "translate(" + xScale(d.x) + "," + yScale(d.y) + ")"; }) 
    // with this zoomed line does not enter margin area 
    .attr("clip-path", "url(#clip)"); 

...에 대한 관련 코드 번역 전에 clipPath를 수행 할 수 있습니다. 나는 또한 당신이 문제가 발생하지 않은 경우합니다 (clipPath이 필요한 이유를 볼 수 있도록, 브러시 & 줌 기능, 코드의 더 완전한 버전을 찾을 수있는이 바이올린 https://jsfiddle.net/fabio_p/988c1sjv/ 을 게시 한

여백 전)

내 질문은 다음과 같습니다.이 문제의 해결 방법이 있습니까? 나중에 번역 할 필요없이 올바른 위치에 심볼을 직접 그릴 수있는 방법을 찾고 싶었지만 (아마도 "사용자 정의 심볼 유형"을 사용했을 가능성이 있습니다), 내가 제작할 수 없었기 때문에 현재의 기술을 넘어서는 것 같습니다. 실제 솔루션.

모든 의견을 환영합니다. 미리 감사드립니다.

var clipping = svg.append("g") 
    .attr("clip-path", "url(#clip)"); 

을 그리고 라인과 그룹의 기호를 모두 추가합니다 :

답변

1

클립 경로 그룹을 작성

다음
clipping.append("path") 
    .data([my_curve]) 
    //etc... 

업데이트 된 바이올린은 다음과 같습니다 https://jsfiddle.net/cvtvrL2q/

+0

브릴리언트! 이 솔루션은 간단하고 우아합니다! 그러나 내 생각에 대부분의 "문제"는 디자인에서 비롯된 것 같습니다. 이러한 종류의 svg 작업 (클리핑 영역/변환 등)에 대한 정보는 좋은 정보 출처가 있습니까?) 일어나는가? W3C 권장 사항 "... 다른 자식 요소의 실루엣과 OR [...]하기 전에 지정된 자식 요소가 참조 된 클리핑 경로에 의해 잘립니다."나에게 자명 한 내용이 아니며 누가 아직 자세한 내용이 빠졌습니다 .-- ( –

+0

일반적으로 내 그래프에서 클립 경로를 사용하지 않기 때문에 저는이 문제에 관해 당신을 안내 할 수있는 최고의 사람이 아닙니다. 아마도이 질문을 " svg "태그 만 사용하면 SVG 전문가가 도움을 줄 수 있습니다. 그러나"튜토리얼이나 모범 사례를 묻는 것 "이 아닌 실제 코드에 대한 질문을해야합니다. 그렇지 않으면 초 단위로 질문을 닫을 것입니다. .. –