比较开源Java图形绘制框架(JUNG和Prefuse)以绘制网络拓扑

2022-09-01 16:15:17

哪些开源 Java 图形绘制框架可用于具有以下要求的网络图?该图将少于 1000 个节点。

1)在单个图中具有平行边缘
2)有向和无向边缘3)由图像
表示的节点4)用户与节点和边缘
的交互5)动态添加/删除节点和边缘
6)节点和边缘上的多个标签,用户可以关闭/打开不同级别的标签。
(如在图层中绘制并关闭/在图层上)
7)不同的布局算法显示星形、环状、网状拓扑

我评估了JUNG和Prefuse。这就是我为每个要求找到的。

1) 预注不能显示平行边,而 JUNG 支持它。是否可以操作预赋值代码以显示平行边缘?由于这涉及基本数据级别的更改,我认为这比通常的自定义呈现更改更困难。

2)我在prefuse和JUNG中都没有找到任何对组合图(有向和无向边)的引用。有谁知道其他的吗?

3)这在Prefuse和JUNG中似乎都很容易

4)同样,预注和JUNG都为用户交互提供支持。

5)预注和JUNG都支持它。每个框架在重绘图形时的性能如何?我在另一篇文章中看到预注对于动态更新表现不佳(预注工具包:动态添加节点和边缘)

6)这归结为修改图形并重新绘制它。所以问题变得与5相同)

7)JUNG和prefuse都有多种布局算法。但是当我尝试在JUNG和Prefuse中使用FruchtermanReingoldLayout显示相同的数据集时,我得到了不同的显示。任何想法为什么?不知何故,Prefuse中的布局算法似乎比JUNG中的布局更好(我认为渲染也更好),尽管Prefuse中的大多数布局算法都基于JUNG实现。预注布局,如ForceDirectedLayout/FruchtermanReingoldLayout和CircleLayout直接映射到星形,圆形,网格拓扑。

除了这些要求之外,prefuse对表达式和查询语言有很好的支持,但看起来不像JUNG那样积极开发。哪一个有更好的可视化?关于哪一个适合以及如何克服缺点的任何建议?

我可以使用的任何其他框架?


答案 1

我是JUNG的创建者和维护者之一,所以请记住下面的回应。

不过,首先,我应该说Prefuse的作者是一个朋友的朋友(是的,我们见过面),他做得很好。我对Prefuse没有经验,但我见过一些用它创建的精美可视化。

以下是JUNG对这些问题的答案。其中几个((1),(2),(4)在以下部分中进行了演示:PluggableRendererDemo

  1. 支持(您需要正确的数据模型,出于性能原因,并非所有模型都支持并行边缘)
  2. 支持(同样,您需要正确的数据模型)
  3. 支持(请参阅ImageShaperDemo)
  4. 支持(大多数演示)
  5. 支持(请参阅GraphEditorDemo)
  6. 不直接支持,尽管您当然可以动态更改标签并使用 HTML 呈现复杂的标签。
  7. JUNG的布局算法更适合一般网络(树等除外)。但是,您当然可以构建自己的布局算法,并且许多人已经这样做了。

希望这有帮助。


答案 2

几年前(2007?我使用预注来可视化呼叫数据记录。我考虑了prefuse,jung,jgraph和其他一些,并选择了prefuse。起初,我有点难以理解预浸泡,但一旦我熟悉了它,它就非常容易(扩展)并且使用起来很有趣。我想JUNG也可以这样说,但我从未尝试过。

1)在预注入中,很容易添加自己的自定义渲染器来绘制平行边缘 - 您可以子类化默认的EdgeRenderer并覆盖reender()方法。不需要“基本数据级别更改”。这一切都在视图部分,如果你想把它看作是一个MVC的东西。

2)这根本不是一个真正的问题。有多种方法可以做到这一点:1)您可以有两个渲染器 - 一个用于绘制有向边缘,另一个用于绘制无向边缘,它们将正常工作,并对边缘进行适当的分组。2) 放置一个标志(在预注语句中在支持表元组中添加一个布尔列)以指示边缘是否定向,并根据该标志在 EdgeRender 中相应地跳过箭头绘制部分。

3)这超级简单

4) 同上

5) 最后一个预播版本是“预注 beta 版 2007.10.21”。我之前使用过那个,在动态添加或删除节点时可能存在争用条件 - 我猜它缺少一些同步关键字。我通过确保在添加或删除节点时停止所有动画和操作(颜色,大小,布局)来解决这个问题 - 也不要忘记更新您的lucene索引(如果您确实使用其内置的lucene搜索引擎)。最新的一个应该解决这个种族问题,但我从来没有机会尝试一下。

6)既然你提到了“多重标签”,我认为这不是“修改图形并重新绘制”的问题 - 这只是自定义标签/边缘渲染器以仅绘制相关标签的问题,所以这不是一个大问题。另外,我认为这与5完全无关。

7)我对prefuse和JUNG对FruchtermanReingoldLayout的渲染是不同的并不感到惊讶 - 有几个因素可能会影响其中一个启动节点,每个实现开始计算,所以我不会太担心这个问题。在预浸泡中尝试不同的内置图形布局算法非常容易,因此您可以继续查看哪一个最接近您想要的算法。查看RadialLayout和BalloonTreeLayout的星形布局。ForceDirectedLayout需要相当多的迭代才能使节点的放置“稳定”。请注意,不需要显示这些迭代,因此您可以在后台运行它并呈现最终结果。

我没有使用JUNG,所以我不能对它做太多评论。

根据我在预浸泡方面的经验,我强烈推荐它,因为它的设计非常好(恕我直言),并且组件之间的可负担性分离。Jeffrey Heer(预充作者)在那里确实做得很好。

如果您使用prefuse,需要注意的事情(这是我在使用prefuse时清楚地记得的两个“拇指酸痛”):

1)有一个错误,在缩小时,节点标签没有适当地缩小,以至于它溢出节点的边界框,当节点移动时,这将留下字体绘制工件,因为渲染器只清除和重绘节点边界框中的内容。IIRC 这是由AWT字体度量本身的错误引起的。解决方法是在标签和节点边界框之间留出足够的余量。

2)在扩展内置布局时,您可能会遇到一两个“范围问题”,其中您希望有权访问的超类的成员被赋予了私有属性而不是受保护,因此解决方案是修改库本身或创建一个不继承的新类(这可能有点痛苦!我想你可以对其他一些java库说同样的话。不是每个人都有后见之明的好处不是吗?:)

由于您在大约一个月前(在我撰写本文时)问了这个问题,我想知道您的决定是什么,以及如果您继续进行实施,结果如何。


推荐