Mathematica中的多图8

Sim*_*mon 15 wolfram-mathematica graph

我花了几个小时试图转换一些使用Mathematica 7的旧代码GraphPlot来使用新的Mathematica 8 Graph函数.这似乎是明智的,因为新的图形绘制更好,它有像KirchhoffMatrixAdjacencyMatrix和内置的东西.

问题是我无法弄清楚如何在Mma 8中使用多边的图形.

我用作规范示例的Feynman图是双回路真空图

GraphPlot[{1 -> 2, 1 -> 2, 1 -> 2}, MultiedgeStyle -> .5, 
          DirectedEdges -> True, VertexCoordinateRules -> {{-1, 0}, {1, 0}}]
Run Code Online (Sandbox Code Playgroud)

双环真空日落图

试图在Mma 8中制作类似的图表

Graph[{DirectedEdge[1, 2], DirectedEdge[1, 2], DirectedEdge[1, 2]}, 
      VertexCoordinates -> {{-1, 0}, {1, 0}}]
Run Code Online (Sandbox Code Playgroud)

产生错误消息

Graph::supp: Mixed graphs and multigraphs are not supported. >>
Run Code Online (Sandbox Code Playgroud)

如何使用Mathematica 8的Graph[]对象构建(和使用)类似的图形?

编辑: Mathematica 9中仍存在此问题

Yar*_*tov 15

我经历了类似的尝试Graph用于所有事情的过程,并发现它不会取代CombinatoricaGraphPlot.最好的用法Graph是将它用作容器类型来存储顶点+边+坐标.

例如,Combinatorica教程的"算法图论"中的大多数函数都不适用于新Graph对象.当我与WRI开发人员讨论Graph项目时,我的理解是提供所有Combinatorica功能Graph并不是优先考虑的因为设计目标是提供以算法无关的方式解决任务的方法.例如,您可能有方法为新Graph对象找到顶点覆盖和图形着色,但对于像Brelaz着色和贪婪顶点覆盖这样的算法特定任务,您可能始终必须遵循Combinatorica.

除了多图形之外,某些图形布局不适用于Graph对象.你不能修复一些顶点坐标,让自动布局完成剩下的工作.而且,布局LayeredGraphPlot是不可用,且有时优选超过GraphLayeredDrawing.

以获得最佳的3个世界的方式是使用Graph对象为主要手段图形库,并为包装GraphPlot,CombinatoricaGraphUtilities接受函数Graph对象

一些用例:

  • 你需要从一些算法CombinatoricaGraphUtilities-做一个包装someAlgorithm是需要Graph的对象,将其转换为边缘或列表Combinatorica图(GraphUtilities'ToCombinatoricaGraph有利于),运行算法,将其转换回Graph对象,同时注意设置正确GraphStyle,并VertexCoordinates从原来的图形对象.由于冲突,请确保Combinatorica并且GraphUtilities不在上下文路径上,我使用$ Pre 执行此操作

  • 您需要一些像这里的自定义图形图或多边图形 - 创建一个someGraphPlot接受Graph对象的包装函数,将其转换为正确的表示,然后使用GraphPlot或者创建一个Graph具有自定义顶点/边缘形状的临时对象一个情节.请注意,您可以使用附加属性到边缘,SetProperty以便以Graph这种方式存储多图形.

  • 你想使用GraphPlot布局和存储坐标之一Graph- 使用这里的函数从GraphPlot布局中获取顶点坐标,并Graph使用它们将它们存储在对象中VertexCoordinates

这是一个笔记本,展示了这些用例和其他一些用例


Sjo*_*ies 9

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]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者对于选定的边缘:

Graph[{1 \[DirectedEdge] 2, 2 \[DirectedEdge] 3, 3 \[DirectedEdge] 1},
  EdgeShapeFunction -> {3 \[DirectedEdge] 1 -> ef}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

函数ef可以很容易地参数化,以绘制边数.