飞道的博客

干货!利用Python绘制精美网络关系图

686人阅读  评论(0)

点击上方蓝字关注我们

    最近发现一个特别好用的python库,能够绘制精美的关系图,俗话说有好东西要学会分享,所以袁厨就肝了这篇文章,大家可以参考一下。

一、概述

     NetworkX是一个用python编写的软件包,便于用户对复杂网络进行创建、操作和学习。

     利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等,Networkx主要用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。我们用它可以将存储在邻接表或邻接矩阵里的网络图可视化。下面给大家看一下我自己画的一个例子吧。这样就大概可以了解怎么回事了。

小世界网络图

    上面这张图片是我绘制的社交关系图,其中蓝色节点代表的是度最高的节点,就是社交关系最复杂的节点。

二、NetWorkx安装

安装方式主要有三种
1.命令行pip
2.pycharm安装
3.官方下载whl文件进行安装

下面我给大家介绍最简单方便的第一种方式吧

1.win+r进入命令行界面

在这里插入图片描述

2.输入安装代码

pip install networkx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

   这里更换了豆瓣的镜像源。可以提高下载速度。安装其他包的时候,将networkx改成其他包名即可。

三、NetworkX基础知识

1.创建图

    首先我们需要创建一个没有边和节点的图形,说白了就是先拿出一张白纸,我们准备在白纸上作画了。


  
  1. import networkx as nx
  2. G = nx.Graph()#无多重边无向图
  3. G = nx.DiGraph()#无多重边有向图
  4. G = nx.MultiGraph()#有多重边无向图
  5. G = nx.MultiDiGraph()#有多重边有向图

    可以创建四种图形,无多重边无向图、无多重边有向图、有多重边无向图、有多重边有向图。常用的就是第一种图了

2.添加节点

   这一步的作用就是在图中添加节点,我们可以一次添加一个节点,也可以添加一个节点列表


  
  1. G.add_node( 1)#添加节点 1
  2. G.add_nodes_from([ 23])#添加节点 23

两个命令是不一样的需要注意一下哦

3.添加边

当然边也可以单个添加和多个添加


  
  1. G.add_edge( 'x''y')   # 添加一条边起点为x,终点为y
  2. G.add_edges_from([( 12), ( 13), ( 23)])   # 添加多条边

下面我们来看一下当前效果


  
  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. G = nx.Graph()  # 无多重边无向图
  4. G.add_node( 1)  # 添加节点 1
  5. G.add_nodes_from([ 23])  # 添加节点 23
  6. G.add_nodes_from([ 23456])  # 添加节点 23
  7. G.add_edge( 'x''y')  # 添加一条边起点为x,终点为y
  8. G.add_edges_from([( 12), ( 45), ( 56), ( 24)]);
  9. G.add_edges_from([( 12), ( 13), ( 23)])  # 添加多条边
  10. nx.draw(G, with_labels=True);
  11. plt.show()

 


 

 

4.给图中的节点和边添加属性


  
  1. 运行样式:
  2.       -  `node_size`:  指定节点的尺寸大小(默认是 300)
  3.       -  `node_color`:  指定节点的颜色 (默认是红色,可以用字符串简单标识颜     色,例如 'r'为红色, 'b'为绿色等)
  4.       -  `node_shape`:  节点的形状(默认是圆形,用字符串 'o'标识)
  5.       -  `alpha`: 透明度 (默认是 1.0,不透明, 0为完全透明) 
  6.       -  `width`: 边的宽度 (默认为 1.0)
  7.       -  `edge_color`: 边的颜色(默认为黑色)
  8.       -  `style`: 边的样式(默认为实现,可选:solid|dashed|dotted,dashdot)
  9.       -  `with_labels`: 节点是否带标签(默认为True)
  10.       -  `font_size`: 节点标签字体大小 (默认为 12)
  11.       -  `font_color`: 节点标签字体颜色(默认为黑色)
  12.       -  `pos`: 布局
  13. 运用布局:
  14.   circular_layout:节点在一个圆环上均匀分布
  15.   random_layout:节点随机分布
  16.   shell_layout:节点在同心圆上分布
  17.   spring_layout: 用Fruchterman-Reingold算法排列节点(样子类似多中心放射状)
  18.   spectral_layout:根据图的拉普拉斯特征向量排列节点
  19. 我们需要在nx.draw这行代码里面添加属性。

下面我们来使用一下这些属性,看看会有什么效果。

添加节点属性


  
  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. G = nx.Graph()  # 无多重边无向图
  4. G.add_nodes_from([ 1, 2, 3, 4, 5, 6])  # 添加节点 23
  5. G.add_edges_from([( 12), ( 45), ( 56), ( 24),( 1, 3),( 2, 4)]);
  6. nx.draw(G, with_labels=True,node_size= 200,node_color= '#7FFF00')#在这里添加属性,添加颜色和大小
  7. plt.show()

 

 


 

 

 

添加布局属性


  
  1. pos =nx.shell_layout(G)
  2. nx.draw(G,with_labels=True,node_size= 200,node_color= '#7FFF00',pos=pos)

  
  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. G = nx.Graph()  # 无多重边无向图
  4. G.add_nodes_from([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])  # 添加节点 23
  5. G.add_edges_from([( 12), ( 45), ( 56), ( 24),( 1, 3),( 2, 4),( 3, 6),( 3, 7),( 4, 8),( 5, 9),( 7, 10),( 1, 10)]);
  6. pos =nx.shell_layout(G)
  7. nx.draw(G,with_labels=True,node_size= 200,node_color= '#7FFF00',pos=pos)
  8. plt.show()

 


 

 

    我们刚才用的属性是节点在同心圆上分布,效果如上图。还有其他分布方式大家可以试一下。

给节点添加不同的颜色


  
  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. G = nx.Graph()  # 无多重边无向图
  4. G.add_edges_from([( 1, 2),( 2, 3),( 3, 4),( 4, 1)]);
  5. color=[ '#7FFF00', '#0000ff', '#9999ff', '#ff00ff']
  6. pos =nx.shell_layout(G)
  7. nx.draw(G, with_labels=True,node_size= 200,node_color=color,pos=pos)
  8. plt.show()

不同节点不同颜色

    我们还可以给每个节点设置不同的颜色。当然大小也可以,这里自由发挥就好了。

5.样例实现

我们用了两种不同的节点分布方式,效果如下。


  
  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. net_grid = nx.Graph()
  4. # nodes
  5. list_net_nodes = [ 1234567891011121314151617181920]
  6. # edges
  7. list_net_edges = [( 13), ( 35), ( 54), ( 42), ( 26),
  8.                   ( 57), ( 58), ( 86),
  9.                   ( 79), ( 89), ( 610),
  10.                   ( 911), ( 1012), ( 1013),
  11.                   ( 1114), ( 1214), ( 1215),
  12.                   ( 1416), ( 1516), ( 1517),
  13.                   ( 1618), ( 1719),( 122),( 121),
  14.                   ( 1820), ( 197),( 192),( 191),( 195)]
  15. net_grid.add_nodes_from(list_net_nodes)
  16. net_grid.add_edges_from(list_net_edges)
  17. pos = nx.random_layout(net_grid)#随机分布
  18. nx.draw_networkx_nodes(net_grid, pos=pos, node_color= '#ff0000', node_size= 200, alpha= 0.6)#点的样式
  19. nx.draw_networkx_edges(net_grid, pos=pos, width= 0.5, alpha= 0.4)#边的样式
  20. plt.show()

 

 

学到这里基本的图就会画了,下面学习一下通过数据集进行绘制绘制网络图

6.导入数据进行绘图

利用football数据集绘制社交关系图,


  
  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. net_grid = nx.Graph()
  4. #构建函数,提取出数据集里的边和点
  5. def read_gml(data):
  6.     H = nx.read_gml(data)
  7.     nodedata= H.nodes;
  8.     eagedata=H.edges;
  9.      return nodedata,eagedata
  10. #引用函数得到边和点
  11. (nodeums,edgesnum)=read_gml( 'football.gml')
  12. net_grid.add_nodes_from(nodeums)
  13. net_grid.add_edges_from(edgesnum)
  14. pos = nx.random_layout(net_grid)#随机分布图
  15. nx.draw_networkx_nodes(net_grid, pos=pos, node_color= '#7FFF00', node_size= 150, alpha= 0.7)#点的样式
  16. nx.draw_networkx_edges(net_grid, pos=pos, width= 0.3, alpha= 0.2)#边的样式
  17. plt.show()

 


 


 

    上面三张图片是利用不同的排列方式进行排列的。Networkx还有很多强大的功能,大家可以继续深挖,这里为大家提供一个入门参考,感谢大家的支持。如果大家感觉Networkx不能满足大家的需求,绘制网络图的python库还有DGL,PyG。

     如果大家需要可以后台回复【绘图】,获取数据集和代码

   大家如果觉得这篇文章对大家有帮助的话,就请大家点个关注和在看吧,你们的支持对我真的帮助很大!

喜欢就点个在看再走吧


转载:https://blog.csdn.net/tan45du_yuan/article/details/109464240
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场