互动图形可视化

43 投票
4 回答
31511 浏览
提问于 2025-04-17 02:17

情况

就像这个问题一样,我想创建一个图形用户界面(GUI),让用户能够看到一个图(在图论的意义上),并与之互动。车辆会随着时间在图中从一个节点移动到另一个节点。用户应该能够添加节点和边,添加车辆并设置它们的目的地。

我已经实现了基础的图模型和业务逻辑,现在只需要一个图形界面。这意味着我不需要像Dijkstra算法这样的图算法功能。

如果可能的话,解决方案应该是跨平台的。基础模型是用Python写的,所以图形界面解决方案要么需要基于Python(这更好),要么应该能与Python轻松对接(可能通过进程间通信)。

性能是一个关注点。它不需要快到令人眩晕,但必须足够快,以跟上基础模型的速度。理论上,图中可以有无限数量的节点、边和车辆。

可能的方法

我查看了各种可视化库:

我考虑过使用OpenGL

我也想过直接在wxPython上绘图。

问题

我没有使用过任何图形库。我不知道它们是否能提供所需的功能。例如,matplotlib似乎在图库中有很多非图论的图形。我找不到除了通过NetworkX实现图形的例子。再比如,NetworkX能否绘制沿边移动的对象?

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

我不确定如何在wxPython中实现这个。我只知道如何与标准控件一起使用它。更新:我找到了一些信息,提到这个问题,其中的答案指向wx.lib.oglwx.lib.floatcanvas,可以用来在纯wxPython中实现解决方案。

问题

这些可视化库中有没有符合我的要求的?如果有,哪些最合适?还有没有其他我遗漏的库可以满足我的需求?像JGraph但适用于Python而不是Java的库会很合适。

你对在OpenGL或wxPython中实现这个与使用这些库相比有什么看法?

还有其他我没有考虑到的方法你认为合适吗?

4 个回答

4

我觉得用像graphviz这样的工具来画图,然后用wx来处理你的用户界面,这样做是个不错的选择。用OpenGL重新实现所有的图形绘制功能感觉会浪费很多精力。pyGraphViz非常简单好用,所以你可能很快就能做出一个能用的东西,然后再根据需要进行性能调整。

9

你可以考虑使用这个JavaScript库d3。它有一些非常棒的互动图表可视化效果,而且因为是用JavaScript写的,所以非常适合网页界面。

我不太确定它能否实时构建图表,但我想简单的节点和边的添加或删除应该在你选择的可视化类型上实现起来很简单。

当然,你需要像pyjs这样的东西来把d3和你的Python代码连接起来,所以可能不太适合。

关于nmichaels的回答:我使用过GraphViz很多次,不太推荐它用于你的目的。它能生成漂亮的静态图,但完全没有互动性。

1

我发现我考虑过的可视化库并不能让物体沿着边缘移动时进行动画。

我尝试了wxPython和它的floatcanvas,发现使用起来相对简单(比起OpenGL的解决方案要简单得多)。这让我可以自由地进行动画,但它没有提供显示连接节点的功能——我得自己写这个。

这个问题已经有一段时间了,所以现在可能有其他库可以满足这个需求,或者我考虑过的库也许已经更新,可以做到这一点。如果今天让我从头开始实现,我可能会尝试使用基于网页的用户界面,可能会利用网络套接字来保持与后端的数据同步。不过,我不太确定动画在大规模时的表现如何——我发现当同时动画化很多东西时,Canvas和SVG会变得卡顿。也许WebGL会更合适。

撰写回答