【问题标题】:d3.js - Dendrogram display adjusted to the tree diagramd3.js - 树状图显示调整为树图
【发布时间】:2021-11-06 20:17:10
【问题描述】:

使用d3.js,我创建了d3 dendrograms 来可视化对象之间的层次关系。图表的尺寸和边距使用固定的高度和宽度值定义。

var width = 1000,
    height = 800,
    boxWidth = 150,
    boxHeight = 35,
    gap = {
        width: 50,
        height: 12
    },
    margin = {
        top: 16,
        right: 16,
        bottom: 16,
        left: 16
    },
    svg;

对于一些关系,显示还可以,但对于许多关系,它不适合,图表被“剪切”,我看不到整个图表。如何动态设置此宽度和高度属性并调整到图形的大小?

显示正确的示例:Codepen

显示不正确的示例:Codepen

【问题讨论】:

    标签: d3.js dendrogram


    【解决方案1】:

    让我们解决这个问题,您需要先知道内容的边界框,然后再调整 svg 大小。为此,在这种特殊情况下,您只需查看框或节点即可忽略链接。

    考虑到这一点,您可以在您的 renderRelationshipGraph 函数中填充 Nodes 并返回计算值后执行以下操作:

    
    function renderRelationshipGraph(data) {
    
        // ...
    
        var bbox = Nodes.reduce(function (max, d)
        {
          var w = d.x + boxWidth;
          var h = d.y + boxHeight;
          if (w > max[0]) {max[0] = w}
          if (h > max[1]) {max[1] = h}
          
          return max                               
        }, [0,0])
    
        return bbox
    }
    

    然后在主要代码更改上使用它来更新 svg 的高度和宽度:

    svg = d3.select("#tree").append("svg")
        .attr("width", width)
        .attr("height", height);
        
        svg.append("g");
        
        var bbox = renderRelationshipGraph(data);
          svg.attr("width", bbox[0])
          .attr("height", bbox[1]);
    

    您可以添加过渡并限制高度,但这可以满足您的要求,最终结果非常大。

    【讨论】:

    • 指令顺序很重要:当我在填充Nodesbbox[0]bbox[1] 后创建var bbox 时,返回给我0。当我把它放在renderRelationshipGraph(data); 之后,我只有计算值你为什么定义var bbox 2 次? (renderRelationshipGraph(data); 之前和之后?
    • 第一部分在函数内部,第二部分在外面,我会更新以澄清这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    相关资源
    最近更新 更多