Wolfram mathematica Mathematica 8.0中的新图形

Wolfram mathematica Mathematica 8.0中的新图形,wolfram-mathematica,Wolfram Mathematica,有人想出办法修改Mathematica 8中的图形对象吗?特别是,如何获得与右键单击图形时相同的功能 一些新的图形函数与Combinatica冲突,有没有办法强制Mathematica使用内置版本的函数?换句话说,在导入CompleteGraph的Combinatica版本后,是否有办法访问内置的CompleteGraph 为了澄清1,Graph上的上下文菜单允许您更改GraphStyle和GraphLayout,我希望能够以编程方式更改它们。我发现了一种改变Graph对象GraphStyle的

有人想出办法修改Mathematica 8中的图形对象吗?特别是,如何获得与右键单击图形时相同的功能

  • 一些新的图形函数与Combinatica冲突,有没有办法强制Mathematica使用内置版本的函数?换句话说,在导入CompleteGraph的Combinatica版本后,是否有办法访问内置的
    CompleteGraph

  • 为了澄清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]
    

    (来源:)

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

    VertexDelete[GridGraph[{3, 3}], 1]
    NeighborhoodGraph[VertexDelete[GridGraph[{3, 3}], 1], 2]
    
    对于#2,您应该能够使用上下文来区分两者。因此,
    System`CompleteGraph[5]
    创建了一个新的V8图,而
    combinatica`CompleteGraph[5]
    创建了一个旧的combinatica图


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

    以下内容将保留原始图形的顶点坐标

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


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

    新的图形对象在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"]
    
    此函数使用VertexList、EdgeList和PropertyValue提取图形属性。不幸的是,某些选项无法通过这种方式恢复。例如,使用此方法将丢失图形选项ImageSize

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

    adjustedGraph2[g_, newOptions___] :=
      "Hold@" ~~ ToString[g, InputForm] //
      ToExpression //
      #[[1, 3]] & //
      Graph[VertexList@g, EdgeList@g, newOptions, Sequence @@ #] &
    
    尽管第二个函数本质邪恶,但它的性能更令人满意,因为它似乎保留了大多数图形选项。我说“大多数”,因为我还没有尝试过更深奥的选项,比如包装器、形状函数和事后指定的图形属性。由于Wolfram更改了图形对象的表示形式(甚至现在它适用于所有可能的图形定义),因此无法保证此方法可以不变地工作

    应该有一种不用黑客就能做到这一点的方法。我仍然希望有一些函数潜伏在那里,能够给出图形对象的完整符号表示

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

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

    我注意到Wolfram在加载Combinatica包时发出了一条可怕的警告消息,从而有效地拒绝了Combinatica包。

    Re。2.:System`CompleteGraph?Re#2,您可以从上下文路径中删除Combinatica--然后使用显式的完整路径引用所有Combinatica函数…如何从上下文路径中删除?$ContextPath=DeleteCases[$ContextPath,“Combinatica`],这似乎会改变顶点的顺序,更新示例此行为与GraphPlot类似,GraphPlot有时会置换顶点顺序更新答案,以不置换GridGraph中的顶点。谢谢,这很有效。顶点坐标表中的显式顶点还修复了GraphPlot中的顶点置换。顺便说一句,我偶然发现这个更新,因为stackoverflow只在评论是关于X的问题或X的回答时才向X发送通知