我刚刚花了几个小时尝试转换some old code它使用 Mathematica 7 的 GraphPlot 来使用新的 Mathematica 8 图形函数。这似乎是明智的,因为新的图形绘制更好,并且它具有诸如 AdjacencyMatrix
和 KirchhoffMatrix 之类的东西。内置。
问题是我无法弄清楚如何让具有多条边的图在 Mma 8 中工作。
我用作典型示例的费曼图是双环真空图
GraphPlot[{1 -> 2, 1 -> 2, 1 -> 2}, MultiedgeStyle -> .5,
DirectedEdges -> True, VertexCoordinateRules -> {{-1, 0}, {1, 0}}]
尝试在 Mma 8 中制作类似的图表
Graph[{DirectedEdge[1, 2], DirectedEdge[1, 2], DirectedEdge[1, 2]},
VertexCoordinates -> {{-1, 0}, {1, 0}}]
产生错误消息
Graph::supp: Mixed graphs and multigraphs are not supported. >>
如何使用 Mathematica 8 的 Graph[]
对象构建(并使用)类似的图表?
编辑:这个问题在 Mathematica 9 中仍然存在
最佳答案
我经历了类似的尝试使用Graph
的过程对于一切,发现它并不能取代 Combinatorica
和GraphPlot
。 Graph
的最佳用途就是用它作为容器类型来存储顶点+边+坐标。
例如Combinatorica
的《算法图论》中的大部分函数新手教程不可用 Graph
对象。当我在 Graph
上与 WRI 开发人员交谈时项目,我的理解是提供所有 Combinatorica
Graph
的功能不是优先事项,因为设计目标是提供以与算法无关的方式解决任务的方法。例如,您可能有方法找到新的 Graph
的顶点覆盖和图形着色。对象,但对于 Brelaz 着色和贪婪顶点覆盖等算法特定任务,您可能始终必须遵循 Combinatorica
.
除了多图表之外,某些图表布局不适用于 Graph
对象。您不能修复某些顶点坐标并让自动布局完成其余的工作。另外,LayeredGraphPlot
的布局不可用,有时是 preferred超过Graph
的LayeredDrawing
.
充分利用 3 个世界的方法是使用 Graph
对象作为图形存储的主要工具并为 GraphPlot
制作包装器, Combinatorica
和GraphUtilities
接受 Graph
的函数对象
一些用例:
您需要
Combinatorica
中的一些算法或GraphUtilities
-- 制作包装器someAlgorithm
这需要Graph
对象,将其转换为边列表或Combinatorica
图(GraphUtilities'ToCombinatoricaGraph
很有帮助),运行算法,将其转换回Graph
对象,注意设置正确GraphStyle
和VertexCoordinates
来自原始图形对象。由于冲突,请确保Combinatorica
和GraphUtilities
不在上下文路径上,我 do it使用 $Pre您需要一些自定义图表,例如 here ,或者多边图——制作一个包装函数
someGraphPlot
接受Graph
对象,将其转换为正确的表示形式,然后使用GraphPlot
或者也许创建一个临时的Graph
出于这一目的,具有自定义顶点/边缘形状的对象。请注意,您可以使用SetProperty
将属性附加到边缘。这样您就可以将多重图存储在Graph
中就这样。您想使用
GraphPlot
之一布局和存储坐标Graph
-- 使用类似 here 的函数从GraphPlot
获取顶点坐标布局,并将它们存储在Graph
中对象使用VertexCoordinates
这是一个notebook演示这些用例和其他一些用例
关于graph - Mathematica 8 中的多重图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485405/