交互式图形可视化

43

情况

类似于这个问题,我正在寻找一种创建 GUI 的方法,在其中用户能够看到一个图形(在 图论 的意义上)并与之交互。车辆将按时间从一个节点移动到另一个节点。用户应该能够添加节点和边以及添加车辆并设置它们的目的地。

我已经实现了底层图模型和业务逻辑,我只需要一个 GUI。这意味着我不需要像 Dijkstra 算法这样的图算法功能。

如果可能,解决方案应该是平台无关的。底层模型是用 Python 编写的,因此 GUI 解决方案要么需要基于 Python(这将是首选),要么应该容易地与 Python 进行接口(潜在的 IPC)。

性能是一个问题。它不需要非常快,但必须足够快以跟上底层模型。理论上,图中可能存在节点、边和车辆的数量没有限制。

可能的方法

我已经研究了各种可视化库:

我正在考虑使用 OpenGL

我想直接绘制 wxPython

问题

我没有使用过任何图形库。我不知道它们是否能够提供所需的功能。例如,matplotlib在画廊中似乎有很多非图形理论图形。我找不到除了通过NetworkX之外还有谁实现了图形的例子。另一个例子,NetworkX是否可以绘制沿着边缘移动的对象?

使用OpenGL的解决方案几乎肯定需要更多的时间来实现。我将不得不自己编写跨越边缘移动对象的函数。我将不得不编写一个函数来正确地绘制边缘,并为所有边缘、节点和车辆等绘制标签。我需要实现菜单并从头处理交互。

我不确定如何在wxPython中实现这一点。我只知道如何与标准小部件一起使用它。 更新:我找到了this question,其中有一个答案指向wx.lib.oglwx.lib.floatcanvas作为在纯wxPython中实现解决方案的机制。

问题

有没有任何可视化库符合我的要求?其中哪些最适合?我是否错过了其他符合要求的库?类似于JGraph但使用Python而不是Java的库将是合适的。

您认为在OpenGL或wxPython中实现与使用这些库之一相比如何?

您认为还有其他适当的方法吗?


你介意描述一下你最终选择了哪个框架吗?这对我(以及其他人)来说将非常有帮助,因为我们正在寻找类似的东西并探索这些库。 - Spry
当然可以。我会添加一个答案,这样我们就可以关闭问题了。 - Spycho
4个回答

9
您可以考虑使用JavaScript库d3。它具有一些非常出色的交互式图形可视化效果,并且由于是用JavaScript编写的,因此非常适合Web UI。
我不确定其实时图形构建能力,但我认为在所选可视化类型的基础上实现简单的节点和边添加/删除将是微不足道的。
当然,您需要像pyjs这样的东西来将d3与您的Python代码接口起来,因此可能不太合适。
关于nmichaels的答案:我曾广泛使用GraphViz,但不建议您将其用于您的目的。它生成美丽的静态图表,但严格来说是非交互式的。

1
我正在寻找同样的解决方案,阅读了您的帖子后,我搜索了networkx的图形和d3使用的JS对象之间的任何连接。正如您可以在此演示文稿中看到的那样,更好的解决方案是NetwokX.readwrite.json_graph.node_link_data - gunzapper

4
我的直觉告诉我,使用类似graphviz这样的工具来呈现图形,并使用wx处理用户界面是一个不错的选择。重新实现OpenGL中的所有图形绘制部分似乎是一种巨大的浪费。pyGraphViz非常容易使用,因此您可以快速获得功能,并根据需要进行调整以提高性能。

谢谢,这正是我所想的。你知道pyGraphViz是否支持在边的中间绘制对象,并确定哪个节点被点击以进行交互吗? - Spycho
GraphViz没有方法可以告诉你哪个节点被单击。我不知道它是否支持从输出图片上的坐标到节点的跳转。我相信你可以在边缘上放置标签,但是我不知道更详细的对象绘图在更具体的位置上的情况。据我所知,matplotlib有交互部分的钩子。也许你最好修改NetworkX。 - nmichaels

1

1
我最终发现,我考虑过的可视化库不能够动画显示沿着边缘移动的对象。
我尝试使用wxPython及其floatcanvas进行实验,并发现这相当简单易用(比OpenGL解决方案要简单得多)。这使我有了按照需要进行动画处理的自由,但没有提供关于显示连接节点的包装器 - 我必须自己编写。
这是一个相当古老的问题,所以现在可能有其他满足此要求的库,或者我考虑的库已经得到了改进并且现在可以做到这一点。如果我今天必须从头开始实现它,我会倾向于尝试基于Web的UI,可能利用Web套接字来跟上数据速率方面的后端。不过我不知道动画效果能否很好地扩展 - 我发现Canvas和SVG在同时动画大量事物时会变得卡顿。也许WebGL更适合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接