Использование GraphViz для построения схемы игры в расширенной форме

Я пытаюсь создать схему игры с расширенными формами в GraphViz. Компиляция кода приводит к графику, который является правильным во всех отношениях, кроме одного. Я хочу, чтобы метка «Война» располагалась слева от края, который он маркирует, так, чтобы край был ближе всего к «r», а не к «W».

Это моя "игра" или график на данный момент:

    digraph hierarchy_of_D  { 

            graph [rankdir ="UD"] 
            node [color=black,shape=circle]
            //splines="polyline"

     I [label="R"] 

     subgraph infoset1 
      { 
       label="whatever" 
       rank="same" 
       1 [label="C"]
       2 [label="C"]
      } 


     I -> 1 [label="War"] //fix how this floats right of the line
     I -> 2 [label="Peace"]
     1 -> 2 [style=dashed, dir=none] 

     subgraph info21 
      { 
        rank="same" 
        3 [label="(2,2)", rank=sink, shape="plaintext"]
        4 [label="(5,1)", rank=sink, shape="plaintext"]
        5 [label="(1,5)", rank=sink, shape="plaintext"]
        6 [label="(4,4)", rank=sink, shape="plaintext"]
       } 

       1 -> 3 [label="War"]
       1 -> 4 [label="Peace"]
       2 -> 5 [label="War"]
       2 -> 6 [label="Peace"]

    } 

Любые идеи? Я уже пробовал следующее, но это не то, что мне нужно:

1 -> 3 [label="War/l"]

См. Также этот вопрос и этот вопрос, ни на один из которых нет ответа. Да ладно, это стоит тройных очков!


person jrhorn424    schedule 29.09.2010    source источник


Ответы (2)


Тройные баллы? Что ж, правильный ответ заключается в том, что вы не можете выбрать размещение меток краев.

Однако вы можете играть с headlabel, labeldirection и labelangle:

digraph hierarchy_of_D  { 

node [color=black,shape=circle]

I [label="R"] 

subgraph infoset1 
{ 
   label="whatever" 
   rank="same" 
   1 [label="C"]
   2 [label="C"]
} 

I -> 1 [headlabel="War", labeldistance=3, labelangle=40]
I -> 2 [headlabel="Peace", labeldistance=3, labelangle=-40]
1 -> 2 [style=dashed, dir=none] 

subgraph info21 
{ 
    rank="same" 
    3 [label="(2,2)", rank=sink, shape="plaintext"]
    4 [label="(5,1)", rank=sink, shape="plaintext"]
    5 [label="(1,5)", rank=sink, shape="plaintext"]
    6 [label="(4,4)", rank=sink, shape="plaintext"]
} 

1 -> 3 [headlabel="War", labeldistance=3, labelangle=40]
1 -> 4 [headlabel="Peace", labeldistance=3, labelangle=-40]
2 -> 5 [headlabel="War", labeldistance=3, labelangle=40]
2 -> 6 [headlabel="Peace", labeldistance=3, labelangle=-40]
} 

Вывод:

graphviz output

person marapet    schedule 08.01.2011

Просто для удовольствия, я только что нашел другой обходной путь:

Путем принудительного создания прямых ребер между узлами с помощью splines=false и определения ребер дважды, ребра отрисовываются так, как если бы они были одним единственным ребром, но метки каждого ребра, к которому они попадают, отрисовываются (большую часть времени) с разных сторон ребра.

Следовательно, имея один край без метки, а другой с меткой, можно повлиять на размещение метки (-ей) края (-ей).

Ваш пример:

digraph hierarchy_of_D  { 
splines=false;

node [color=black,shape=circle]

I [label="R"] 

subgraph infoset1 
{ 
   rank="same" 
   1 [label="C"]
   2 [label="C"]
} 

I -> 1 [label="War "]
I -> 1 [label="    "]
I -> 2 [label=""]
I -> 2 [label="Peace"]
1 -> 2 [style=dashed, dir=none] 

subgraph info21 
{ 
    rank="same" 
    3 [label="(2,2)", rank=sink, shape="plaintext"]
    4 [label="(5,1)", rank=sink, shape="plaintext"]
    5 [label="(1,5)", rank=sink, shape="plaintext"]
    6 [label="(4,4)", rank=sink, shape="plaintext"]
} 

1 -> 3 [label="War"]
1 -> 3 [label=""]
1 -> 4 [label=""]
1 -> 4 [label="Peace"]
2 -> 5 [label=""]
2 -> 5 [label="War "]
2 -> 6 [label=""]
2 -> 6 [label="Peace"]} 

И вывод:

graphviz output

Это не идеально, и ваш пробег может варьироваться в зависимости от графика, но я подумал, что стоит упомянуть об этом.

person marapet    schedule 13.01.2011