Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to draw properly networkx graphs

I got this code which allows me to draw a graph like the posted below

import networkx as nx
import pylab as plt
from networkx.drawing.nx_agraph import graphviz_layout


G = nx.DiGraph()
G.add_node(1,level=1)
G.add_node(2,level=2)
G.add_node(3,level=2)
G.add_node(4,level=3)

G.add_edge(1,2)
G.add_edge(1,3)
G.add_edge(2,4)

nx.draw(G, pos=graphviz_layout(G), node_size=1600, cmap=plt.cm.Blues,
        node_color=range(len(G)),
        prog='dot')
plt.show()

enter image description here

Question is, how could i draw the graph with nodes which:

  • Use white background color
  • Have labels inside
  • Have directed arrows
  • Optionally the arrows show a certain weight
  • Are arranged nicely either automatically or manually

Something similar to the below image

enter image description here

As you can see in that image, nodes are aligned really nicely

like image 667
BPL Avatar asked Sep 23 '16 09:09

BPL


1 Answers

Since you have Graphviz you can use that to make nice drawings and control the elements of the drawing. The 'dot' layout engine does a great job of positioning digraphs like the one in your example. For example

import networkx as nx
import pylab as plt
from networkx.drawing.nx_agraph import graphviz_layout, to_agraph
import pygraphviz as pgv

G = nx.DiGraph()
G.add_node("A",rank=0)
G.add_nodes_from(['B','C','D'],style='filled',fillcolor='red')
G.add_nodes_from(['D','F','G'])
G.add_nodes_from(['H'],label='target')
G.add_edge('A','B',arrowsize=2.0)
G.add_edge('A','C',penwidth=2.0)
G.add_edge('A','D')
G.add_edges_from([('B','E'),('B','F')],color='blue')
G.add_edges_from([('C','E'),('C','G')])
G.add_edges_from([('D','F'),('D','G')])
G.add_edges_from([('E','H'),('F','H'),('G','H')])

# set defaults
G.graph['graph']={'rankdir':'TD'}
G.graph['node']={'shape':'circle'}
G.graph['edges']={'arrowsize':'4.0'}

A = to_agraph(G)
print(A)
A.layout('dot')
A.draw('abcd.png')

Produces the output

strict digraph {
    graph [rankdir=TD];
    node [label="\N",
        shape=circle
    ];
    A    [rank=0];
    C    [fillcolor=red,
        style=filled];
    A -> C   [penwidth=2.0];
    B    [fillcolor=red,
        style=filled];
    A -> B   [arrowsize=2.0];
    D    [fillcolor=red,
        style=filled];
    A -> D;
    C -> E;
    C -> G;
    B -> E   [color=blue];
    B -> F   [color=blue];
    D -> G;
    D -> F;
    H    [label=target];
    E -> H;
    G -> H;
    F -> H;
}

which is rendered by dot as

enter image description here

You can read about the adjustable drawing parameters at http://www.graphviz.org/doc/info/attrs.html

like image 145
Aric Avatar answered Nov 03 '22 03:11

Aric