2010-09-29 38 views
4

Je tente de schématiser un jeu de formulaire étendu dans GraphViz. La compilation du code donne un graphique correct à tous égards sauf un. Je veux que l'étiquette "War" soit placée à la gauche du bord qu'elle étiquette, de sorte que le bord soit le plus proche de "r" et non de "W".Utilisation de GraphViz pour schématiser un jeu de forme extensive

Ceci est mon "jeu" ou graphique jusqu'à présent:

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"] 

    } 

Toutes les idées? Je l'ai déjà essayé ce qui suit, ce qui ne fait pas ce que je veux:

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

Voir aussi this question et that question, que ni d'avoir une réponse. Allez, ça vaut des points triples!

Répondre

4

Points triples? Eh bien, la bonne réponse est que vous ne pouvez pas choisir le placement des étiquettes de bord.

Cependant, vous pouvez jouer avec headlabel, labeldirection et 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] 
} 

Sortie:

graphviz output

+0

Merci! Grande solution de contournement. – jrhorn424

4

Juste pour le plaisir, une autre solution que je viens de trouver:

Par forçant des arêtes droites entre les nœuds en utilisant splines=false et en définissant deux fois les arêtes , les bords sont dessinés comme s'il s'agissait d'un seul bord, mais les étiquettes de chaque bord sont dessinées (la plupart du temps) sur différents côtés du bord. Par conséquent, en ayant un bord sans étiquette, et l'autre avec une étiquette, il est possible d'influencer le placement de la (des) étiquette (s) de bordure.

Votre exemple:

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"]} 

Et la sortie:

graphviz output

Ce n'est pas parfait, et votre kilométrage peut varier en fonction du graphique, mais je pensais que ça valait la peine mentionner.