Yar*_*tov 8 wolfram-mathematica
有没有人想出一种方法来修改Mathematica 8中的Graph对象?特别是,如何获得右键单击图表时获得的相同功能.
一些新的图形函数冲突Combinatorica
,有没有办法强迫Mathematica使用函数的内置版本?换句话说,有没有办法CompleteGraph
在我Needs["Combinatorica"]
输入Combinatorica版本之后获得内置的访问权限CompleteGraph
?
为了澄清1,Graph上的Context Menu允许您更改GraphStyle和GraphLayout,我希望能够以编程方式更改它们.这是我发现改变Graph对象GraphStyle的一种方法
g = GridGraph[{4, 4}];
BooleanGraph[Or, g, g, GraphStyle -> "DiagramBlack"]
Run Code Online (Sandbox Code Playgroud)
但是,这会忘记原始图形的选项 VertexCoordinates
在网格图上尝试Brett的食谱
g = GridGraph[{3, 2}, ImageSize -> Tiny]
coords = PropertyValue[{g, #}, VertexCoordinates] & /@ VertexList[g];
Graph[EdgeList[g], GraphStyle -> "BasicGold",
VertexCoordinates -> coords, ImageSize -> Tiny]
Run Code Online (Sandbox Code Playgroud)
http://yaroslavvb.com/upload/save/mathematica-change-style.png
Mathematica如何在图形操作上处理图形坐标似乎存在一个错误.下面第一行置换坐标,第二行给出内部警告,可能与坐标有关.对每个顶点使用非整数顶点和显式坐标没有帮助.一种解决方案是全局存储坐标,并具有在修改后fixCoordinates
重新分配正确坐标的功能Graph
VertexDelete[GridGraph[{3, 3}], 1]
NeighborhoodGraph[VertexDelete[GridGraph[{3, 3}], 1], 2]
Run Code Online (Sandbox Code Playgroud)
WRe*_*ach 14
新的Graph对象在Mathematica 8中是原子的.因此,像字符串或图像一样,它们没有可以以正常方式操作的内部结构.特别不寻常的是,新对象的FullForm 看起来像是可以象征性地操作.但外观可能是欺骗性的 - 不仅图形匹配无法获得该表示,而且如果使用复制粘贴将其反馈给Mathematica,它甚至不是有效的图形规范.
我发现了一些可以用来操纵图形结构的黑客攻击.第一个尝试使用"官方"通道来提取图形的属性:
adjustedGraph[g_, newOptions___] :=
Graph[
VertexList@g,
EdgeList@g,
newOptions,
Sequence@@Table[p -> PropertyValue[g, p], {p, PropertyList[g]}]
]
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用这个函数:
g = GridGraph[{4, 4}, GraphStyle -> "DiagramBlack", ImageSize -> Tiny]
adjustedGraph[g, GraphStyle -> "BasicGold"]
Run Code Online (Sandbox Code Playgroud)
此函数使用VertexList,EdgeList和PropertyValue来提取图形属性.不幸的是,有些选择无法通过这种方式恢复.例如,使用此方法将丢失Graphics选项ImageSize.
更令人发指的黑客利用了FullForm的伪符号表示:
adjustedGraph2[g_, newOptions___] :=
"Hold@" ~~ ToString[g, InputForm] //
ToExpression //
#[[1, 3]] & //
Graph[VertexList@g, EdgeList@g, newOptions, Sequence @@ #] &
Run Code Online (Sandbox Code Playgroud)
尽管它具有邪恶的性质,但它的第二个功能表现得更令人满意,因为它似乎保留了大多数图形选项.我说"最",因为我还没有尝试过更多深奥的选项,比如包装,形状函数和事后分配的图形属性.由于Wolfram更改了图形对象的表示(或者甚至它现在适用于所有可能的图形定义),因此无法保证此方法不会保持不变.
应该有办法在没有黑客的情况下实现这一目标.我仍然希望有一些功能潜伏在那里,它将给出一个图形对象的完整符号表示.
至于加载Combinatorica包后出现的符号冲突,您仍然可以通过显式指定包名称来访问原始符号,例如System`CompleteGraph.如果您希望系统符号优先于Combinatorica符号,则可以评估以下表达式以更改包搜索顺序:
$ContextPath =
$ContextPath /.
{x___, c : "Combinatorica`", y___, s:"System`", z___} :> {x, y, s, c, z}
Run Code Online (Sandbox Code Playgroud)
我注意到Wolfram通过在加载包时发出可怕的警告消息来实际上弃用Combinatorica包.