2016-10-24 72 views
0

我想改變sunburst圖表上的傳統縮放功能。傳統上,當您單擊某個分區時,該分區會增長以覆蓋基本層的100%,同一層上的所有其他分區會消失。所選分區的子項都會增長以填充新創建的空間。如何更改d3旭日形圖表上的縮放功能?

我目前的代碼正好如上所述。我想改變我的代碼,以允許選定的分區只佔75%的基礎層。兒童元素將增長到覆蓋這個新的空間,但其餘的25%仍將包含所有其他未選擇的分區。

我試着改變從d3.interpolate()返回的't'值,但我有不可預知的結果。

我希望我的描述很清楚。

有沒有人對此有任何想法?

<script> 

var width = 960, 
height = 700, 
radius = Math.min(width, height)/2; 

var x = d3.scale.linear() 
.range([0, 2 * Math.PI]); 

var y = d3.scale.linear() 
.range([0, radius]); 

var color = d3.scale.category20c(); 

function percent(d) { 
    var percentage = (d.value/956129) * 100; 
    return percentage.toFixed(2); 
} 

var tip = d3.tip() 
    .attr('class', 'd3-tip') 
    .offset([-10, 0]) 
    .html(function(d) { 
return "<strong>" + d.name + "</strong> <span style='color:red'>" + percent(d) + "%</span>"; 
    }) 

var svg = d3.select("body").append("svg") 
.attr("width", width) 
.attr("height", height) 
    .append("g") 
.attr("transform", "translate(" + width/2 + "," + (height/2 + 10) + ")"); 

svg.call(tip); 

var partition = d3.layout.partition() 
.value(function(d) { return d.size; }); 

var arc = d3.svg.arc() 
.startAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x))); }) 
.endAngle(function(d) { return Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx))); }) 
.innerRadius(function(d) { return Math.max(0, y(d.y)) }) 
.outerRadius(function(d) { return Math.max(0, y(d.y + d.dy)) }); 

d3.json("flare.json", function(error, root) { 
    var g = svg.selectAll("g") 
    .data(partition.nodes(root)) 
.enter().append("g"); 

    var path = g.append("path") 
.attr("d", arc) 
// .attr("stroke", 'black') 
// .style("fill", function(d) { return color((d.children ? d : d.parent).name); }) 
.style("fill", function(d, i) { 
    return color(i); 
}) 
.on("click", click) 
.on('mouseover', tip.show) 
.on('mouseout', tip.hide); 

    var text = g.append("text") 
.attr("transform", function(d) { return "rotate(" + computeTextRotation(d) + ")"; }) 
.attr("x", function(d) { return y(d.y); }) 
.attr("dx", "6") // margin 
.attr("dy", ".35em") // vertical-align 
.text(function(d) { 
    if (percent(d) > 1.35) { 
     return d.name; 
    } 

}) 
.attr('font-size', function(d) { 
    if (d.value < 100000) { 
     return '10px' 
    } else { 
     return '20px'; 
    } 
}) 
.on("click", click) 
.on('mouseover', tip.show) 
.on('mouseout', tip.hide); 

    function click(d) { 
console.log(d) 
// fade out all text elements 
text.transition().attr("opacity", 0); 

path 
    .transition() 
    .duration(750) 
    .attrTween("d", arcTween(d)) 
    .each("end", function(e, i) { 
     // check if the animated element's data e lies within the visible angle span given in d 
     if (e.x >= d.x && e.x < (d.x + d.dx)) { 
     // get a selection of the associated text element 
     var arcText = d3.select(this.parentNode).select("text"); 
     // fade in the text element and recalculate positions 
     arcText.transition().duration(750) 
      .attr("opacity", 1) 
      .attr("transform", function() { return "rotate(" + computeTextRotation(e) + ")" }) 
      .attr("x", function(d) { return y(d.y); }); 
     } 
    }); 
    } 
}); 

d3.select(self.frameElement).style("height", height + "px"); 

// Interpolate the scales! 
function arcTween(d) { 
console.log(d.name, x.domain()) 
console.log(d.name, y.domain()) 
console.log(d.name, y.range()) 
    var xd = d3.interpolate(x.domain(), [d.x, d.x + d.dx]), 
    yd = d3.interpolate(y.domain(), [d.y, 1]), 
    yr = d3.interpolate(y.range(), [d.y ? 20 : 0, radius]); 
    return function(d, i) { 
return i 
    ? function(t) { return arc(d); } 
    : function(t) { 
     console.log(t) 
     x.domain(xd(t)); 
     y.domain(yd(t)).range(yr(t)); 
     return arc(d); 

    }; 
    }; 
} 

function computeTextRotation(d) { 
    return (x(d.x + d.dx/2) - Math.PI/2)/Math.PI * 180; 
} 

+0

真的離題了,但您使用的是較早的d3 API,您應該查看最新的庫版本。例如,'d3.scale.linear()'現在是'd3.scaleLinear()'。這不僅僅是關於函數名稱的變化。新版本還包括錯誤修復和性能改進。 – Dummy

+0

我同意,我確實需要更新到新版本。因爲bl.ocks.org上的大多數示例都使用了較早的d3 API,所以我認爲我有點厭惡它。話雖如此,我同意我應該跳槽。 – Kerrin631

回答