d3.js 分层边缘捆绑:添加父组标签

kmbjn2e3  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(138)

我对HTML和JavaScript还很陌生,我面临的是著名的分层边缘捆绑here,它是由D3.js库生成的。
我的目标是添加一个半圆形标签区域,以便获得如下所示的效果:每个最终节点组都标有父节点的名称。

不幸的是,我还没有找到任何代码,我可以采取的灵感,除了代码在上面的链接:我想法是修改代码,添加一些行来生成标签。
我看到了这个link,其中有一段代码可能会起到作用,但我不知道如何使用它(也不知道我是否在正确的方向上)

node.append("text")
  .attr("dy", ".31em")
  .attr("x", function(d) { return d.x < 180 === !d.children ? 6 : -6; })
  .style("text-anchor", function(d) { return d.x < 180 === !d.children ? "start" : "end"; })
  .attr("transform", function(d) { return "rotate(" + (d.x < 180 ? d.x - 90 : d.x + 90) + ")"; })
  .text(function(d) { return d.id.substring(d.id.lastIndexOf(".") + 1); });

有人有什么建议吗?

ds97pgxw

ds97pgxw1#

其基本思想是围绕链接绘制一系列弧,并按弧的宽度将标签向外分流。

V4溶液

linked block中d3 v4代码的工作修改如下:
第一个
您可以看到为绘制和标记圆弧而添加的离散代码块-用于计算圆弧生成器的起始Angular 和终止Angular 的关键位为:

var leafGroups = d3.nest()
    .key(function(d) { return d.parent.data.name.split(".")[1]; })
    .entries(root.leaves())
    
  var arcAngles = leafGroups.map(function(group) {
    return {
      name: group.key,
      min: d3.min(group.values, function(d) { return d.x }),
      max: d3.max(group.values, function(d) { return d.x })
    }
  });

对于leafGroups,nest函数通过关键字的第二项对层次结构的叶子进行分组,例如flare.analytics.cluster = analyticsflare.vis.operator.distortion = vis。对于不同的数据集,您需要考虑一个选择,例如,叶子是否始终处于一致的深度;标签始终是唯一的。定义“父组”可以是自上而下定义,也可以是自下而上定义。
对于arcAngles,您只需要每个组的最小值和最大值,然后您就可以继续绘制弧并标记它们。我从here中提取了一些标记,这是一篇关于在d3中标记弧的很棒的文章。您需要再次考虑一下这一点,因为如果标记对于弧来说太长,它看起来就不太好了-请参见示例中的“Display”标签。
另一个变化是在下面:

node = node
    .data(root.leaves())
    .enter().append("text")
      .attr("class", "node")
      .attr("dy", "0.31em")
      .attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + (d.y + 8 + arcWidth) + ",0)" + (d.x < 180 ? "" : "rotate(180)"); })
      .attr("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; })
      .text(function(d) { return d.data.key; })
      .on("mouseover", mouseovered)
      .on("mouseout", mouseouted);

请注意,在设置transform属性时需要添加arcWidth-这会向外移动节点标签以容纳弧。

V6+溶液

Observable HQ页面中有一个使用d3 v6的新版本的分层边绑定(也是Mike Bostok的)。我们可以添加类似的代码来识别组,获得Angular 的最小值/最大值,并将标签向外推一点以容纳弧。
第一个
需要注意的一些差异:

  • hierarchy函数与原始块中的packageHierarchy函数不同-看起来我们不再拥有层次结构的完整路径,因此flare.vis.data.EdgeSpriteflare.data.DataField存在歧义,即两个叶子可以在层次结构的不同分支中拥有相同的“父”。
  • 我已经修复了输入,以适应,但它改变了如何确定'父组',即自下而上与自上而下在原来的。
  • nest已删除,因此您可以改用groups
  • 在v4中,对象的Angular 似乎是以度来定义的,但在v6中,它们是以弧度来定义的--所以你会在v4版本中看到一些* Math.PI / 180,而在v6中看不到--但这只是度/弧度的转换。
  • 对于长标签,我使用了一个阈值,即弧必须至少为6度长,否则标签将无法放置(.text((d, i) => ((d.end - d.start) < (6 * Math.PI / 180)) ? "" : d.name);

相关问题