6

某些类型的对象在 Mathematica 中具有特殊的输入/输出格式。这包括Graphics光栅图像,以及从 Mathematica 8 开始的图形 ( Graph[])。不幸的是,大图可能需要很长时间才能可视化,比我在交互工作期间对它们执行的大多数其他操作要长得多。

如何防止Graph[]StandardForm 和 TraditionalForm 中的对象自动布局,并将它们显示为例如-Graph-,最好保留输出的可解释性(可能使用Interpretation?)。我认为这将涉及更改Format和/或MakeBoxes以某种方式进行更改,但我未能成功使其发挥作用。

我想以可逆的方式执行此操作,并且最好定义一个函数,该函数将在应用于Graph对象时返回原始交互式图形显示(与 不同GraphPlot,它不是交互式的)。

在相关说明中,有没有办法检索与某些符号关联的格式/MakeBoxes 定义? 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)
4

3 回答 3

2

虽然我没有 Mathematica 8 来尝试这个,但一种可能性是使用这个结构:

Unprotect[Graph]

MakeBoxes[g_Graph, StandardForm] /; TrueQ[$short] ^:= 
 ToBoxes@Interpretation[Skeleton["Graph"], g]

$short = True;

之后,Graph对象应以骨架形式显示,并且设置$short = False应恢复默认行为。

希望这可以自动切换:

interactiveGraphPlot[g_Graph] := Block[{$short}, Print[g]]

马克对修改的担忧Graph使我考虑使用$PrePrint. 我认为这也应该防止缓慢的布局步骤发生。$PrePrint假设您还没有使用其他东西,它可能更可取。

$PrePrint = 
  If[TrueQ[$short], # /. _Graph -> Skeleton["Graph"], #] &;

$short = True

同样方便的是,至少使用Graphics(我再次无法Graph在 v7 中测试)您可以使用简单的Print. 在这里,用图形显示:

g = Plot[Sin[x], {x, 0, 2 Pi}]

(*  Out =  <<"Graphics">>  *)

然后

Print[g]

在此处输入图像描述

我将$short测试保留在适当的位置,以便通过全局符号轻松切换,但可以将其省略并使用:

    $PrePrint = # /. _Graph -> Skeleton["Graph"] &;

然后使用$PrePrint = .重置默认功能。

于 2011-05-09T16:33:55.067 回答
2

您可以使用GraphLayout选项Graph以及图形构造函数来抑制渲染。仍然可以使用 来可视化图表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

于 2011-05-19T19:53:35.553 回答
1

您是否尝试过简单地抑制输出?Graph如果您这样做,我认为 V8 的命令不会进行任何布局。为了探索这一点,我们可以生成一个大的边列表并比较graph[edges];Graph[edges];GraphPlot[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

inertgraph命令当然是最快的。该Graph命令需要更长的时间,但没有GraphPlot命令那么长。因此,在我看来Graph,实际上并没有像计算布局那样GraphPlot

合乎逻辑的问题是,把Graph时间花在什么上了。让我们在一个简单的情况下检查输出InputFormGraph

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 秒。

于 2011-05-10T02:57:16.613 回答