Mathematica 8.0中的新图表

时间:2010-11-29 08:04:02

标签: wolfram-mathematica

  1. 有没有人想出一种在Mathematica 8中修改Graph对象的方法?特别是,如何在右键单击图表时获得相同的功能。

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

  3. 为了澄清1,Graph上的Context Menu允许您更改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]
    

    http://yaroslavvb.com/upload/save/mathematica-change-style.png

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

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

3 个答案:

答案 0 :(得分:14)

新的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"]

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

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

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

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

应该有办法在没有黑客的情况下实现这一目标。我仍然希望有一些功能潜伏在那里,它将给出图形对象的完整符号表示。

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

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

我注意到Wolfram在加载软件包时发出了一条可怕的警告消息,实际上是在弃用Combinatorica软件包。

答案 1 :(得分:4)

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

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

Mathematica graphics

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

答案 2 :(得分:3)

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

我不确定你在#1中究竟是什么意思,但你可以将图形转换为图形,然后上下文菜单将像以前一样出现。不过,我不太确定这是一种改进。