Python有没有交互式绘图库?

63 投票
4 回答
32457 浏览
提问于 2025-04-16 16:15

我在找一个可以在Python中使用的互动图形库。

这里的“图”指的是一组节点通过一些连接线(边)相连,而不是在x-y坐标轴上绘制的值的图表,也不是像素的网格。

我说的“互动”是指我可以拖动节点的位置,并且我需要能够点击这些节点或连接线,然后这个库能把这些节点或连接线的信息传给我,这样我就可以添加或删除节点,或者显示一些信息(因为我的数据集太大太复杂,所以我不能在一开始就加载完整的图;我只会根据用户的输入加载必要的数据部分)。

提到的Python是指编程语言Python,这个图形库应该能和CPython兼容。我现在有Python 2.7和Python 3.1,但如果需要的话可以降级到2.6。这个语言要求是因为我正在处理的数据集只支持Python。

这个图形库必须支持有向图,并且能够自动布局节点。我需要在节点上添加标签。

最好是布局算法能把相邻的节点放得靠近一点。它应该能在我这台四年旧的笔记本上合理处理100到1000个节点和大约300到4000条连接线(我通常从大约100个节点开始,但数量可能会根据用户输入而增加)。最好是这个库的依赖不太多(可能除了Gnome)。开源的更好。

我已经用Tkinter Canvas写了一个简单的程序原型,但我需要一个更专业的图形库来扩展这个程序。我看过graphviz和matplotlib,但它们似乎只适合处理静态图形,要实现互动操作需要做很多额外的工作(如果我错了请纠正我,我只是简单看过它们)。我也试过把图生成SVG文件,然后用Inkscape查看,但速度太慢,占用内存太多,而且因为连接线数量太多,图形变得很混乱。

4 个回答

3

我也遇到过同样的问题。最后,我发现nodebox opengl似乎能解决这个问题。

不要尝试使用下面链接中的图形库:

http://nodebox.net/code/index.php/Graph

与nodebox opengl一起使用。这个图形库只适用于mac OSX的nodebox,所以它不管用。不过没关系,因为你其实不需要它。

比如,看看下面这个问题:

在nodebox opnegl中给图的边添加标签

里面有个示例代码对我有效,你可以修改这个代码,让你点击一个节点时,不仅可以移动这个节点,还可以修改图形。

只需从代码中删除:

label = "Placeholder"

就可以正常工作了。

编辑:

我在这里放了一些更详细的示例代码:

Nodebox open GL图形,大小函数未被识别。(Ubuntu)

9

如果你还没听说过,建议你看看igraph这个库。

这个库非常强大,可以处理大型图形和不同的布局样式。它不仅可以用于有向图,还可以用于2D和3D的互动和非互动可视化,具体功能可以参考这个列表。另外,还有一个教程

更新:还有一个知名的库是NetworkX,你可以在这里找到它的Python包链接。值得注意的是,Acorn推荐的Mac/Windows软件Nodebox使用了NetworkX的算法。

32

看起来Nodebox可能是你想要的工具:

http://nodebox.net/code/index.php/Graph 适用于Mac OSX

http://www.cityinabottle.org/nodebox/ 适用于Windows(使用OpenGL)

Nodebox截图

这个图形对象也有鼠标交互的功能,这些功能都在graph.events对象里。它有以下几个属性:

  • graph.events.hovered: None或者鼠标悬停的节点。
  • graph.events.pressed: None或者鼠标按下的节点。
  • graph.events.dragged: None或者正在拖动的节点。
  • graph.events.clicked: None或者最后点击的节点。
  • graph.events.popup: 当True时,会在悬停的节点上显示一个弹出窗口。

我还发现了Gephi,看起来它也可能有你需要的功能。

http://gephi.org/ 适用于WindowsLinuxMac OSX

Gephi是一个互动可视化和探索平台,适用于各种网络和复杂系统,包括动态和层次图。

Gephi截图

撰写回答