寻找布局算法

时间:2015-07-10 22:57:44

标签: neo4j sigma.js linkurious

我正在使用Linkurious的sigma.parsers.cypher.js插件,它似乎通过相当缺乏想象力地分配 x y 坐标在视口上放置节点具有足够节点的随机值基本上会产生难以理解的混乱 - Neo服务器内置的图形生成做得更好。

在考虑它时,一种更好地铺设东西的算法可以这样工作:

  1. 选择图表中的第一个节点并将其定位在(0,0)
  2. 选择所有直接相关的节点并将它们定位为{最小值 远离父节点的距离
  3. 如果任何两个兄弟姐妹的距离小于{最小距离},则增加与父母的距离,直到兄弟姐妹能够充分分开
  4. 对于每个兄弟姐妹执行步骤2& 3以上
  5. 但我想知道有什么可以利用的,所以我不必从头开始编写功能吗?

    *更新I *

    也许2)选择所有(无子女)直接相关的节点......然后2a)带有孩子的子节点应该位于距离的两倍+兄弟节点的直径(这为其子女提供空间)

    *更新II *

    如果圆的半径是{最小距离}并且有更多无子节点,那么我们可以:1)增加半径直到所有节点都适合,或者2)创建第二层

1 个答案:

答案 0 :(得分:2)

因此,对于图形布局,很多人使用d3 force directed layout或相同的一些调整变体。我不确定neo4j浏览器是否使用d3,但是图形显示看起来像是一个强制导向变体给我。

图形可视化是一个非常深刻的主题,并且有很多内容。要查看可能的示例,请仔细阅读d3 gallery

编辑虽然我对sigma.js不太熟悉,但我认为在sigma land中等效的是forceAtlas2

我无法评论您的具体算法;听起来它可能是合理的,但对我来说真正的问题是,“你如何利用你正在处理的数据的语义,以呈现合理的布局”?例如,我处理了大量基于时间的图形数据。因此我们使用力导向布局,但不是在同心圆中显示事物,而是在中心有良好连接的东西,而其他东西向外推,我们倾向于将事物与数据的时间方面一起向右流动。这对我们有用,因为我们知道所有节点中的timestamp属性是什么,并且我们知道在这个域中,time元素非常有意义。

如果您有地理数据,那么强制指导可能是一个坏主意,而您宁愿在地图上绘制内容。如果您有社交网络数据,也许您希望将它放在像Lady Gaga这样的“超级节点”周围,以显示谁是网络中最受欢迎的。

所有这一切都取决于它。如果不理解数据和底层域的语义,很难说你的可视化想法是否有用。我认为强制定向布局是一个合理的默认开始,然后自定义。它们并不是真正针对任何特定领域进行定制的,这使得它们对于大多数事情来说都很好,但对于任何事情都不是很好。

但最重要的是,有大量的javascript框架可以为你实现十几种不同的算法。你最好从d3或类似的起点进行调整,我根本不建议你自己实现你选择的算法,而是将它作为一组配置调整到现有的布局引擎。