developer.chat
16 March 2024
SEO Title
category
Examples¶
Tip
The following code examples are included in the examples/
directory of the source repository/distribution.
Note
Most of them recreate examples from the graphviz.org gallery or the graphviz.org documentation.
hello.py¶
"""https://graphviz.org/Gallery/directed/hello.html""" import graphviz g = graphviz.Digraph('G', filename='hello.gv') g.edge('Hello', 'World') g.view()
process.py¶
"""https://graphviz.org/Gallery/undirected/process.html""" import graphviz g = graphviz.Graph('G', filename='process.gv', engine='sfdp') g.edge('run', 'intr') g.edge('intr', 'runbl') g.edge('runbl', 'run') g.edge('run', 'kernel') g.edge('kernel', 'zombie') g.edge('kernel', 'sleep') g.edge('kernel', 'runmem') g.edge('sleep', 'swap') g.edge('swap', 'runswap') g.edge('runswap', 'new') g.edge('runswap', 'runmem') g.edge('new', 'runmem') g.edge('sleep', 'runmem') g.view()
fsm.py¶
"""https://graphviz.org/Gallery/directed/fsm.html""" import graphviz f = graphviz.Digraph('finite_state_machine', filename='fsm.gv') f.attr(rankdir='LR', size='8,5') f.attr('node', shape='doublecircle') f.node('LR_0') f.node('LR_3') f.node('LR_4') f.node('LR_8') f.attr('node', shape='circle') f.edge('LR_0', 'LR_2', label='SS(B)') f.edge('LR_0', 'LR_1', label='SS(S)') f.edge('LR_1', 'LR_3', label='S($end)') f.edge('LR_2', 'LR_6', label='SS(b)') f.edge('LR_2', 'LR_5', label='SS(a)') f.edge('LR_2', 'LR_4', label='S(A)') f.edge('LR_5', 'LR_7', label='S(b)') f.edge('LR_5', 'LR_5', label='S(a)') f.edge('LR_6', 'LR_6', label='S(b)') f.edge('LR_6', 'LR_5', label='S(a)') f.edge('LR_7', 'LR_8', label='S(b)') f.edge('LR_7', 'LR_5', label='S(a)') f.edge('LR_8', 'LR_6', label='S(b)') f.edge('LR_8', 'LR_5', label='S(a)') f.view()
cluster.py¶
"""https://graphviz.org/Gallery/directed/cluster.html""" from graphviz import Digraph g = Digraph('G', filename='cluster.gv') # NOTE: the subgraph name needs to begin with 'cluster' (all lowercase) # so that Graphviz recognizes it as a special cluster subgraph with g.subgraph(name='cluster_0') as c: c.attr(style='filled', color='lightgrey') c.node_attr.update(style='filled', color='white') c.edges([('a0', 'a1'), ('a1', 'a2'), ('a2', 'a3')]) c.attr(label='process #1') with g.subgraph(name='cluster_1') as c: c.attr(color='blue') c.node_attr['style'] = 'filled' c.edges([('b0', 'b1'), ('b1', 'b2'), ('b2', 'b3')]) c.attr(label='process #2') g.edge('start', 'a0') g.edge('start', 'b0') g.edge('a1', 'b3') g.edge('b2', 'a3') g.edge('a3', 'a0') g.edge('a3', 'end') g.edge('b3', 'end') g.node('start', shape='Mdiamond') g.node('end', shape='Msquare') g.view()
er.py¶
"""https://graphviz.org/Gallery/undirected/ER.html""" import graphviz e = graphviz.Graph('ER', filename='er.gv', engine='neato') e.attr('node', shape='box') e.node('course') e.node('institute') e.node('student') e.attr('node', shape='ellipse') e.node('name0', label='name') e.node('name1', label='name') e.node('name2', label='name') e.node('code') e.node('grade') e.node('number') e.attr('node', shape='diamond', style='filled', color='lightgrey') e.node('C-I') e.node('S-C') e.node('S-I') e.edge('name0', 'course') e.edge('code', 'course') e.edge('course', 'C-I', label='n', len='1.00') e.edge('C-I', 'institute', label='1', len='1.00') e.edge('institute', 'name1') e.edge('institute', 'S-I', label='1', len='1.00') e.edge('S-I', 'student', label='n', len='1.00') e.edge('student', 'grade') e.edge('student', 'name2') e.edge('student', 'number') e.edge('student', 'S-C', label='m', len='1.00') e.edge('S-C', 'course', label='n', len='1.00') e.attr(label=r'\n\nEntity Relation Diagram\ndrawn by NEATO') e.attr(fontsize='20') e.view()
unix.py¶
"""https://graphviz.org/Gallery/directed/unix.html""" import graphviz u = graphviz.Digraph('unix', filename='unix.gv', node_attr={'color': 'lightblue2', 'style': 'filled'}) u.attr(size='6,6') u.edge('5th Edition', '6th Edition') u.edge('5th Edition', 'PWB 1.0') u.edge('6th Edition', 'LSX') u.edge('6th Edition', '1 BSD') u.edge('6th Edition', 'Mini Unix') u.edge('6th Edition', 'Wollongong') u.edge('6th Edition', 'Interdata') u.edge('Interdata', 'Unix/TS 3.0') u.edge('Interdata', 'PWB 2.0') u.edge('Interdata', '7th Edition') u.edge('7th Edition', '8th Edition') u.edge('7th Edition', '32V') u.edge('7th Edition', 'V7M') u.edge('7th Edition', 'Ultrix-11') u.edge('7th Edition', 'Xenix') u.edge('7th Edition', 'UniPlus+') u.edge('V7M', 'Ultrix-11') u.edge('8th Edition', '9th Edition') u.edge('1 BSD', '2 BSD') u.edge('2 BSD', '2.8 BSD') u.edge('2.8 BSD', 'Ultrix-11') u.edge('2.8 BSD', '2.9 BSD') u.edge('32V', '3 BSD') u.edge('3 BSD', '4 BSD') u.edge('4 BSD', '4.1 BSD') u.edge('4.1 BSD', '4.2 BSD') u.edge('4.1 BSD', '2.8 BSD') u.edge('4.1 BSD', '8th Edition') u.edge('4.2 BSD', '4.3 BSD') u.edge('4.2 BSD', 'Ultrix-32') u.edge('PWB 1.0', 'PWB 1.2') u.edge('PWB 1.0', 'USG 1.0') u.edge('PWB 1.2', 'PWB 2.0') u.edge('USG 1.0', 'CB Unix 1') u.edge('USG 1.0', 'USG 2.0') u.edge('CB Unix 1', 'CB Unix 2') u.edge('CB Unix 2', 'CB Unix 3') u.edge('CB Unix 3', 'Unix/TS++') u.edge('CB Unix 3', 'PDP-11 Sys V') u.edge('USG 2.0', 'USG 3.0') u.edge('USG 3.0', 'Unix/TS 3.0') u.edge('PWB 2.0', 'Unix/TS 3.0') u.edge('Unix/TS 1.0', 'Unix/TS 3.0') u.edge('Unix/TS 3.0', 'TS 4.0') u.edge('Unix/TS++', 'TS 4.0') u.edge('CB Unix 3', 'TS 4.0') u.edge('TS 4.0', 'System V.0') u.edge('System V.0', 'System V.2') u.edge('System V.2', 'System V.3') u.view()
structs.py¶
"""https://www.graphviz.org/doc/info/shapes.html#html""" import graphviz s = graphviz.Digraph('structs', filename='structs.gv', node_attr={'shape': 'plaintext'}) s.node('struct1', '''< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR> <TD>left</TD> <TD PORT="f1">middle</TD> <TD PORT="f2">right</TD> </TR> </TABLE>>''') s.node('struct2', '''< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR> <TD PORT="f0">one</TD> <TD>two</TD> </TR> </TABLE>>''') s.node('struct3', '''< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4"> <TR> <TD ROWSPAN="3">hello<BR/>world</TD> <TD COLSPAN="3">b</TD> <TD ROWSPAN="3">g</TD> <TD ROWSPAN="3">h</TD> </TR> <TR> <TD>c</TD> <TD PORT="here">d</TD> <TD>e</TD> </TR> <TR> <TD COLSPAN="3">f</TD> </TR> </TABLE>>''') s.edges([('struct1:f1', 'struct2:f0'), ('struct1:f2', 'struct3:here')]) s.view()
structs_revisited.py¶
"""https://www.graphviz.org/pdf/dotguide.pdf, Figure 12""" import graphviz s = graphviz.Digraph('structs', filename='structs_revisited.gv', node_attr={'shape': 'record'}) s.node('struct1', '<f0> left|<f1> middle|<f2> right') s.node('struct2', '<f0> one|<f1> two') s.node('struct3', r'hello\nworld |{ b |{c|<here> d|e}| f}| g | h') s.edges([('struct1:f1', 'struct2:f0'), ('struct1:f2', 'struct3:here')]) s.view()
btree.py¶
"""https://www.graphviz.org/pdf/dotguide.pdf, Figure 13""" import graphviz from graphviz import nohtml g = graphviz.Digraph('g', filename='btree.gv', node_attr={'shape': 'record', 'height': '.1'}) g.node('node0', nohtml('<f0> |<f1> G|<f2>')) g.node('node1', nohtml('<f0> |<f1> E|<f2>')) g.node('node2', nohtml('<f0> |<f1> B|<f2>')) g.node('node3', nohtml('<f0> |<f1> F|<f2>')) g.node('node4', nohtml('<f0> |<f1> R|<f2>')) g.node('node5', nohtml('<f0> |<f1> H|<f2>')) g.node('node6', nohtml('<f0> |<f1> Y|<f2>')) g.node('node7', nohtml('<f0> |<f1> A|<f2>')) g.node('node8', nohtml('<f0> |<f1> C|<f2>')) g.edge('node0:f2', 'node4:f1') g.edge('node0:f0', 'node1:f1') g.edge('node1:f0', 'node2:f1') g.edge('node1:f2', 'node3:f1') g.edge('node2:f2', 'node8:f1') g.edge('node2:f0', 'node7:f1') g.edge('node4:f2', 'node6:f1') g.edge('node4:f0', 'node5:f1') g.view()
traffic_lights.py¶
"""https://www.graphviz.org/Gallery/directed/traffic_lights.html""" import graphviz t = graphviz.Digraph('TrafficLights', filename='traffic_lights.gv', engine='neato') t.attr('node', shape='box') for i in (2, 1): t.node(f'gy{i:d}') t.node(f'yr{i:d}') t.node(f'rg{i:d}') t.attr('node', shape='circle', fixedsize='true', width='0.9') for i in (2, 1): t.node(f'green{i:d}') t.node(f'yellow{i:d}') t.node(f'red{i:d}') t.node(f'safe{i:d}') for i, j in [(2, 1), (1, 2)]: t.edge(f'gy{i:d}', f'yellow{i:d}') t.edge(f'rg{i:d}', f'green{i:d}') t.edge(f'yr{i:d}', f'safe{j:d}') t.edge(f'yr{i:d}', f'red{i:d}') t.edge(f'safe{i:d}', f'rg{i:d}') t.edge(f'green{i:d}', f'gy{i:d}') t.edge(f'yellow{i:d}', f'yr{i:d}') t.edge(f'red{i:d}', f'rg{i:d}') t.attr(overlap='false') t.attr(label=r'PetriNet Model TrafficLights\n' r'Extracted from ConceptBase and layed out by Graphviz') t.attr(fontsize='12') t.view()
fdpclust.py¶
"""https://www.graphviz.org/Gallery/undirected/fdpclust.html""" import graphviz g = graphviz.Graph('G', filename='fdpclust.gv', engine='fdp') g.node('e') with g.subgraph(name='clusterA') as a: a.edge('a', 'b') with a.subgraph(name='clusterC') as c: c.edge('C', 'D') with g.subgraph(name='clusterB') as b: b.edge('d', 'f') g.edge('d', 'D') g.edge('e', 'clusterB') g.edge('clusterC', 'clusterB') g.view()
cluster_edge.py¶
"""https://www.graphviz.org/pdf/dotguide.pdf, Figure 20""" import graphviz g = graphviz.Digraph('G', filename='cluster_edge.gv') g.attr(compound='true') with g.subgraph(name='cluster0') as c: c.edges(['ab', 'ac', 'bd', 'cd']) with g.subgraph(name='cluster1') as c: c.edges(['eg', 'ef']) g.edge('b', 'f', lhead='cluster1') g.edge('d', 'e') g.edge('c', 'g', ltail='cluster0', lhead='cluster1') g.edge('c', 'e', ltail='cluster0') g.edge('d', 'h') g.view()
g_c_n.py¶
"""https://www.graphviz.org/Gallery/gradient/g_c_n.html""" import graphviz g = graphviz.Graph('G', filename='g_c_n.gv') g.attr(bgcolor='purple:pink', label='agraph', fontcolor='white') with g.subgraph(name='cluster1') as c: c.attr(fillcolor='blue:cyan', label='acluster', fontcolor='white', style='filled', gradientangle='270') c.attr('node', shape='box', fillcolor='red:yellow', style='filled', gradientangle='90') c.node('anode') g.view()
angles.py¶
"""https://www.graphviz.org/Gallery/gradient/angles.html""" import graphviz g = graphviz.Digraph('G', filename='angles.gv') g.attr(bgcolor='blue') with g.subgraph(name='cluster_1') as c: c.attr(fontcolor='white') c.attr('node', shape='circle', style='filled', fillcolor='white:black', gradientangle='360', label='n9:360', fontcolor='black') c.node('n9') for i, a in zip(range(8, 0, -1), range(360 - 45, -1, -45)): c.attr('node', gradientangle=f'{a:d}', label=f'n{i:d}:{a:d}') c.node(f'n{i:d}') c.attr(label='Linear Angle Variations (white to black gradient)') with g.subgraph(name='cluster_2') as c: c.attr(fontcolor='white') c.attr('node', shape='circle', style='radial', fillcolor='white:black', gradientangle='360', label='n18:360', fontcolor='black') c.node('n18') for i, a in zip(range(17, 9, -1), range(360 - 45, -1, -45)): c.attr('node', gradientangle=f'{a:d}', label=f'n{i:d}:{a:d}') c.node(f'n{i:d}') c.attr(label='Radial Angle Variations (white to black gradient)') g.edge('n5', 'n14') g.view()
rank_same.py¶
"""https://stackoverflow.com/questions/25734244/how-do-i-place-nodes-on-the-same-level-in-dot""" import graphviz d = graphviz.Digraph(filename='rank_same.gv') with d.subgraph() as s: s.attr(rank='same') s.node('A') s.node('X') d.node('C') with d.subgraph() as s: s.attr(rank='same') s.node('B') s.node('D') s.node('Y') d.edges(['AB', 'AC', 'CD', 'XY']) d.view()
colors.py¶
"""https://graphviz.org/docs/attr-types/color""" import graphviz g = graphviz.Graph(filename='colors.gv') red, green, blue = 64, 224, 208 assert f'#{red:x}{green:x}{blue:x}' == '#40e0d0' g.node('RGB: #40e0d0', style='filled', fillcolor='#40e0d0') g.node('RGBA: #ff000042', style='filled', fillcolor='#ff000042') g.node('HSV: 0.051 0.718 0.627', style='filled', fillcolor='0.051 0.718 0.627') g.node('name: deeppink', style='filled', fillcolor='deeppink') g.view()
- 登录 发表评论