代码之家  ›  专栏  ›  技术社区  ›  Yaroslav Bulatov

Mathematica 8.0中的新图

  •  8
  • Yaroslav Bulatov  · 技术社区  · 15 年前
    1. 有没有人想出一种方法来修改Mathematica 8中的图形对象?特别是,如何获得与右键单击图形时获得的功能相同的功能。

    2. 一些新的图函数与 Combinatorica ,是否有方法强制Mathematica使用函数的内置版本?换句话说,有没有办法访问内置的 CompleteGraph 在我做了之后 Needs["Combinatorica"] 它导入了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如何处理图形操作中的图形坐标似乎有一个缺陷第一行位于permutes坐标之下,第二行给出内部警告,可能与坐标有关。对每个顶点使用非整数顶点和显式坐标没有帮助。一种解决方案是全局存储坐标 fixCoordinates 重新分配正确坐标的函数 Graph 修改后

    VertexDelete[GridGraph[{3, 3}], 1]
    NeighborhoodGraph[VertexDelete[GridGraph[{3, 3}], 1], 2]
    
    3 回复  |  直到 6 年前
        1
  •  14
  •   WReach    15 年前

    新的图形对象在Mathematica 8中是原子的。因此,像字符串或图像一样,它们没有可以以正常方式操作的内部结构。特别不寻常的是新的物体有一个完整的 就像它可以被象征性地操纵一样。但是外观是有欺骗性的——不仅模式匹配无法访问该表示,而且如果使用复制和粘贴将其反馈给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"]
    

    此函数使用 顶点列表 , 边缘学家 属性值 提取图形属性。不幸的是,有些期权无法通过这种方式收回。例如 绘图 选项 图像大小 使用此方法将丢失。

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

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

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

    应该有一种不用黑客就能实现的方法。我仍然希望有一些函数隐藏在那里,可以给出图形对象的完整符号表示。

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

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

    我注意到Wolfram在加载combinatica包时发出了一条可怕的警告消息,这实际上是在否定combinatica包。

        2
  •  4
  •   Sjoerd C. de Vries    14 年前

    下面将保留原始图形的顶点坐标。

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

    Mathematica graphics

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

        3
  •  3
  •   kennytm    15 年前

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

    我不确定你在1中的确切意思,但你可以将图形转换为图形,然后上下文菜单将像以前一样出现。不过,我不确定这是否是一个进步。