【问题标题】:enclosing the nodes of a d3 force directed graph in a circle or a polygon or a cloud将 d3 力有向图的节点包围在圆形或多边形或云中
【发布时间】:2012-10-05 01:14:04
【问题描述】:

我已经构建了一个带有分组节点的d3 强制有向图。我想将组封闭在云状结构中。我该怎么做?

图表的 Js Fiddle 链接:http://jsfiddle.net/Cfq9J/5/

我的结果应该类似于这张图片:

【问题讨论】:

  • 您的数据只显示一组 - 应该还有更多吗?

标签: javascript d3.js force-layout


【解决方案1】:

这是一个棘手的问题,我不完全确定您是否可以通过表演的方式来解决。你可以在这里看到我的静态实现:http://jsfiddle.net/nrabinowitz/yPfJH/

还有这里的动态实现,虽然它很慢而且很紧张:http://jsfiddle.net/nrabinowitz/9a7yy/

实施注意事项:

  • 这通过使用其组中的所有其他圆圈来掩盖每个圆圈来工作。您或许可以通过碰撞检测来加快速度。

  • 因为每个圆圈都被渲染并用作遮罩,所以大量使用use 元素来引用每个节点的圆圈。实际的圆在def 元素中定义,这是一个用于重用的非渲染定义。运行时,每个节点将呈现如下:

    <g class="node">
        <defs>
            <circle id="circlelanguages" r="46" transform="translate(388,458)" />
        </defs>
        <mask id="masklanguages">
            <!-- show the circle itself, as a base -->
            <use xlink:href="#circlelanguages" 
                fill="white" 
                stroke-width="2"
                stroke="white"></use>
            <!-- now hide all the other circles in the group -->
            <use class="other" xlink:href="#circleenglish" fill="black"></use>
            <use class="other" xlink:href="#circlereligion" fill="black">
            <!-- ... -->
        </mask>
        <!-- now render the circle, with its custom mask -->
        <use xlink:href="#circlelanguages"
            mask="url(#masklanguages)"
            style="fill: #ffffff; stroke: #1f77b4; " />
    </g>
    
  • 我将节点圆圈、链接和文本分别放在不同的 g 容器中,以便适当地分层。

  • 最好在节点数据中包含一个数据变量,而不是字体大小 - 我必须将 fontSize 属性转换为整数才能将其用于圆半径。即使这样,由于文本的宽度与数据值无关,您会得到一些比其下方的圆圈更大的文本。

  • 不确定为什么第一个节点的圆圈在静态版本中没有正确放置 - 它在动态版本中有效。谜团。

【讨论】:

  • 谢谢。这是一个很好的,即使它很慢。 +1 让我们在将其标记为答案之前等待更多回复。
  • 如何将 force.drag 属性添加到图形中?
  • json 中有很多不需要的链接。更新了 json,对于 fontsize,我将 fontsize 乘以单词的长度。 .attr('r', function(d) { return parseInt(d.fontsize.replace('px', '')) *(d.name.length/2.5) })小提琴:jsfiddle.net/9a7yy/3
  • 不错的解决方案!是的-您可能可以使用四叉树进行优化,以查找足够接近的元素以查看是否不需要任何掩蔽。或者,我觉得必须有某种方法可以使用 voronoi 三角测量来计算云周界路径 - 但可能不会更快:)
  • 有人有快速的技术吗?当我添加超过 25 个标签时,图表实际上需要大量内存来执行计算,并且“拖动”功能不能再使用,因为它太慢了。我已经发布了另一个关于在圆圈周围绘制船体路径而不是使用蒙版的问题。如果有人能做出贡献,那就太好了。链接:stackoverflow.com/questions/13231047/…
猜你喜欢
  • 2013-01-20
  • 2013-12-21
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多