initial revision
[ucgine.git] / tools / cfzy / libconfizery / cfzy_expr_graph.py
1 #!/usr/bin/env python
2
3 import matplotlib.pyplot as plt
4 import networkx as nx
5 import sys, re, random
6
7 G = nx.Graph()
8 labels = {}
9 levels = {}
10 init_pos = {}
11 maxlevel = 0
12
13 # always keep the same seed
14 random.seed(1234)
15
16 # parse lines, new vertice is:
17 #   vertice LEVEL OPERATOR:VERTICE_NAME
18 # new edge is:
19 #   edge OPERATOR:VERTICE_NAME OPERATOR:VERTICE_NAME
20 while True:
21     l = sys.stdin.readline()
22     if l == "":
23         break
24     m = re.match("^vertice ([0-9]+) ([^\s]+)$", l)
25     if m:
26         level = m.groups()[0]
27         level = int(level)
28         operator, name = m.groups()[1].split(":")
29         print "vert: operator = %s, level = %d, name = %s"%(operator, level, name)
30         labels[name] = operator
31         init_pos[name] = (random.random(), -level)
32         levels[name] = level
33         if level > maxlevel:
34             maxlevel = level
35         continue
36     m = re.match("^edge ([^\s]+) ([^\s]+)$", l)
37     if m:
38         vertice1, vertice2 = m.groups()
39         G.add_edge(vertice1, vertice2)
40         continue
41
42 pos = nx.spring_layout(G, pos=init_pos)
43
44 # root node is blue and bigger
45 rootnode = filter(lambda x:levels[x] == 0, levels.keys())
46 nx.draw_networkx_nodes(G, pos, node_color='b', node_size=2000, nodelist=rootnode)
47
48 # graph other nodes
49 for level in range(1, maxlevel + 1):
50     othernodes = filter(lambda x:levels[x] == level, levels.keys())
51     color = (1., float(level)/maxlevel, float(level)/maxlevel)
52     color = [color] * len(othernodes)
53     nx.draw_networkx_nodes(G, pos, node_color=color, node_size=1000, nodelist=othernodes)
54
55 nx.draw_networkx_edges(G, pos)
56 nx.draw_networkx_labels(G, pos, labels, font_size=20, font_family='sans-serif')
57
58 plt.axis('off')
59 plt.savefig("weighted_graph.png") # save as png
60 plt.show() # display