summaryrefslogtreecommitdiffstats
path: root/python/altgraph/doc/dot.rst
blob: 3848c488a7cdc7043fa44b14a5d61e7fd77e2e3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
:mod:`altgraph.Dot` --- Interface to the dot language
=====================================================

.. module:: altgraph.Dot
   :synopsis: Interface to the dot language as used by Graphviz..

The :py:mod:`~altgraph.Dot` module provides a simple interface to the
file format used in the `graphviz`_ program. The module is intended to 
offload the most tedious part of the process (the **dot** file generation) 
while transparently exposing most of its features.

.. _`graphviz`: <http://www.research.att.com/sw/tools/graphviz/>`_

To display the graphs or to generate image files the `graphviz`_
package needs to be installed on the system, moreover the :command:`dot` and :command:`dotty` programs must
be accesible in the program path so that they can be ran from processes spawned
within the module. 

Example usage
-------------

Here is a typical usage::

    from altgraph import Graph, Dot

    # create a graph
    edges = [ (1,2), (1,3), (3,4), (3,5), (4,5), (5,4) ]
    graph = Graph.Graph(edges)
    
    # create a dot representation of the graph
    dot = Dot.Dot(graph)

    # display the graph
    dot.display()

    # save the dot representation into the mydot.dot file
    dot.save_dot(file_name='mydot.dot')

    # save dot file as gif image into the graph.gif file
    dot.save_img(file_name='graph', file_type='gif')


Directed graph and non-directed graph
-------------------------------------

Dot class can use for both directed graph and non-directed graph
by passing *graphtype* parameter.

Example::

    # create directed graph(default)
    dot = Dot.Dot(graph, graphtype="digraph")

    # create non-directed graph
    dot = Dot.Dot(graph, graphtype="graph")


Customizing the output
----------------------

The graph drawing process may be customized by passing
valid :command:`dot` parameters for the nodes and edges. For a list of all
parameters see the `graphviz`_ documentation.

Example::

    # customizing the way the overall graph is drawn
    dot.style(size='10,10', rankdir='RL', page='5, 5' , ranksep=0.75)

    # customizing node drawing
    dot.node_style(1, label='BASE_NODE',shape='box', color='blue' )
    dot.node_style(2, style='filled', fillcolor='red')

    # customizing edge drawing
    dot.edge_style(1, 2, style='dotted')
    dot.edge_style(3, 5, arrowhead='dot', label='binds', labelangle='90')
    dot.edge_style(4, 5, arrowsize=2, style='bold')


    .. note:: 
       
       dotty (invoked via :py:func:`~altgraph.Dot.display`) may not be able to
       display all graphics styles. To verify the output save it to an image 
       file and look at it that way.

Valid attributes
----------------

- dot styles, passed via the :py:meth:`Dot.style` method::

    rankdir = 'LR'   (draws the graph horizontally, left to right)
    ranksep = number (rank separation in inches)

- node attributes, passed via the :py:meth:`Dot.node_style` method::

     style = 'filled' | 'invisible' | 'diagonals' | 'rounded'
     shape = 'box' | 'ellipse' | 'circle' | 'point' | 'triangle'

- edge attributes, passed via the :py:meth:`Dot.edge_style` method::

     style     = 'dashed' | 'dotted' | 'solid' | 'invis' | 'bold'
     arrowhead = 'box' | 'crow' | 'diamond' | 'dot' | 'inv' | 'none' | 'tee' | 'vee'
     weight    = number (the larger the number the closer the nodes will be)

- valid `graphviz colors <http://www.research.att.com/~erg/graphviz/info/colors.html>`_

- for more details on how to control the graph drawing process see the 
  `graphviz reference <http://www.research.att.com/sw/tools/graphviz/refs.html>`_.


Class interface
---------------

.. class:: Dot(graph[, nodes[, edgefn[, nodevisitor[, edgevisitor[, name[, dot[, dotty[, neato[, graphtype]]]]]]]]])

  Creates a new Dot generator based on the specified 
  :class:`Graph <altgraph.Graph.Graph>`.  The Dot generator won't reference
  the *graph* once it is constructed.

  If the *nodes* argument is present it is the list of nodes to include
  in the graph, otherwise all nodes in *graph* are included.
  
  If the *edgefn* argument is present it is a function that yields the
  nodes connected to another node, this defaults to 
  :meth:`graph.out_nbr <altgraph.Graph.Graph.out_nbr>`. The constructor won't
  add edges to the dot file unless both the head and tail of the edge
  are in *nodes*.

  If the *name* is present it specifies the name of the graph in the resulting
  dot file. The default is ``"G"``.

  The functions *nodevisitor* and *edgevisitor* return the default style
  for a given edge or node (both default to functions that return an empty
  style).

  The arguments *dot*, *dotty* and *neato* are used to pass the path to 
  the corresponding `graphviz`_ command.


Updating graph attributes
.........................

.. method:: Dot.style(\**attr)

   Sets the overall style (graph attributes) to the given attributes.

   See `Valid Attributes`_ for more information about the attributes.

.. method:: Dot.node_style(node, \**attr)

   Sets the style for *node* to the given attributes.

   This method will add *node* to the graph when it isn't already 
   present.

   See `Valid Attributes`_ for more information about the attributes.

.. method:: Dot.all_node_style(\**attr)

   Replaces the current style for all nodes


.. method:: edge_style(head, tail, \**attr)

   Sets the style of an edge to the given attributes. The edge will
   be added to the graph when it isn't already present, but *head*
   and *tail* must both be valid nodes.

   See `Valid Attributes`_ for more information about the attributes.



Emitting output
...............

.. method:: Dot.display([mode])

   Displays the current graph via dotty.

   If the *mode* is ``"neato"`` the dot file is processed with
   the neato command before displaying.

   This method won't return until the dotty command exits.

.. method:: save_dot(filename)

   Saves the current graph representation into the given file.

   .. note::

       For backward compatibility reasons this method can also
       be called without an argument, it will then write the graph
       into a fixed filename (present in the attribute :data:`Graph.temp_dot`).

       This feature is deprecated and should not be used.


.. method:: save_image(file_name[, file_type[, mode]])

   Saves the current graph representation as an image file. The output
   is written into a file whose basename is *file_name* and whose suffix
   is *file_type*.

   The *file_type* specifies the type of file to write, the default
   is ``"gif"``.

   If the *mode* is ``"neato"`` the dot file is processed with
   the neato command before displaying.

   .. note::

       For backward compatibility reasons this method can also
       be called without an argument, it will then write the graph
       with a fixed basename (``"out"``).

       This feature is deprecated and should not be used.

.. method:: iterdot()

   Yields all lines of a `graphviz`_ input file (including line endings).

.. method:: __iter__()

   Alias for the :meth:`iterdot` method.