我只是花了几个小时试图将使用Mathematica 7的GraphPlot的some old code转换为使用新的Mathematica 8 Graph函数。这似乎是明智的做法,因为新的图形绘制要好得多,并且内置了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中-使用here之类的功能从Graph布局获取顶点坐标,并使用GraphPlot将其存储在Graph对象中这是notebook,展示了这些用例和其他一些用例
09-26 14:21