有没有人想出一种在Mathematica 8中修改Graph对象的方法?特别是,如何在右键单击图表时获得相同的功能。
一些新的图形函数与Combinatorica
冲突,是否有办法强制Mathematica使用函数的内置版本?换句话说,在我CompleteGraph
导入Combinatorica版Needs["Combinatorica"]
后,有没有办法访问内置CompleteGraph
?
为了澄清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]
答案 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]
我认为类似的东西也可以保留其他选项,但我还没有尝试过。
答案 2 :(得分:3)
对于#2,您应该能够使用上下文区分两者。因此,System`CompleteGraph[5]
会创建一个新的V8图表,而Combinatorica`CompleteGraph[5]
会创建一个旧的Combinatorica图表。
我不确定你在#1中究竟是什么意思,但你可以将图形转换为图形,然后上下文菜单将像以前一样出现。不过,我不太确定这是一种改进。