【问题标题】:new Graph in Mathematica 8.0Mathematica 8.0 中的新图表
【发布时间】:2010-11-29 08:04:02
【问题描述】:
  1. 有没有人想出在 Mathematica 8 中修改 Graph 对象的方法?特别是,如何获得与右键单击图表时相同的功能。

  2. 一些新的图形函数与Combinatorica 冲突,有没有办法强制 Mathematica 使用该函数的内置版本?换句话说,有没有办法在我执行Needs["Combinatorica"] 之后访问内置的CompleteGraph,它导入了CompleteGraph 的Combinatorica 版本?

为了澄清 1,Graph 上的上下文菜单可让您更改 GraphStyle 和 GraphLayout,我希望能够以编程方式更改它们。这是我发现更改 Graph 对象的 GraphStyle 的一种方法

g = GridGraph[{4, 4}];
BooleanGraph[Or, g, g, GraphStyle -> "DiagramBlack"]

但是,这会忘记原始图形的选项,例如 VertexCoordinates

在网格图上尝试 Brett 的配方

g = GridGraph[{3, 2}, ImageSize -> Tiny]
coords = PropertyValue[{g, #}, VertexCoordinates] & /@ VertexList[g];
Graph[EdgeList[g], GraphStyle -> "BasicGold", 
 VertexCoordinates -> coords, ImageSize -> Tiny]


(来源:yaroslavvb.com

Mathematica 如何处理图形操作中的图形坐标似乎存在错误。下面的第一行置换坐标,第二行给出内部警告,可能与坐标有关。对每个顶点使用非整数顶点和显式坐标没有帮助。一种解决方案是全局存储坐标并具有fixCoordinates 功能,以便在修改后将正确的坐标重新分配给Graph

VertexDelete[GridGraph[{3, 3}], 1]
NeighborhoodGraph[VertexDelete[GridGraph[{3, 3}], 1], 2]

【问题讨论】:

  • 回复。 2.: System`CompleteGraph?
  • Re#2,您可以从上下文路径中删除 Combinatorica -- 然后使用显式完整路径引用所有 Combinatorica 函数...
  • 如何从上下文路径中删除?
  • $ContextPath = DeleteCases[$ContextPath, "Combinatorica`"]

标签: wolfram-mathematica


【解决方案1】:

新的 Graph 对象在 Mathematica 8 中是原子的。因此,像字符串或图像一样,它们没有可以以正常方式操作的内部结构。特别不寻常的是,新对象具有 看起来 可以象征性操作的 FullForm。但外观可能具有欺骗性 - 不仅模式匹配无法访问该表示,而且如果您使用复制粘贴将其反馈给 Mathematica,它甚至不是有效的图形规范。

我发现了一些可用于操纵图形结构的技巧。第一个尝试使用“官方”渠道来提取图形的属性:

adjustedGraph[g_, newOptions___] :=
  Graph[
    VertexList@g,
    EdgeList@g,
    newOptions,
    Sequence@@Table[p -> PropertyValue[g, p], {p, PropertyList[g]}]
  ]

你可以这样使用这个函数:

g = GridGraph[{4, 4}, GraphStyle -> "DiagramBlack", ImageSize -> Tiny]
adjustedGraph[g, GraphStyle -> "BasicGold"]

此函数使用VertexListEdgeListPropertyValue 来提取图形属性。不幸的是,某些选项无法通过这种方式恢复。例如,Graphics 选项 ImageSize 使用此方法会丢失。

更令人发指的黑客利用 FullForm 的伪符号表示:

adjustedGraph2[g_, newOptions___] :=
  "Hold@" ~~ ToString[g, InputForm] //
  ToExpression //
  #[[1, 3]] & //
  Graph[VertexList@g, EdgeList@g, newOptions, Sequence @@ #] &

尽管它的本质是邪恶的,但第二个函数表现得更令人满意,因为它似乎保留了大多数图形选项。我说“大多数”,因为我还没有尝试过更深奥的选项,比如包装器、形状函数和事后分配的图形属性。无法保证此方法在 Wolfram 更改图形对象的表示时会保持不变(甚至现在它适用于所有可能的图形定义)。

应该有一种方法可以在没有 hack 的情况下实现这一点。我仍然希望有一些潜在的功能可以提供图形对象的完整符号表示。

对于加载 Combinatorica 包后出现的符号冲突,您仍然可以通过显式指定包名来访问原始符号,例如System`CompleteGraph。如果您希望系统符号优先于 Combinatorica 符号,您可以计算以下表达式来更改包搜索顺序:

$ContextPath =
  $ContextPath /.
    {x___, c : "Combinatorica`", y___, s:"System`", z___} :> {x, y, s, c, z}

我注意到 Wolfram 在您加载包时会发出可怕的警告消息,从而有效地弃用 Combinatorica 包。

【讨论】:

    【解决方案2】:

    下面会保留原图的顶点坐标。

    g = CompleteGraph[5];
    coords = PropertyValue[{g, #}, VertexCoordinates] & /@ VertexList[g];
    Graph[VertexList[g], EdgeList[g], GraphStyle -> "BasicGold", 
     VertexCoordinates -> coords]
    

    我认为类似的东西也可以保留其他选项,尽管我没有尝试过。

    【讨论】:

    • 这似乎改变了顶点的顺序,用例子更新
    • 这种行为似乎类似于 GraphPlot 有时会改变顶点顺序 stackoverflow.com/questions/4245946/…
    • 更新了答案以不置换 GridGraph 中的顶点。
    • 谢谢,这行得通。 VertexCoordinateRules 中的显式顶点还修复了 GraphPlot 中的顶点排列。顺便说一句,我偶然发现了这个更新,因为只有当评论是关于 X 的问题或 X 的答案时,stackoverflow 才会向 X 发送通知
    【解决方案3】:

    对于#2,您应该能够使用上下文区分两者。因此,System`CompleteGraph[5] 创建了一个新的 V8 图,而Combinatorica`CompleteGraph[5] 创建了一个旧的 Combinatorica 图。

    我不确定您在#1 中的确切含义,但您可以将图形转换为图形,然后上下文菜单将像以前一样出现。不过,我不太确定这是一种改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      相关资源
      最近更新 更多