wolfram-mathematica - Mathematica 8.0中的新图

标签 wolfram-mathematica

  • 是否有人找到了在Mathematica 8中修改Graph对象的方法?特别是,如何获得与右键单击图形时所获得的功能相同的功能。
  • 一些新的图形函数与Combinatorica冲突,有没有一种方法可以强制Mathematica使用该函数的内置版本?换句话说,在我导入了Combinatorica版本的CompleteGraphNeeds["Combinatorica"]之后,是否有办法访问内置的CompleteGraph

  • 为了澄清1,图上的上下文菜单使您可以更改GraphStyle和GraphLayout,我希望能够以编程方式进行更改。这是我发现更改Graph对象的GraphStyle的一种方法
    g = GridGraph[{4, 4}];
    BooleanGraph[Or, g, g, GraphStyle -> "DiagramBlack"]
    

    但是,这忘记了原始图的选项,例如VertexCoordinates
    在网格图上尝试布雷特的食谱
    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]
    

    最佳答案

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

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

    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更改图形对象的表示形式时该方法将保持不变(甚至现在也不能用于所有可能的图形定义)。

    应该有一种没有黑客的方法来实现这一目标。我仍然希望有潜伏在其中的功能可以给出图形对象的完整符号表示。

    至于加载Combinatorica软件包后出现的符号冲突,您仍然可以通过显式指定软件包名称来访问原始符号,例如系统`CompleteGraph。如果您希望系统符号优先于Combinatorica符号,则可以评估以下表达式以更改包搜索顺序:
    $ContextPath =
      $ContextPath /.
        {x___, c : "Combinatorica`", y___, s:"System`", z___} :> {x, y, s, c, z}
    

    我注意到Wolfram通过在加载软件包时发出可怕的警告消息来有效地弃用Combinatorica软件包。

    关于wolfram-mathematica - Mathematica 8.0中的新图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4301833/

    相关文章:

    wolfram-mathematica - 将函数映射到列表时如何删除额外的 {}

    wolfram-mathematica - 添加列表的最后两个元素

    syntax - 零件和跨度 : is there a reason this *should* not work?

    wolfram-mathematica - 帮助格式化我的笔记本。从 'code' 样式到输入样式

    wolfram-mathematica - 您如何在Mathematica中访问ARGV?

    wolfram-mathematica - 关于 "smart"在 mathematica 中替换的问题

    c# - 命令 "nb = NotebookCreate[]"在 Mathematica 中失败?

    formatting - 在笔记本中为 Mathematica 中笔记本的各个部分创建 OpenerView

    geometry - 在 Mathematica 中将点从 4d 空间投影到 3d 空间

    image-processing - 在 Mathematica 中重建图像