Wolfram mathematica 防止Mathematica 8中图形[]对象的自动布局
在Mathematica中,某些类型的对象具有特殊的输入/输出格式。这包括Wolfram mathematica 防止Mathematica 8中图形[]对象的自动布局,wolfram-mathematica,mathematica-8,Wolfram Mathematica,Mathematica 8,在Mathematica中,某些类型的对象具有特殊的输入/输出格式。这包括图形、光栅图像,以及从Mathematica 8开始的图形(图形[])。不幸的是,大型图形可能需要很长时间才能可视化,这比我在交互工作中对它们执行的大多数其他操作要长得多 如何防止以标准形式和传统形式自动布局图形[]对象,并将其显示为例如-Graph-,最好保留输出的可解释性(可能使用解释?)。我认为这将涉及以某种方式更改格式和/或Makebox,但我没有成功地使其发挥作用 我希望以可逆的方式执行此操作,并且最好定义一个函
图形
、光栅图像,以及从Mathematica 8开始的图形(图形[]
)。不幸的是,大型图形可能需要很长时间才能可视化,这比我在交互工作中对它们执行的大多数其他操作要长得多
如何防止以标准形式和传统形式自动布局图形[]
对象,并将其显示为例如-Graph-
,最好保留输出的可解释性(可能使用解释
?)。我认为这将涉及以某种方式更改格式
和/或Makebox
,但我没有成功地使其发挥作用
我希望以可逆的方式执行此操作,并且最好定义一个函数,当应用于graph
对象时,该函数将返回原始交互式图形显示(与GraphPlot
不同,它不是交互式的)
请注意,是否有方法检索与某些符号关联的格式/生成框定义FormatValues
是一个相关函数,但对于Graph
,它是空的
示例会话:
In[1]:= Graph[{1->2, 2->3, 3->1}]
Out[1]= -Graph-
In[2]:= interactiveGraphPlot[%] (* note that % works *)
Out[2]= (the usual interactive graph plot should be shown here)
虽然我没有Mathematica 8来尝试这一点,但有一种可能性是使用此结构:
Unprotect[Graph]
MakeBoxes[g_Graph, StandardForm] /; TrueQ[$short] ^:=
ToBoxes@Interpretation[Skeleton["Graph"], g]
$short = True;
之后,图形
对象应以骨架形式显示,设置$short=False
应恢复默认行为
希望这能自动切换:
interactiveGraphPlot[g_Graph] := Block[{$short}, Print[g]]
马克对修改<代码>图< /代码>的关注使我考虑使用<代码> $PREPMENT/<代码>的选项。我认为这也应该防止缓慢的布局步骤发生。如果您还没有将
$PrePrint
用于其他用途,则可能更可取
$PrePrint =
If[TrueQ[$short], # /. _Graph -> Skeleton["Graph"], #] &;
$short = True
同样方便的是,至少使用图形
(同样,我无法在v7中使用图形
进行测试),您只需使用打印
即可获得图形。如图所示:
g = Plot[Sin[x], {x, 0, 2 Pi}]
(* Out = <<"Graphics">> *)
我保留了$short
测试,以便通过全局符号轻松切换,但您可以将其删除并使用:
$PrePrint = # /. _Graph -> Skeleton["Graph"] &;
然后使用
$PrePrint=。
重置默认功能。您是否尝试过简单地抑制输出?如果您这样做的话,我认为V8的Graph
命令不会做任何布局。为了探索这一点,我们可以生成一个大的边列表,并比较graph[edges]的计时代码>,图形[边]代码>和图形地块[边缘]代码>
In[23]:= SeedRandom[1];
edges = Union[Rule @@@ (Sort /@
RandomInteger[{1, 5000}, {50000, 2}])];
In[25]:= t = AbsoluteTime[];
graph[edges];
In[27]:= AbsoluteTime[] - t
Out[27]= 0.029354
In[28]:= t = AbsoluteTime[];
Graph[edges];
In[30]:= AbsoluteTime[] - t
Out[30]= 0.080434
In[31]:= t = AbsoluteTime[];
GraphPlot[edges];
In[33]:= AbsoluteTime[] - t
Out[33]= 4.934918
惰性graph
命令当然是最快的。Graph
命令花费的时间更长,但没有GraphPlot
命令长。因此,在我看来,Graph
实际上并不像GraphPlot
那样计算布局
合乎逻辑的问题是,什么是Graph
花费它的时间。让我们在一个简单的例子中检查Graph
输出的InputForm
:
Graph[{1 -> 2, 2 -> 3, 3 -> 1, 1 -> 4}] // InputForm
Out[123]//InputForm=
Graph[{1, 2, 3, 4},
{DirectedEdge[1, 2],
DirectedEdge[2, 3],
DirectedEdge[3, 1],
DirectedEdge[1, 4]}]
请注意,图的顶点已经确定,我认为这就是graph
正在做的事情。事实上,在第一个示例中,计算Graph[edges]
所花费的时间与我所能想到的最快的方法相当:
Union[Sequence @@@ edges]; // Timing
这花费了0.087045秒。您可以使用Graph
的GraphLayout
选项以及图形构造函数来抑制渲染。图形仍然可以通过GraphPlot
可视化。试试下面的方法
{gr1, gr2, gr3} = {RandomGraph[{100, 120}, GraphLayout -> None],
PetersenGraph[10, 3, GraphLayout -> None],
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, GraphLayout -> None]}
为了使工作更简单,您可以使用SetOptions
为所有感兴趣的图形构造函数将GraphLayout
选项设置为None
。这似乎可行interactiveGraphPlot
提供原始版本,但使用交互式功能将其还原为表单。(事实上这部分并不重要。)我应该学习格式和makebox
如何工作,以及它们之间的区别(还有tobox
)。例如,为什么未经修改的makebox
不返回交互对象,ToBoxes
返回交互对象,但是需要在这里修改makebox
?我想我不明白你说的是什么,但是ToBoxes
需要,因为makebox
的输出应该是box;省略它将导致错误。默认情况下,makebox就是做(类似)tobox,除非你给它特殊的规则,比如这个。我想我不明白。在内置命令上调用Unprotect
,使Graph
的输出变为-Graph-
,真的值得吗?我同意图形作为图像的输出格式是奇怪的,甚至是不幸的。问题是,正确的处理方法是什么?在我看来,简单地抑制输出应该是推荐的方法。@马克,抑制输出是自版本6以来的标准方法,我同意这通常是最好的。但是,有时直接的图形格式设置会造成阻碍。有时,如果g
是一个Graphics
对象,并且我有一个类似{1,2,p,3}
的表达式,我宁愿看到{1,2,-Graphic-,3}
而不是一个包含实际图形的列表,尤其是当它以缓慢显示为代价时。@Mr Wizard,您可能对此感兴趣:我在多年前的MathGroup上看到过这一讨论,但现在找不到这一讨论。Graph
本身不做布局,它的交互输出做布局。这就像等待图形被渲染一样。因此,您甚至无法使用计时
或绝对计时
来测量此时间。是的,我可以抑制输出,但关键是我真的不想麻烦这样做,有时我会忘记它
{gr1, gr2, gr3} = {RandomGraph[{100, 120}, GraphLayout -> None],
PetersenGraph[10, 3, GraphLayout -> None],
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, GraphLayout -> None]}