.NET 中的有向图或无向图布局都有哪些可用选项?

Posted

技术标签:

【中文标题】.NET 中的有向图或无向图布局都有哪些可用选项?【英文标题】:What options are available for the layout of directed or undirected graphs in .NET?.NET 中的有向图或无向图布局有哪些可用选项? 【发布时间】:2010-10-10 01:08:18 【问题描述】:

这里的 graph 是指类似于这些图像的东西:

理想的解决方案是:

仅使用托管代码 允许输出到位图图像 允许输出到 WPF 元素 包括某种交互式表面,用于显示支持缩放、平移和重组节点的图形

我也有兴趣了解可能用作此类工作起点的项目。如果它需要一些发展来实现我想要的,那么我准备好解决它。这个目标中最复杂的部分似乎是在合理的时间范围内获得图形布局。

【问题讨论】:

提醒我自己,这里有一个漂亮的 Clojure 库 lisperati.com/vijual 【参考方案1】:

Graph# 也是另一种选择。我没有亲自使用它,但我一直想四处看看它。

【讨论】:

看了一眼之后,Graph# 看起来很有趣。感谢您的链接。 我还没有尝试过,但不幸的是,他们声称 Sugiyama 的布局有问题。这是我的经验中最有用的布局,所以希望它会在某个时候得到修补。 自从我之前的评论以来,看起来这个项目真的来了(包括 Sugiyama 布局)。还没有尝试过,但是下次我需要这样的东西时,它将是我尝试的第一个库。 是的,在最初使用 GraphViz 之后,一旦他们的算法选择得到改进,我们就转移到了 Graph#。到目前为止,我对此感到非常满意,尽管我需要制作一个补丁来消除他们某些布局的随机方面。【参考方案2】:

Microsoft Research 为 .NET 提供了一个名为 MSAGL(Automatic Graph Layout,以前称为 GLEE)的工具。

MSAGL 可在此处获得:http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/default.aspx

免责声明:我没有使用该工具,所以我不知道它是否适合您(我也不知道许可条件,似乎它仅适用于非商业应用程序)。但至少它看起来很有趣。

【讨论】:

我之前用过 GLEE v1。它是免费的,但相当粗糙。最新版本 (1.2) 的价格为 150 英镑(220 美元)。我很想听听免费的解决方案。 顺便说一句,项目主页在这里:research.microsoft.com/en-us/projects/msagl/default.aspx NDepend 使用它,所以我认为许可证允许商业使用。 codebetter.com/blogs/patricksmacchia/archive/2008/09/09/… @madgnome - 很有趣。上次我查看 NDepend 时,他们似乎在使用 GraphViz。我希望一旦您购买了许可证,就可以将其与您的应用程序一起分发,但在我看来,这应该是在某个地方免费提供的东西,如果没有的话,也许我会做一些事情。 我有更多时间查看 MSAGL 并感到失望。它开箱即用,有 10K 节点和 50K 边,出现内存不足异常。对于 MDS 布局,它们似乎以牺牲内存为代价优化了 CPU 使用率。【参考方案3】:

我在 NDepend 团队工作,我确认:我们在 2008 年 9 月从 GraphViz 切换到 MsAgl,而且 MsAgl 许可证确实允许商业使用。这里是MsAgl graphs integrated in NDepend 的一些示例图片(一切都是交互式的,节点是可移动的/可选择的/可移动的/可点击的,边缘是可编辑的/可选择的/可移动的/可点击的,布局是可缩放的,而且,虽然它可以更清洁 MsAgl API 足够干净,可以使用):

【讨论】:

【参考方案4】:

在我看来,Graphviz 仍然是目前最好的图形库之一。但是,将其集成到 .Net 是一件很痛苦的事情。

可以调用命令行工具根据图形输入生成形状输出,然后读取输出并将元素放置在自定义控件上,该控件显示 graphviz 计算出的任何形状。这很 hacky,但这是我们团队几年前发现的将 graphviz 与 .Net 集成的最佳方式。

今天可能存在更好的解决方案;那时的 GLEE 还处于萌芽阶段,从那时起我还没有看到微软取得的进展。

【讨论】:

GraphViz 可以通过 COM 使用 WinGraphViz 调用,但输出必须写入文件然后从磁盘读取,这是不幸的。它还需要向 COM (afaik) 注册一个额外的 DLL 才能使其工作。 DOT 语法简单易用。 我不知道 WinGraphViz,很好。这基本上就是我们所做的,我们生成了一个点,编译它并将输出解析到我们的图形模型。 WinGraphViz 的最后一个版本是在 2004 年。不幸的是,它只是一个 COM 接口。也许有人可以解决如何跨 com 编组图像数据以避免文件系统。我想知道是否可以解析 SVG 输出以获取位置信息,然后转换为对象和 WPF 渲染... 有一个选项可以让 dot (以及neato 和朋友)写入包含布局坐标的 .dot 格式输出。重新解析以绘制它不会太难。 也可以为 graphviz 编写一个包装器,这样您就可以使用“在线”重新布局和拖放。我们曾经这样做是为了“概念验证”,但内部仍然存在大量错误。【参考方案5】:

我使用过 NodeXL,http://www.codeplex.com/NodeXL,它是一个 .Net 3.5 库(也是一个 Excel 插件)。 NodeXl 由 Microsoft Research 开发,非常简洁:它具有可视化算法和一些指标,但仍处于早期开发阶段。如果您是一位经验丰富的 .Net 开发人员,那么我一定会看一看。

但是,如果您了解 Python,那么我肯定会推荐 Networkx 及其表亲 pygraphviz,它是 Graphviz 的接口。我已经使用了这两种方法,并且我使用 Python / Networkx 的效率比使用 NodeXL 时要高得多。

GLEE 是 Microsoft 的封闭源代码库,您只能在非商业软件中免费使用,而 NodeXL 是 Microsoft 的开源方式,但您可以在您开发的产品中免费使用它。

【讨论】:

非常感谢。我一定会去看看的。【参考方案6】:

只是为了使选项列表完整:Graphviz4Net 是 Coincoin 在他的回答中建议的开源实现。

【讨论】:

看起来很不错,但不幸的是没有完全管理。 WPF 支持看起来很棒。 @DrewNoakes 为什么要寻找 100% 托管代码:有什么优势?【参考方案7】:

Mindscape 的男生有这样的工具

以富有想象力的名字WPF Flow Diagrams

另外,查看 Vertigo 的 Family.Show 演示项目,它有一个简单的形式

【讨论】:

WPF Flow Diagrams 的费用为 500 美元,并且不进行图表的自动布局。它似乎确实有很好的 WPF 集成。 Family.Show 应用程序绘制的家谱(通常!)是所有可能图表的简单子集。例如,它们是无环的。我有兴趣看到可以布置各种图的算法,例如 Sugiyama 方法。 实际上他们的星图产品似乎有某种自动布局。 149 美元/座位,并提供树和力量指导。我没有使用过它,也不知道它如何处理一般情况,但这比他们的流程图产品更符合您正在寻找的内容。【参考方案8】:

使用QuickGraph 为GraphViz 输出点文件。我在最近的一个项目中这样做了,它似乎工作得很好。 Look here 获取解析 .plain 文件的示例代码,或使用我的项目 here 作为仅输出 .png 图像的参考。

【讨论】:

【参考方案9】:

我使用过 MsAgl,它非常好。它还具有 WinForms 和 WPF 的查看器,这对您可能很重要,也可能不重要。不必使用查看器,因为它们与图形布局引擎的耦合非常松散。

它不支持 Graphviz 所做的一切(特别是在某些形状类型方面)。此外,文档可能会更好,但如果不是有史以来最完善的 MS 产品,它也相当可靠。

它确实勾选了您作为要求提到的所有项目,尽管“在查看器上”重新组织仅支持拖动移动节点、重新路由边缘和重新定位标签。图表不会通过重新定位任何其他项目来响应这些元素的移动。

【讨论】:

【参考方案10】:

我用过这个http://www.codeproject.com/Articles/484616/MVVM-Diagram-Designer,它是一个开源的,非常容易使用。 代码解释得很好。

【讨论】:

【参考方案11】:

它不是 .NET,但用于渲染图形的常用工具包是 AT&T Graphviz。我自己只使用过独立的应用程序,但源代码是在类似于开源许可的情况下提供的。

Graphviz 被流行的代码文档工具doxygen 用于自动为其生成的文档绘制各种图表。

【讨论】:

我在几年前写的 .NET 程序集依赖分析器中使用了 Graphviz。它非常简单,但只输出位图或 SVG,需要在客户端安装,然后是 COM 互操作。这还不错,但不是我所希望的! 如果有人有兴趣看到一些通过 COM 使用 WinGraphViz 的粗略代码,请参阅 drewnoakes.com/code/dependancyanalyser ...该代码是针对 VS2003 的,承认代码是我的有点尴尬,但它明白了重点。 我怀疑通过将 dot 移植到托管 C++ 来替换它的胆量是可能的,但并不容易。我使用命令行工具快速绘制状态机等。 Dot 也会输出 PostScript,满足我的需求。【参考方案12】:

去年夏天,当我做一些涉及图表的工作时,我发现并不太昂贵的最佳选择是在 SVG 中手动完成,即从一堆字符串中写出一个 SVG 文件,然后将其渲染为图像使用 Inkscape。

这不是一个快速简单的解决方案,但它确实允许近乎无限的自定义,因此如果您必须组织图表或基于连接等进行空间组织,这可能会很好。

【讨论】:

【参考方案13】:

Northwoods 在其GoLayout 产品中提供了纯.NET 解决方案。它们提供树、力导向和分层有向图(这不是 Sujiyama 效应,但对于许多(如果不是大多数)数据集来说并不算太远)。 1790 美元/座,价格昂贵。还有一些限制:最重要的是,它们的实现是为“人类可读”图设计的。我已经给它提供了超过 5,000 个节点的数据集并且没有问题,但是我也可以生成少于 500 个节点的数据集,这会导致它出现堆栈溢出(递归太深)。根据您的域,它可能(或可能不)非常适合。如果您需要处理任何数据集的通用布局包,我建议使用 GraphViz 而不是 Northwoods。

我还没有使用过他们的任何 WPF 功能,但我知道他们拥有这些功能。我在 WinForms 领域使用他们的东西已经有一段时间了。

【讨论】:

【参考方案14】:

我一直在玩 GLEE/MSAGL,实际布局本身足以满足我的需要,但是我希望能够更好地控制节点内部的实际内容,而不仅仅是像这样的单个值现在。

例如,我希望在单击节点中的扩展器之前隐藏“详细信息”,或者双击节点或用鼠标悬停。

假设 GLEE 无法做到这一点,现在是否有任何可用的纯 .NET 解决方案可以做到这一点?

【讨论】:

以上是关于.NET 中的有向图或无向图布局都有哪些可用选项?的主要内容,如果未能解决你的问题,请参考以下文章

无向图和有向图的详细讲解

用于有向图的 Python igraph 密度函数

树是有向图还是无向图?

LayoutAnimation.Types 都有哪些可用选项

贪心算法之最小生成树(Prim和kruskal算法)

循环有向图和无向图