我对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); });
有人有什么建议吗?
1条答案
按热度按时间ds97pgxw1#
其基本思想是围绕链接绘制一系列弧,并按弧的宽度将标签向外分流。
V4溶液
linked block中d3 v4代码的工作修改如下:
第一个
您可以看到为绘制和标记圆弧而添加的离散代码块-用于计算圆弧生成器的起始Angular 和终止Angular 的关键位为:
对于
leafGroups
,nest函数通过关键字的第二项对层次结构的叶子进行分组,例如flare.analytics.cluster
=analytics
和flare.vis.operator.distortion
=vis
。对于不同的数据集,您需要考虑一个选择,例如,叶子是否始终处于一致的深度;标签始终是唯一的。定义“父组”可以是自上而下定义,也可以是自下而上定义。对于
arcAngles
,您只需要每个组的最小值和最大值,然后您就可以继续绘制弧并标记它们。我从here中提取了一些标记,这是一篇关于在d3中标记弧的很棒的文章。您需要再次考虑一下这一点,因为如果标记对于弧来说太长,它看起来就不太好了-请参见示例中的“Display”标签。另一个变化是在下面:
请注意,在设置
transform
属性时需要添加arcWidth
-这会向外移动节点标签以容纳弧。V6+溶液
在Observable HQ页面中有一个使用d3 v6的新版本的分层边绑定(也是Mike Bostok的)。我们可以添加类似的代码来识别组,获得Angular 的最小值/最大值,并将标签向外推一点以容纳弧。
第一个
需要注意的一些差异:
hierarchy
函数与原始块中的packageHierarchy
函数不同-看起来我们不再拥有层次结构的完整路径,因此flare.vis.data.EdgeSprite
与flare.data.DataField
存在歧义,即两个叶子可以在层次结构的不同分支中拥有相同的“父”。nest
已删除,因此您可以改用groups
* Math.PI / 180
,而在v6中看不到--但这只是度/弧度的转换。.text((d, i) => ((d.end - d.start) < (6 * Math.PI / 180)) ? "" : d.name);
)