TreeForm без перекрытия - PullRequest
7 голосов
/ 09 ноября 2010

Иногда я сталкиваюсь с проблемой невозможности чтения меток в TreeForm из-за наложения.Пример ниже, кто-нибудь может увидеть способ избавиться от перекрытия?

{{4, 5, 6}, {{{2, 4, 5, 6}, {{{1, 2, 4}, {}}, {{2, 3, 6}, {}}}}, {{4, 
     5, 6, 8}, {{{4, 7, 8}, {}}, {{6, 8, 9}, {}}}}}} // TreeForm

http://yaroslavvb.com/upload/treeform1.png

Решение Велизария помогает с перекрытием, но теряет всплывающие подсказки, т.е. сравнивает с

TreeForm[Hold[
  GraphPlotHighlight[edges : {((_ -> _) | {_ -> _, _}) ...}, 
    hl : {___} : {}, opts : OptionsPattern[]] := 
   Module[{verts, coords, g, sub}, 5]]]

http://yaroslavvb.com/upload/mathematica-tooltip.png

Обновление ответа 11/12 В итоге я использовал приведенный ниже код (код Велизария с небольшим исправлением)

myTreeForm[exp_] := 
  Module[{tooltipText, i}, 
   tooltipText = 
    Cases[Cases[MakeBoxes[TreeForm@exp, StandardForm], 
      TooltipBox[x__] -> x, 7, Heads -> True], 
     TagBox[x__, y__] -> DisplayForm[First@{x}], Heads -> True];
   i = 0;
   TreeForm[exp, 
    VertexRenderingFunction -> ({Tooltip[
         Inset[Rasterize[Text[" " <> ToString@#2 <> " "], 
           Background -> LightBlue], #1], tooltipText[[i++]]]} &)]];

Ответы [ 2 ]

7 голосов
/ 09 ноября 2010

Я делал это раньше, но никогда не обобщал результат.

    rectOffset = {.25,.1};
    fontSize = 10
    TreeForm[list, 
          VertexRenderingFunction -> ({White, EdgeForm[Black], 
          Rectangle[#1 - rectOffset, #1 + rectOffset], Black, 
          Text[ Style[#2, fontSize], #1]} &)]

alt text

Редактировать С подсказками

Использование «другого подхода»

Код грязный, извинитесейчас не время навести порядок

rectOffset = {.33, .1};
fontSize = 9;
p = Cases[
   Cases[MakeBoxes[TreeForm@list, StandardForm], TooltipBox[x__] -> x,
     7, Heads -> True], TagBox[x__, y__] -> DisplayForm[First@{x}], 
   Heads -> True];
i = 0;
TreeForm[list, 
 VertexRenderingFunction -> ({White, EdgeForm[Black], 
     Rectangle[#1 - rectOffset, #1 + rectOffset], Black, 
     Tooltip[Text[Style[#2, fontSize], #1], p[[i++]]]} &)]  

Вывод

alt text

Редактировать 2

Я думаю этоверсия лучше:

Clear["Global`*"];
list = Hold[
   GraphPlotHighlight[edges : {((_ -> _) | {_ -> _, _}) ...}, 
     hl : {___} : {}, opts : OptionsPattern[]] := 
    Module[{verts, coords, g, sub}, 5]];

myTreeForm[exp_] :=

  Module[{ps, tooltipText, i},

   ps[text_] := Rasterize[Text[Style[text]], "RasterSize"];

   tooltipText = 
    Cases[Cases[MakeBoxes[TreeForm@list, StandardForm], 
      TooltipBox[x__] -> x, 7, Heads -> True], 
     TagBox[x__, y__] -> DisplayForm[First@{x}], Heads -> True];

   i = 0;

   TreeForm[list,
    EdgeRenderingFunction -> ({Red, Line[#1]} &), 
    VertexRenderingFunction -> ({White, EdgeForm[Black], {}, Black,
        Tooltip[
         Inset[Rasterize[Text[" " <> ToString@#2 <> " "], 
           Background -> LightBlue], #1], tooltipText[[i++]]]} &)]
   ];

list // myTreeForm  

Вывод:

alt text

Редактировать 4 ... и последний

Вычистили код, удалили ложные функции и переменные, которые были там просто для усложнения вещей:

myTreeForm[list_] := Module[{tooltipText, i},  

   tooltipText =   
         Cases[Cases[MakeBoxes[TreeForm@list, StandardForm],   
                    TooltipBox[x__] -> x, 7, Heads -> True],   
              TagBox[x__, y__] -> DisplayForm[First@{x}], Heads -> True];  
   i = 0;  
   TreeForm[list,  
           VertexRenderingFunction ->  
             ({Tooltip[Inset[Rasterize[Text[" " <> ToString@#2 <> " "], 
                       Background -> LightBlue], #1], tooltipText[[i++]]]} &) 
   ]  
 ];   

HTH!

0 голосов
/ 09 ноября 2010

Похоже, что вариант VertexCoordinateRules может быть вашей лучшей надеждой.

...