代码之家  ›  专栏  ›  技术社区  ›  David Rutten

绘制二维点图

  •  5
  • David Rutten  · 技术社区  · 15 年前

    我有一个对象列表(可能不超过100个),其中每个对象与所有其他对象都有一个距离。这个距离只是这些对象共享的所有字段之间增加的绝对差。可能有几个(一个)或多个(几十个)字段,因此距离的维数并不重要。

    我想将这些点显示在二维图形中,这样距离很小的对象就会出现在一起。我希望这能清楚地传达出整个列表中有多少子组。显然,这个图的轴是没有意义的(我甚至不确定“图”是正确的词)。

    将距离网络转换为二维点分布的好算法是什么?理想情况下,我希望对距离网络进行一个小的更改,以使图形发生一个小的更改,这样,随着时间的推移,增量进度可以被视为一个平滑的更改。

    我举了一个小例子来说明我正在寻找的结果: Example Graphic http://en.wiki.mcneel.com/content/upload/images/GraphExample.png

    任何想法都非常感谢, 戴维


    编辑:

    实际上,它似乎起了作用。我将整组值视为二维粒子云,在所有粒子之间构建平方反比斥力,并基于反比距离构建线性吸引力。这不是一个稳定的算法,当执行额外的迭代时,结果往往会剧烈旋转,但它似乎总是能够很好地分离成可视的集群:

    alt text http://en.wiki.mcneel.com/content/upload/images/ParticleCloudSolution.png

    如果有人感兴趣,我可以发布C代码(遗憾的是,有很多代码)

    3 回复  |  直到 12 年前
        1
  •  2
  •   moonshadow    15 年前

    Graphviz 包含解决此问题的几种不同方法的实现;请考虑使用其Spring模型图形布局工具作为解决方案的基础。或者,其站点包含 a good collection of source material 关于相关理论。

        2
  •  1
  •   Andrew McGregor    15 年前

    前面的答案可能会有帮助,但不幸的是,考虑到您对问题的描述,它不能保证有解决方案,事实上,大多数时候它不会。

    我认为你需要多读一点集群分析,因为有一些算法可以根据相关性度量将你的点分类到集群中,然后你可以使用graphviz或类似的东西来绘制结果。 http://en.wikipedia.org/wiki/Cluster_analysis

    我非常喜欢的是“最小割分区算法”,请参见以下内容: http://en.wikipedia.org/wiki/Cut_(graph_theory)

        3
  •  1
  •   user229044    12 年前

    你可能想在谷歌上搜索以下术语:

    • 自动图形布局;以及
    • 基于力的算法。