利用NetworkX库进行图论绘图

#-*- coding: utf-8 -*- 
import matplotlib.pyplot as plt
import networkx as nx                            #导入NetworkX包,为了少打几个字母,将其重命名为nx
import random
import sys


G = nx.Graph()                                        #建立一个空的无向图G
'''
G.add_node(1)                                        #添加一个节点1
G.add_edge(2,3)                                     #添加一条边2-3(隐含着添加了两个节点2、3)
G.add_edge(3,2)                                     #对于无向图,边3-2与边2-3被认为是一条边
'''

maxsub=4
layer=4

rootdict={}

rootdict[0]='1'
G.add_node('1')                                     

for i in range(1,layer):
    rootdict[i]=[]
    for j in rootdict[i-1]:
        tmprandom = random.randint(2, maxsub)
        print j,' tmprandom:',tmprandom
        for k in range(1,tmprandom+1):
            rootdict[i].append(str(j)+str(k))
            G.add_node(str(j)+str(k))
            G.add_edge(str(j),str(j)+str(k),weight=layer-i+1)
        print rootdict[i]            
    

#sys.exit(0)



#G = nx.random_graphs.random_regular_graph(3, 10)
print G.nodes()                                       #输出全部的节点: [1, 2, 3]
print G.edges()                                       #输出全部的边:[(2, 3)]
print G.number_of_edges()                    #输出边的数量:1 



pos = nx.fruchterman_reingold_layout(G)
#nx.draw_networkx_labels(G,pos,font_size=40)
#print pos


nx.draw_networkx(G, pos, with_labels = True, node_size = 160, font_size=30, node_color='g',alpha=0.25)

# nodes  
nx.draw_networkx_nodes(G,pos,node_size=160, node_color='g',alpha=0.25)  

#根据权重,实线为权值大的边,虚线为权值小的边  
# edges  

#elarge=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] >2]  
#esmall=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] <=2]  
#print esmall

edges_list=[]
for i in range(1,layer):
    tmplist = [(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] <=layer+1-i and d['weight'] >layer-i]  
    edges_list.append(tmplist)


for i in range(0,layer-1):
    print edges_list[i]
    nx.draw_networkx_edges(G,pos,edgelist=edges_list[i], width=(layer-i-1)*3,edge_color='r')  


#nx.draw_networkx_edges(G,pos,edgelist=elarge, width=3,edge_color='r')  
#nx.draw_networkx_edges(G,pos,edgelist=esmall, width=1,edge_color='r')  
  
# labels标签定义  
nx.draw_networkx_labels(G,pos,font_size=30)  



#nx.draw_networkx(G, pos, with_labels = True, node_size = 20)

#nx.draw(G, pos, with_labels = False, node_size = 40)

path=nx.all_pairs_shortest_path(G)     #调用多源最短路径算法,计算图G所有节点间的最短路径
#print path[1][6]                                     #输出节点0、2之间的最短路径序列: [0, 1, 2]
#print path[][]
plt.show()

猜你喜欢

转载自blog.csdn.net/b0207191/article/details/91373187