一文带你搞懂networkx基础知识,自己绘制网络图。(绝对细致)


前言

最近学习到了networkx感觉还挺有趣,下面来和大家分享一下学到的东西。其他还有DGL,PyG也可以绘制,我们有了大致的方向学习起来就会快一些。下面我们一起学习一下networkx吧。

一、networkx是什么?

networkx在02年5月产生,是用python语言编写的软件包,便于用户对复杂网络进行创建、操作和学习。利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等。我们用它可以将网络图可视化。下面给大家看一下我自己画的一个例子吧。这样就大概可以了解怎么回事了。
在这里插入图片描述
这是我自己构建的一个网络图,中间的蓝色节点是节点度最大的节点。下面我们来学习一下如何搭建一个网络图。

二、networkx实战

1.networkx安装

安装方式主要有三种
1.命令行pip
2.pycharm安装
3.官方下载whl文件进行安装
我给大家介绍一下第一种方式吧,第一种基本就可以安装成功了。
1.win+r
在这里插入图片描述
2.进入命令行面板
在这里插入图片描述
3.进入命令行后输入pip install networkx
在这里插入图片描述
我已经安装过了

2.创建图形

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

import networkx as nx
G = nx.Graph()
G = nx.DiGraph()
G = nx.MultiGraph()
G = nx.MultiDiGraph()

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

3.添加节点

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

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

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

4.添加边

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

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

下面我们来看一下效果吧
在这里插入图片描述
在这里插入图片描述
这样一个基础图就画好了,但是感觉很简陋对不对,就好比我们平常在白纸上面画画,不上色的话总是会让人觉得很单调。

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

运行样式:
- node_size: 指定节点的尺寸大小(默认是300)
- node_color: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜 色,例如’r’为红色,'b’为绿色等)
- node_shape: 节点的形状(默认是圆形,用字符串’o’标识)
- alpha: 透明度 (默认是1.0,不透明,0为完全透明)
- width: 边的宽度 (默认为1.0)
- edge_color: 边的颜色(默认为黑色)
- style: 边的样式(默认为实现,可选: solid|dashed|dotted,dashdot)
- with_labels: 节点是否带标签(默认为True)
- font_size: 节点标签字体大小 (默认为12)
- font_color: 节点标签字体颜色(默认为黑色)
- pos: 布局

运用布局:
  circular_layout:节点在一个圆环上均匀分布
  random_layout:节点随机分布
  shell_layout:节点在同心圆上分布
  spring_layout: 用Fruchterman-Reingold算法排列节点(样子类似多中心放射状)
  spectral_layout:根据图的拉普拉斯特征向量排列节点
我们需要在nx.draw这行代码里面添加属性。

添加节点大小和节点颜色属性

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

在这里插入图片描述
添加布局属性

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

在这里插入图片描述
每个节点使用不同的颜色

G.add_edges_from([(1,2),(2,3),(3,4),(4,1)]);
color=['#7FFF00','#0000ff','#9999ff','#ff00ff']
pos =nx.shell_layout(G)
nx.draw(G, with_labels=True,node_size=200,node_color=color,pos=pos)

在这里插入图片描述
我们还可以给每个节点设置不同的颜色。当然大小也可以,这里自由发挥就好了。
学到这里基本的图就会画了,下面学习一下通过数据集进行绘制绘制网络图

6.样例实现

绘制一个小型网络图

import networkx as nx
import matplotlib.pyplot as plt
net_grid = nx.Graph()
# nodes
list_net_nodes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
# edges
list_net_edges = [(1, 3), (3, 5), (5, 4), (4, 2), (2, 6),
                  (5, 7), (5, 8), (8, 6),
                  (7, 9), (8, 9), (6, 10),
                  (9, 11), (10, 12), (10, 13),
                  (11, 14), (12, 14), (12, 15),
                  (14, 16), (15, 16), (15, 17),
                  (16, 18), (17, 19),
                  (18, 20), (19, 20)]
net_grid.add_nodes_from(list_net_nodes)
net_grid.add_edges_from(list_net_edges)
pos = nx.random_layout(net_grid)#随机分布
nx.draw_networkx_nodes(net_grid, pos=pos, node_color='#7FFF00', node_size=200, alpha=0.6)#点的样式
nx.draw_networkx_edges(net_grid, pos=pos, width=0.3, alpha=0.2)#边的样式
plt.show()

在这里插入图片描述

7.导入数据进行绘图

绘制一个真实网络图
这里的样例我是下载的football数据集,数据集很小,可以作为一个小案例进行学习,如果有同学需要的话可以管我要。废话不多说我们开始吧
1.提取出边和点

import networkx as nx
import matplotlib.pyplot as plt
net_grid = nx.Graph()
#构建函数,提取出数据集里的边和点
def read_gml(data):
    H = nx.read_gml(data)
    nodedata= H.nodes;
    eagedata=H.edges;
    return nodedata,eagedata
#引用函数得到边和点
(nodeums,edgesnum)=read_gml('E:\\pythonproject\\SImode\\data\\football.gml')

2.进行绘图

net_grid.add_nodes_from(nodeums)
net_grid.add_edges_from(edgesnum)
pos = nx.random_layout(net_grid)
nx.draw_networkx_nodes(net_grid, pos=pos, node_color='#7FFF00', node_size=150, alpha=0.7)#点的样式
nx.draw_networkx_edges(net_grid, pos=pos, width=0.3, alpha=0.2)#边的样式
plt.show()

3.运行结果
在这里插入图片描述

总结

总的来说networkx基础还是比较好上手的,如果需要更高级的语法可以参考官方文档
官方文档:https://www.osgeo.cn/networkx/tutorial.html
参考链接:https://blog.csdn.net/fyfugoyfa/article/details/107830112
大家可以看一下我参考的这篇文档,写的很细,然后也可以看一下这个哥们的其他文档,写的都很认真,干货慢慢。

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108724231