6

一部のタイプのオブジェクトは Mathematica で特別な入力/出力フォーマットを持っています. これにはGraphics、ラスター画像、およびMathematica 8以降のグラフ(Graph[])が含まれます。残念ながら、大きなグラフを視覚化するには非常に長い時間がかかる場合があり、インタラクティブな作業中にグラフに対して行っている他のほとんどの操作よりもはるかに長くなります。

Graph[]StandardForm および TraditionalFormでオブジェクトの自動レイアウトを防止し、たとえば として表示するにはどうすればよいですか。-Graph-できれば出力の解釈可能性を維持します (おそらくInterpretation? を使用します)。Formatこれには何らかの変更や何らかの方法が必要になると思いますが、これを機能させることMakeBoxesに失敗しました。

これを可逆的な方法で行いたいと思います。できれば、Graphオブジェクトに適用されたときに元のインタラクティブなグラフ表示を返す関数を定義したいと思います (GraphPlotインタラクティブではない とは異なります)。

関連して、特定のシンボルに関連付けられた Format/MakeBoxes 定義を取得する方法はありますか? FormatValuesは関連する関数の 1 つですが、 については空です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

グラフ コンストラクターと同様に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設定するために使用できます。GraphLayoutNone

于 2011-05-19T19:53:35.553 に答える
2

これを試すためのMathematica 8は持っていませんが、1つの可能性は次の構成を使用することです:

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(v7 ではテストできませんGraph) で簡単にグラフィックを取得できます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 に答える
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

graphもちろん、不活性コマンドが最速です。コマンドにははるかに長い時間がかかりますが、Graphコマンドほど長くはかかりませんGraphPlot。したがって、Graph実際には、レイアウトを計算しているようには見えませんGraphPlot

論理的な問題は、何にGraph時間を費やしているのかということです。InputForm簡単なケースでのGraph出力を調べてみましょう。

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 に答える