与this question类似,我正在寻找一种方法来创建一个GUI,用户可以在其中查看图形(在graph theory意义上)并与之交互。随着时间的推移,车辆将从一个节点移动到另一个节点。用户应该能够添加节点和边缘,并添加车辆并设置目的地。
我已经实现了基础图模型和业务逻辑,我只需要一个GUI。这意味着我不需要图形算法功能,例如Djistra的算法。
如果可能,解决方案应该与平台无关。底层模型是用python编写的,因此GUI解决方案要么是基于python的(哪个更好),要么应该很容易与python接口(可能是IPC)。
表现是一个问题。它不需要快速,但它必须足够快以跟上底层模型。从概念上讲,图表中可能存在的节点,边缘和车辆数量没有限制。
我查看了各种可视化库:
我已考虑使用OpenGL。
我考虑直接画到wxPython。
我没有使用任何图库。我不知道他们是否有能力提供所需的功能。例如,matplotlib似乎在库中有很多非图论理论图。除了通过NetworkX,我找不到一个用它实现图形的例子。再举一个例子,NetworkX可以绘制沿边缘传播的对象吗?
OpenGL解决方案几乎肯定需要更多时间来实施。我必须自己编写用于跨边移动对象的函数。我必须编写一个函数来绘制正确位置的边缘,并为所有边缘,节点和车辆等绘制标签。我需要实现菜单并从头开始处理交互。
我不确定如何在wxPython中实现它。我只知道如何将它与标准小部件结合使用。 更新:我发现this question的答案指向wx.lib.ogl或wx.lib.floatcanvas作为在纯wxPython中实施解决方案的机制。
任何可视化库是否符合我的要求?那些最适合的人呢?是否有其他我错过的图书馆符合我的要求?像JGraph这样的东西,但对于Python而不是Java,将是合适的。
您对在OpenGL或wxPython中实现此操作有何看法,而不是其中一个库?
我还没有考虑过你认为合适的其他方法吗?
答案 0 :(得分:8)
您可以考虑使用JavaScript库d3。它有一些很棒的交互式图形可视化,并且用JavaScript编写,非常适合Web UI
我不确定实时图形构建功能,但假设在您选择的可视化类型之上实现简单的节点和边缘添加/删除是微不足道的。
当然,你需要pyjs之类的东西来将d3与你的python代码接口,所以它可能不合适。
关于nmichaels的回答:广泛使用GraphViz,我不会为你的目的推荐它。它生成漂亮的静态图,但严格来说是非交互式的。
答案 1 :(得分:4)
我的直觉说使用graphviz这样的东西自己呈现图形和wx来处理你的UI是一个很好的方法。重新实现OpenGL中的所有图形绘制位似乎是一种巨大的浪费。 pyGraphViz非常易于使用,因此您可以快速获得一些功能并根据性能进行调整。
答案 2 :(得分:1)
您可能还想考虑networkx_viewer: https://github.com/jsexauer/networkx_viewer
答案 3 :(得分:1)
我最终发现我认为可视化库无法为沿边缘移动的物体设置动画。
我使用 wxPython 及其 floatcanvas 进行了实验,发现使用相当简单(比OpenGL解决方案简单得多)。这让我可以根据需要自由制作动画,但是没有给我任何关于显示连接节点的包装 - 我必须自己编写。
这是一个相当古老的问题,所以现在可能还有其他库可以满足这个要求,或者可能是我认为已经推进的库已经提前了,现在可以做到这一点。如果我今天必须从头开始实现它,我倾向于尝试使用基于Web的UI,可能利用Web套接字来跟上数据速率方面的后端。我不知道动画的扩展程度如何 - 我发现当同时动画大量的东西时,Canvas和SVG会变得不稳定。也许WebGL更适合。