34696


①FとGが横並びになる方法を教えて下さい。  
GVファイル(graph description language)にrankがでてきません

②スモールsをつけない方法を教えて下さい。  
sをつけないと、絵が重なります。

上向き矢印↑を作ってみました。目標は、graphviz,pythonでトーナメント表(tournament)作成です。よろしくお願いします。

[code]

    def apply_styles(graph, styles):       
        graph.graph_attr.update(
            ('graph' in styles and styles['graph']) or {}
        )
        graph.node_attr.update(
            ('nodes' in styles and styles['nodes']) or {}
        )
        graph.edge_attr.update(
            ('edges' in styles and styles['edges']) or {}
        )
        return graph
    from graphviz import Digraph
    g = Digraph('G', filename='cluster.gv')
    with g.subgraph(name='cluster_1') as c:
        c.edges([('1', 'A'), ('1', 'B'),
                 ('2', 'C'), ('2', 'D'),
                 ('3', 'E'), ('3', 'F'),
                 ('6', '4'), ('6', '5'),
                 ('4', '1'), ('4', '2'),
                 ('5', '3'), ('5', 'G')
                 ])
    with g.subgraph(name='cluster_2') as c:
        c.edges([('s1', 'sA'), ('s1', 'sB'),
                 ('s2', 'sC'), ('s2', 'sD'),
                 ('s3', 'sE'), ('s3', 'sF'),
                 ('s6', 's4'), ('s6', 's5'),
                 ('s4', 's1'), ('s4', 's2'),
                 ('s5', 's3'), ('s5', 'sG')
                 ])
        styles = {
            'rank': {'same;sF;sG'},
            'edges': {
                 'dir': 'both',
                 'arrowhead': 'none',
                 'arrowtail': 'normal'
                }
           }
        c = apply_styles(c, styles)
    g.view()
    
[/code]

出力

[code]

    digraph G {
        subgraph cluster_1 {
                1 -> A
                1 -> B
                2 -> C
                2 -> D
                3 -> E
                3 -> F
                6 -> 4
                6 -> 5
                4 -> 1
                4 -> 2
                5 -> 3
                5 -> G
        }
        subgraph cluster_2 {
            edge [arrowhead=none arrowtail=normal dir=both]
                s1 -> sA
                s1 -> sB
                s2 -> sC
                s2 -> sD
                s3 -> sE
                s3 -> sF
                s6 -> s4
                s6 -> s5
                s4 -> s1
                s4 -> s2
                s5 -> s3
                s5 -> sG
        }
    }
    
[/code]


CC BY-SA 3.0
2017-05-13T16:13:16.777
34686
2017-05-14T07:23:01.383
2017-05-14T04:00:03.630
17199
17199
question
python dot graphviz
graphviz,pythonでdot言語のrank,sameの方法を教えて下さい。


  1. body に直接記述することで可能です。
  2. ノードにラベルをつけることによって A と sA の名称を合わせることができます。ノード A と sA は違うものですので単にsを取ることは出来ません。

ということですので、このようにしてみてはいかがでしょう。

[code]

    from graphviz import Digraph
    
    def apply_styles(graph, styles):       
        graph.graph_attr.update(
            ('graph' in styles and styles['graph']) or {}
        )
        graph.node_attr.update(
            ('nodes' in styles and styles['nodes']) or {}
        )
        graph.edge_attr.update(
            ('edges' in styles and styles['edges']) or {}
        )
        return graph
    
    g = Digraph('G', filename='cluster.gv')
    with g.subgraph(name='cluster_1') as c:
        c.body.append('{rank=same; F; G;}')
        c.edges([('1', 'A'), ('1', 'B'),
                 ('2', 'C'), ('2', 'D'),
                 ('3', 'E'), ('3', 'F'),
                 ('6', '4'), ('6', '5'),
                 ('4', '1'), ('4', '2'),
                 ('5', '3'), ('5', 'G')
                 ])
    with g.subgraph(name='cluster_2') as c:
        c.body.append('{rank=same; sF; sG;}')
        labels = ['1', '2', '3', '4', '5', '6', 'A', 'B', 'C', 'D', 'E', 'F', 'G']
        for label in labels:
            c.node('s' + label, label=label)
        c.edges([('s1', 'sA'), ('s1', 'sB'),
                 ('s2', 'sC'), ('s2', 'sD'),
                 ('s3', 'sE'), ('s3', 'sF'),
                 ('s6', 's4'), ('s6', 's5'),
                 ('s4', 's1'), ('s4', 's2'),
                 ('s5', 's3'), ('s5', 'sG')
                 ])
        styles = {
            'edges': {
                 'dir': 'both',
                 'arrowhead': 'none',
                 'arrowtail': 'normal'
                }
           }
        c = apply_styles(c, styles)
    g.view()
    
[/code]

[![Result](https://i.stack.imgur.com/RrJau.png)](https://i.stack.imgur.com/RrJau.png)


CC BY-SA 3.0
2017-05-14T07:23:01.383
34696
2017-05-14T07:23:01.383
15705
34686
answer