Mathematica 8.0中的新图形功能

8
  1. 有人找到了一种在Mathematica 8中修改图形对象的方法吗?特别是如何获得右键单击图形时获取的相同功能。

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

为了澄清第一个问题,图形上下文菜单可以更改图形样式和布局,我想以编程方式进行更改。这里是我发现的一种更改图形对象的图形样式的方法:

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在图形操作中处理图形坐标时似乎存在一个bug。第一行代码会对坐标进行排列,第二行代码会给出内部警告,可能与坐标有关。使用非整数顶点和每个顶点的显式坐标也无法解决问题。其中一种解决方案是全局存储坐标,并在修改后使用fixCoordinates函数重新分配正确的坐标给Graph

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

2
关于第二点:System`CompleteGraph? - Andrew Moylan
您可以从上下文路径中删除Combinatorica,然后使用显式的完整路径引用所有Combinatorica函数... - Simon
如何从上下文路径中移除? - Yaroslav Bulatov
1
$ContextPath = DeleteCases[$ContextPath, "Combinatorica`"] - Simon
3个回答

14

在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 改变图形对象表示方式的情况下不改变工作方式(或者它现在适用于所有可能的图形定义)。

应该有一种方法可以通过正常手段实现这一点。我仍然希望能够找到某个隐藏在那里的函数,能够给出完整的符号表示图形对象。

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

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

我注意到 Wolfram 正在通过加载警告信息来有效地弃用 Combinatorica 包。


4
以下内容将保留原图的顶点坐标。
g = CompleteGraph[5];
coords = PropertyValue[{g, #}, VertexCoordinates] & /@ VertexList[g];
Graph[VertexList[g], EdgeList[g], GraphStyle -> "BasicGold", 
 VertexCoordinates -> coords]

Mathematica 图形

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


似乎更改了顶点的顺序,附带示例更新。 - Yaroslav Bulatov
这种行为似乎类似于GraphPlot,有时会导致顶点顺序的置换。https://dev59.com/0lLTa4cB1Zd3GeqPXBSR#4250069 - Yaroslav Bulatov
更新了答案,不再对GridGraph的顶点进行排列。 - Brett Champion
谢谢,那个有效。在VertexCoordinateRules中显式指定顶点也可以修复GraphPlot中的顶点排列。顺便说一句,我是偶然发现这个更新的,因为stackoverflow只有在评论X的问题或X的答案时才会向X发送通知。 - Yaroslav Bulatov

3
对于问题 #2,您应该能够使用上下文来区分两者。因此,System`CompleteGraph[5] 创建一个新的 V8 图,而 Combinatorica`CompleteGraph[5] 创建一个旧的 Combinatorica 图。
对于问题 #1,我不确定您的意思,但是您可以将图形转换为图形,然后上下文菜单将像以前一样出现。但我不确定这是否是一种改进。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接