添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近发现一个特别好用的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.创建图

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

import networkx as nx

G = nx.Graph #无多重边无向图

G = nx.DiGraph #无多重边有向图

G = nx.MultiGraph #有多重边无向图

G = nx.MultiDiGraph #有多重边有向图

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

2.添加节点

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

G.add_node( 1 ) #添加节点1

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

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

3.添加边 G.add_edge( 'x' , 'y' ) # 添加一条边起点为x,终点为y

G.add_edges_from([( 1 , 2 ), ( 1 , 3 ), ( 2 , 3 )]) # 添加多条边

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

import networkx as nx

import matplotlib.pyplot as plt

G = nx.Graph # 无多重边无向图

G.add_node( 1 ) # 添加节点1

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

G.add_nodes_from([ 2 , 3 , 4 , 5 , 6 ]) # 添加节点2,3

G.add_edge( 'x' , 'y' ) # 添加一条边起点为x,终点为y

G.add_edges_from([( 1 , 2 ), ( 4 , 5 ), ( 5 , 6 ), ( 2 , 4 )]);

G.add_edges_from([( 1 , 2 ), ( 1 , 3 ), ( 2 , 3 )]) # 添加多条边

nx.draw(G, with_labels= True );

plt.show

4.给图中的节点和边添加属性 运行样式:

- `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这行代码里面添加属性。

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

添加节点属性 import networkx as nx

import matplotlib.pyplot as plt

G = nx.Graph # 无多重边无向图

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

G.add_edges_from([( 1 , 2 ), ( 4 , 5 ), ( 5 , 6 ), ( 2 , 4 ),( 1 , 3 ),( 2 , 4 )]);

nx.draw(G, with_labels= True ,node_size= 200 ,node_color= '#7FFF00' ) #在这里添加属性,添加颜色和大小

plt.show

添加布局属性 pos =nx.shell_layout(G)

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

import networkx as nx

import matplotlib.pyplot as plt

G = nx.Graph # 无多重边无向图

G.add_nodes_from([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]) # 添加节点2,3

G.add_edges_from([( 1 , 2 ), ( 4 , 5 ), ( 5 , 6 ), ( 2 , 4 ),( 1 , 3 ),( 2 , 4 ),( 3 , 6 ),( 3 , 7 ),( 4 , 8 ),( 5 , 9 ),( 7 , 10 ),( 1 , 10 )]);

pos =nx.shell_layout(G)

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

plt.show

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

给节点添加不同的颜色 import networkx as nx

import matplotlib.pyplot as plt

G = nx.Graph # 无多重边无向图

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)

plt.show

不同节点不同颜色

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

5.样例实现

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

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 ),( 12 , 2 ),( 12 , 1 ),

( 18 , 20 ), ( 19 , 7 ),( 19 , 2 ),( 19 , 1 ),( 19 , 5 )]

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= '#ff0000' , node_size= 200 , alpha= 0.6 ) #点的样式

nx.draw_networkx_edges(net_grid, pos=pos, width= 0.5 , alpha= 0.4 ) #边的样式

plt.show

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

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

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( 'football.gml' )

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

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

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。