【问题标题】:ShowGraph[ { {e1,e2}, {e1, e3} }, {e1,e2,e3} ]; // what is the problem here?ShowGraph[ { {e1,e2}, {e1, e3} }, {e1,e2,e3} ]; // 这里有什么问题?
【发布时间】:2010-05-31 06:24:28
【问题描述】:

在 Mathematica Graph Theory 包“Combinatorica”中不显示指定的图形。

【问题讨论】:

  • 说什么?我们需要更多细节、代码示例、解释、编程平台/语言……任何东西……
  • 这实际上是 StackOverflow 上的一个很好的问题,尽管它可以更清晰(也许将代码放入问题正文而不是标题)。需要大量研究 Mathematica 文档才能显示 hello-world 样式的图表。
  • @TheMachineCharmer : ShowGraph[];
  • @rockinthesixstring : 让我再赚一个声望,然后我可以在上面添加一个信息图像
  • @Sazzad 你问了 7 个问题,但从未接受过答案……尝试改进它!

标签: graph wolfram-mathematica


【解决方案1】:

需要注意的重要一点是,Mathematica 有两个或多或少独立的图形框架:一个包含在Combinatorica 包和GraphUtilities 包中。

我的经验有限,Combinatorica 包是一台相当大的机器,可以投入使用,你真的必须了解框架才能使用它。 另一方面,GraphUtilities 非常直观,有更多的图形自定义选项和更多的 Mathematica 感觉。

要绘制示例图,您只需要

Needs["GraphUtilities`"]
GraphPlot[{e1 -> e2, e1 -> e3}, VertexLabeling -> True, DirectedEdges -> True]

【讨论】:

  • 不适用于 Mathematica 5。可能是 Mathematica 7 的新增功能。
  • +1 指出还有一个图形绘图包:GraphUtilities。但它似乎是自动加载的。不需要 Needs["GraphUtilities`"]?
【解决方案2】:

如果您想要一个具有 3 个顶点且边在顶点 1 和顶点 2 之间以及顶点 1 和顶点 3 之间的通用无向图,则可以使用以下方法:

Needs["Combinatorica`"]
ShowGraph@AddEdges[EmptyGraph[3], {{1, 2}, {1, 3}}]

有关生成、显示和分析图表的更多信息,请跳至 Mathematica 中的“表示图” Combinatorica Tutorial.

【讨论】:

  • Combinatorica Tutorial 说,“一个图被定义为一组带有一组边的顶点,其中一条边被定义为一对顶点。”让我上传一张图片来说明这一点。
  • 你能告诉我为什么以下不起作用:g = EmptyGraph[3]; g = AddEdges[{{1, 2}, {1, 3}}];显示图[g];
  • @Sazzad 它不起作用,因为 AddEdges 语法错误。试试 ..g = EmptyGraph[3]; g = AddEdges[g, {{1, 2}, {1, 3}}];
【解决方案3】:

好的,谢谢大家。让我收拾所有这些讨论。首先,正如 Janus 所提到的,在 Mathematica 中有两种绘制图形的方法。首先,Combinatorica 方式,它是一个插件。其次,GraphPlot 方式,它是一个原生的 Mathematica 实现来绘制图形。 GraphPlot 使用 Spring 布局来绘制图形。正如 dreeves 所说,我们使用 ShowGraph[] 以 Combinatorica 的方式绘制图形。

要理解为什么上述代码不起作用,我们必须非常了解 ShowGraph[] 命令。 Mathematica 7 定义,

ShowGraph[g] 显示图形 g。

现在,什么是图?

Graph[e , v, opts] 表示一个图形对象,其中 e 是带有图形选项注释的边列表,v 是带有图形注释的顶点列表options,而 opts 是一组全局图形选项”

问题是 Combinatorica 似乎不能完全按照上面定义的方式工作。让我们检查一下……假设您创建了一个名为 g 的 Combinatorica 图。现在g[[0]] 将打印Graphg[[1]] 将打印边缘列表,g[[2]] 将打印opts。顶点列表在哪里??

如上所示,您可以手动创建g[[1]]g[[2]] 并将其提供给Graph。让我们创建它:

e = {{1,2}, {{1,3}}}
opts = {{{0,0}}, {{-5,5}}, {{5,5}}}
g = Graph[e, opts]

这将创建一个包含顶点 1、2 和 3 的图形。现在,如何标记它们?在 Combinatorica 中,您可以使用 ShowGraph[] 的 VertexLabel 选项来执行此操作。如果您使用 VertexLabel->True 它将只显示默认标签,即此处的 1、2 和 3。要使用您自己的标签,请执行以下操作:

ShowGraph[g, VertexLabel->{a,b,c}]

很有趣,对吧? :)。

现在我的问题的确切答案。上述代码的问题是由于使用了文字值而不是整数。 Combinatorica 仅将整数值作为边或顶点列表除外。

请记住,尽管它可能只对创建小图有用。对于较大的图形,您应该使用默认图形生成器来创建图形。就像,对于随机图使用:

g = Random[10, 0.23]

将创建一个有 10 个顶点的图,边概率为 0.23。

瓦卡,瓦卡,
这次是 Combinatorica!

【讨论】:

    【解决方案4】:
    ShowGraph[
     Graph[
     {{{1, 2}}, {{2, 3}}, {{3, 1}}}, 
     {{{0, 0}, VertexLabel -> v1}, 
      {{2, 5}, VertexLabel -> v2}, 
      {{5, 5}, VertexLabel -> v3}}
     ]
    ]
    

    我认为以上内容就是您要找的。

    Combinatorica 创建 Graph 对象的方式,看起来很繁琐。我认为创建一个中间函数会更容易,它会产生 Graph 对象,其语法与 GraphPlot 相似。这样您就不必显式写出顶点坐标,也不必使用繁琐的 {{x,y},opts} 表示法,当您没有指定选项时,它会变成 {{x,y}}。

    所以,你可以有这样的功能:

    myGraphPlot[{{e1,e2},{e1,e3}},{e1,e2,e3}]
    

    在顶部生成代码。

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 2020-01-03
      • 2012-12-22
      • 2014-05-28
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多