Предотвращение автоматической компоновки объектов Graph[] в Mathematica 8

некоторые типы объектов имеют специальное форматирование ввода / вывода в Mathematica. Это включает в себя Graphics, растровые изображения и, начиная с Mathematica 8, графики (Graph[]). К сожалению, визуализация больших графиков может занять очень много времени, гораздо больше, чем большинство других операций, которые я выполняю с ними во время интерактивной работы.

как я могу предотвратить автоматическое размещение Graph[] объекты в стандарте и TraditionalForm, и они отображаются как, например,-Graph- желательно сохранить интерпретируемость вывода (возможно, с помощью Interpretation?). Я думаю, что это будет включать в себя изменение Format и/или MakeBoxes в некотором роде, но мне не удалось заставить это работать.

я хотел бы сделать это обратимым способом и предпочтительно определить функцию, которая вернет исходный интерактивный дисплей графика при применении к Graph объект (не то же самое, что GraphPlot, который не является интерактивным).

в соответствующей заметке есть ли способ получить Format / 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)

3 ответов


хотя у меня нет 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]

enter image description here

я покинул $short тест на месте для легкого переключения через глобальный символ, но можно оставить его и использовать:

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

и затем использовать $PrePrint = . для сброса функций по умолчанию.


можно использовать на Graph а также graph-конструкторы для подавления рендеринга. График все еще можно визуализировать с помощью GraphPlot. Попробуйте следующее

{gr1, gr2, gr3} = {RandomGraph[{100, 120}, GraphLayout -> None], 
  PetersenGraph[10, 3, GraphLayout -> None], 
  Graph[{1 -> 2, 2 -> 3, 3 -> 1}, GraphLayout -> None]}

enter image description here

для того, чтобы сделать работу проще, вы можете использовать SetOptions установить до None для всех графовых конструкторов, которые вас интересуют.


вы пытались просто подавить вывод? Я не думаю, что 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 команда, конечно, самая быстрая. The Graph команда занимает гораздо больше времени, но не где-то так долго, как . Таким образом, мне кажется, что Graph на самом деле не вычисляет макет, как GraphPlot делает.

логический вопрос в том, что такое Graph тратить время на. Рассмотрим InputForm of 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 считанные секунды.