Share&Joy

Ginger' Blog


  • 首页
  • 归档
  • 标签
  •   

© 2018 1-riverfish

Theme Typography by Makito

Proudly published with Hexo

小试Python NetworkX绘图库

发布于 2018-05-17 Python Networkx 

NetworkX绘制复杂网络图

NetworkX示例图

友情提示:本篇多图杀猫

还是上次旅管学院的洪学姐,这次的要求是根据矩阵绘制一张网络图(要是一开始我就知道这是网络图就好了…),学姐自己用软件绘制出来的图是这样的

学姐画的图

学姐提的需求是为节点之间边加上方向箭头另外根据流量调整边的宽度,简单点说,学姐想要得到这个效果

学姐想要得到的效果

好了,现在需求明确了,可以开始工作了(确定实现的方式和调用的库(networkX)又费了不少时间…),Python绘图库很多,在经过一番摸索后发现mathplotlib库无法实现想要的效果,果断放弃。

NetworkX介绍

实现

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
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

matrix = np.loadtxt(open("matrixdata.csv","rb"),delimiter=",",skiprows=0)

G = nx.DiGraph()

for i in range(0,len(matrix)):
for j in range(0,len(matrix)):
if int(matrix[i][j]) != 0:
G.add_edge(i,j)

pos = nx.random_layout(G)
print(len(matrix))
node_size = [821,539,72,261,246,3,31,43,1349,22,6,132,67,359,815,455,4003,366,10,504,76,215,51,68,18,10,10]# 3
print(len(node_size))

# nx.draw(G,pos = pos,with_labels = True,font_size =18)
nx.draw_networkx(G,pos,with_labels=False,font_size=10,node_size=1,node_color='r',edge_color='b',width=1.0)
for i in range(0,len(matrix)):
nx.draw_networkx_nodes(G,pos,[i],node_size = node_size[i]/3,node_color='r')
for j in range(0,len(matrix)):
if matrix[i][j] >= 50:
nx.draw_networkx_edges(G,pos,[(i,j)],width=matrix[i,j]/20,edge_color='b',alpha=1)
else:
if matrix[i][j] >= 30:
nx.draw_networkx_edges(G,pos,[(i,j)],width=matrix[i,j]/500,edge_color='b',alpha=1)
else:
nx.draw_networkx_edges(G,pos,[(i,j)],width=0.001,edge_color='b',alpha=1)


plt.savefig("ba.png")
plt.show()

给出最后的效果图,学姐表示还算满意

最后效果图

效果图2

参考博客1

参考博客2

博客仅仅是用来快速实现功能,因为学姐要求比较着急,想要对库有更深入的了解并且想画出更漂亮和专业的网络图,请参考官方文档

分享到 

 上一篇: 外科手术队伍 下一篇: 搭建Chevereto图床 

© 2018 1-riverfish

Theme Typography by Makito

Proudly published with Hexo