2011-03-30 38 views
14

我刚花了几个小时试图转换使用Mathematica 7的GraphPlotsome old code以使用新的Mathematica 8 Graph函数。这似乎明智的,因为新的图形绘制是好得多,它有像AdjacencyMatrixKirchhoffMatrix事情内置的。Mathematica中的多图形8

问题是,我无法弄清楚如何获得与多个边缘曲线在MMA的8个工作。

我作为我的典型的例子使用的费曼图表是两个回路真空图表

GraphPlot[{1 -> 2, 1 -> 2, 1 -> 2}, MultiedgeStyle -> .5, 
      DirectedEdges -> True, VertexCoordinateRules -> {{-1, 0}, {1, 0}}] 

two-loop vacuum sunset graph

设法使类似的图在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[]对象类似的图形?

编辑:这个问题仍然在数学9

+2

在Mma8中浮动的三种不同的图形类型对象不会产生问题......尤其是因为它们不能很好地一起玩。 – Simon 2011-03-30 11:00:34

回答

14

我经历了一个类似的尝试使用Graph的过程,发现它并不代替CombinatoricaGraphPlotGraph的最佳用途是将其用作存储顶点+边+坐标的容器类型。

例如,来自Combinatorica教程的“算法图论”的大部分函数不适用于新的Graph对象。当我与WRI开发人员讨论Graph项目时,我的理解是提供Graph的所有Combinatorica函数并不是一个优先事项,因为设计目标是提供以算法不可知的方式解决任务的方法。例如,您可能有方法为新的Graph对象查找顶点覆盖和图形着色,但对于布雷拉兹着色和贪婪顶点覆盖等算法特定任务,您可能总是需要推迟到Combinatorica

除了多图形之外,某些图形布局不适用于Graph对象。你不能修复一些顶点坐标,让剩余的自动布局完成。此外,LayeredGraphPlot的布局不可用,有时preferredGraphLayeredDrawing

,以获得最佳的3个世界的方式是使用Graph对象作为主要用于汽车图形库,使包装的接受Graph对象

一些使用情况GraphPlotCombinatoricaGraphUtilities功能:

  • 您需要CombinatoricaGraphUtilities中的一些算法 - 制作包含someAlgorithm的对象,将其转换为边缘列表或Combinatorica图形(GraphUtilities'ToCombinatoricaGraph有帮助),运行该算法,将其转换回Graph对象,注意从原始图形对象设置正确的GraphStyleVertexCoordinates。由于冲突,确保CombinatoricaGraphUtilities没有上下文路径上,我do it使用$预

  • 你需要像here,或多边图的一些自定义图表阴谋 - 让接受Graph的包装功能someGraphPlot对象,将其转换为正确的表示形式,然后使用GraphPlot或者为此目的创建一个具有自定义顶点/边缘形状的临时对象Graph。请注意,您可以使用SetProperty将属性附加到边缘,以便您可以以这种方式将Graph中的多图形存储起来。

  • 你想用的GraphPlot布局之一,商店坐标Graph - 使用功能类似here使用VertexCoordinates

这里有一个notebook得到顶点从GraphPlot布局坐标,并将其存储在Graph对象演示这些用例以及其他一些用例

+0

谢谢雅罗斯拉夫。所有的好建议和有趣的评论,所以我会给你“剔”。不幸的是,这个代码比我想要做的还要多,目前我用得不多。希望在我回到这个项目的时候,世界资源研究所将填补空白(推断他们的发布周期,到明年我们应该有v9或v10)。 – Simon 2011-04-09 02:51:03

2

这些还不支持存在,我想:

In[201]:= AdjacencyGraph[{{0, 3}, {0, 0}}] 

During evaluation of In[201]:= Graph::supp: Mixed graphs and multigraphs are not supported. >> 

Out[201]= AdjacencyGraph[{{0, 3}, {0, 0}}] 

虽然这可能不是你希望得到的答案。

+0

我觉得很奇怪,这种类型的输入不起作用 - 因为支持加权邻接矩阵。 – Simon 2011-04-03 02:00:02

8

的GraphPlot功能仍然在MMA工作8

多重图均未Combinatorica的功能支持两种。在adjecency矩阵中也很难实现。也许与EdgeWeight工作可能在计算?

对于绘制多个链接,我可以想象'EdgeShapeFunction'可能会帮助你。

ef[pts_List, e_] := 
Block[{g1 = 
    Insert[pts, (pts[[1]] + pts[[-1]])/ 
     2 + ({x, y}/5 /. 
     Solve[{Norm[{x, y}] == 1, (pts[[1]] - pts[[-1]]).{x, y} == 
      0}, {x, y}][[1]]), Round[(Length[pts] + 1)/2]], 
    g2 = Insert[ 
    pts, (pts[[1]] + pts[[-1]])/ 
     2 + (-{x, y}/5 /. 
     Solve[{Norm[{x, y}] == 1, (pts[[1]] - pts[[-1]]).{x, y} == 
      0}, {x, y}][[1]]), Round[(Length[pts] + 1)/2]]}, {Arrow[ 
    BSplineCurve[g1]], Arrow[BSplineCurve[g2]], Arrow[pts]}] 

Graph[{1 \[DirectedEdge] 2, 2 \[DirectedEdge] 3, 3 \[DirectedEdge] 1}, 
    EdgeShapeFunction -> ef] 

enter image description here

或用于选定的边:

Graph[{1 \[DirectedEdge] 2, 2 \[DirectedEdge] 3, 3 \[DirectedEdge] 1}, 
    EdgeShapeFunction -> {3 \[DirectedEdge] 1 -> ef}] 

enter image description here

功能EF可以容易地参数化用于边缘绘制的数目。

+0

谢谢Sjoerd。我可以想象勾起这样一个'EdgeShapeFunction'来自动检查整数加权边缘 - 所以你的'eft'是非常有用的有用代码。但是我现在完全失去了更新代码的热情......我稍后再回来,或者等待WRI清理他们的Graph代码。 – Simon 2011-04-09 02:47:22