簡體   English   中英

D3 V4 旭日圖布局弧度計算

[英]D3 V4 Sunburst diagram layout arc calculation

這是計算森伯斯特節點坐標的代碼:

var arc = d3.svg.arc()
    .startAngle(function(d) { return d.x; })
    .endAngle(function(d) { return d.x + d.dx; })
    .innerRadius(function(d) { return Math.sqrt(d.y); })
    .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); });

哪里:

x:節點位置的最小 x 坐標

y:節點位置的最小y坐標

dx:節點位置的 x 范圍

dy: 節點位置的 y 范圍


然而,在最近發布的 v4 版本中,空間填充布局 d3.treemap 和 d3.partition 現在在每個節點上輸出 x0, x1, y0, y1 而不是 x0, dx, y0, dy

node.x0 - 矩形的左邊緣

node.y0 - 矩形的上邊緣

node.x1 - 矩形的右邊緣

node.y1 - 矩形的底邊

v4 的相應代碼是什么,因為以下不會產生正確的布局?

var arc = d3.arc()
    .startAngle(function(d) { return d.x0; })
    .endAngle(function(d) { return d.x0 + (d.x1 - d.x0); })
    .innerRadius(function(d) { return d.y0; })
    .outerRadius(function(d) { return d.y0 + (d.y1 - d.y0); });

代碼筆

在此處輸入圖片說明

代碼筆

var data = {...}

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

var g = d3.select('#container')
    .append('svg')
    .attr('width', width)
    .attr('height', height)
    .append('g')
    .attr('transform', 'translate(' + width/2 + ',' + height/2 + ')');

var partition = d3.partition()
    .size([360, radius])
    .padding(0)
    //.round(true); //this will produce weird leaf node size if true

var root = d3.hierarchy(data, function(d) { return d.children })
    .sum( function(d) {             
        if(d.children) {
            return 0
        } else {                        
            return 1
        }
     })
    .sort(null);

partition(root)

var xScale = d3.scaleLinear()
    .domain([0, radius])
    .range([0, Math.PI * 2])
    .clamp(true);

var arc = d3.arc()
    .startAngle(function(d) { return xScale(d.x0) })
    .endAngle(function(d) { return xScale(d.x1) })
    .innerRadius(function(d) { return d.y0 })
    .outerRadius(function(d) { return d.y1 })

var path = g.selectAll('path')
    .data(root.descendants())
    .enter().append('path')
        .attr("display", function(d) { return d.depth ? null : "none"; })
        .attr("d", arc)
        .attr("fill-rule", "evenodd")
        .style('stroke', '#fff')
        .style("fill", function(d) { return color((d.children ? d : d.parent).data.name); })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM