前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >干货!利用Python绘制精美网络关系图

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

作者头像
公众号袁厨的算法小屋
发布2020-11-25 09:39:14
10.9K2
发布2020-11-25 09:39:14
举报
文章被收录于专栏:袁厨的算法小屋

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

一、概述

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

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

小世界网络图

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

二、NetWorkx安装

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

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

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

在这里插入图片描述

2.输入安装代码
代码语言:javascript
复制
pip install networkx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

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

三、NetworkX基础知识

1.创建图

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

代码语言:javascript
复制
import networkx as nx
G = nx.Graph()#无多重边无向图
G = nx.DiGraph()#无多重边有向图
G = nx.MultiGraph()#有多重边无向图
G = nx.MultiDiGraph()#有多重边有向图

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

2.添加节点

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

代码语言:javascript
复制
G.add_node()#添加节点1
G.add_nodes_from([, ])#添加节点2,3

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

3.添加边

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

代码语言:javascript
复制
G.add_edge('x', 'y')   # 添加一条边起点为x,终点为y
G.add_edges_from([(, ), (, ), (, )])   # 添加多条边

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

代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()  # 无多重边无向图
G.add_node()  # 添加节点1
G.add_nodes_from([, ])  # 添加节点2,3
G.add_nodes_from([, , , , ])  # 添加节点2,3
G.add_edge('x', 'y')  # 添加一条边起点为x,终点为y
G.add_edges_from([(, ), (, ), (, ), (, )]);
G.add_edges_from([(, ), (, ), (, )])  # 添加多条边
nx.draw(G, with_labels=True);
plt.show()


4.给图中的节点和边添加属性
代码语言:javascript
复制
运行样式:
      - `node_size`:  指定节点的尺寸大小(默认是)
      - `node_color`:  指定节点的颜色 (默认是红色,可以用字符串简单标识颜     色,例如'r'为红色,'b'为绿色等)
      - `node_shape`:  节点的形状(默认是圆形,用字符串'o'标识)
      - `alpha`: 透明度 (默认是1.0,不透明,为完全透明) 
      - `width`: 边的宽度 (默认为1.0)
      - `edge_color`: 边的颜色(默认为黑色)
      - `style`: 边的样式(默认为实现,可选:solid|dashed|dotted,dashdot)
      - `with_labels`: 节点是否带标签(默认为True)
      - `font_size`: 节点标签字体大小 (默认为)
      - `font_color`: 节点标签字体颜色(默认为黑色)
      - `pos`: 布局

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

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

添加节点属性
代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()  # 无多重边无向图
G.add_nodes_from([,,,,,])  # 添加节点2,3
G.add_edges_from([(, ), (, ), (, ), (, ),(,),(,)]);
nx.draw(G, with_labels=True,node_size=,node_color='#7FFF00')#在这里添加属性,添加颜色和大小
plt.show()
添加布局属性
代码语言:javascript
复制
pos =nx.shell_layout(G)
nx.draw(G,with_labels=True,node_size=,node_color='#7FFF00',pos=pos)
代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()  # 无多重边无向图
G.add_nodes_from([,,,,,,,,,])  # 添加节点2,3
G.add_edges_from([(, ), (, ), (, ), (, ),(,),(,),(,),(,),(,),(,),(,),(,)]);
pos =nx.shell_layout(G)
nx.draw(G,with_labels=True,node_size=,node_color='#7FFF00',pos=pos)
plt.show()

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

给节点添加不同的颜色
代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()  # 无多重边无向图
G.add_edges_from([(,),(,),(,),(,)]);
color=['#7FFF00','#0000ff','#9999ff','#ff00ff']
pos =nx.shell_layout(G)
nx.draw(G, with_labels=True,node_size=,node_color=color,pos=pos)
plt.show()

不同节点不同颜色

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

5.样例实现

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

代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt
net_grid = nx.Graph()
# nodes
list_net_nodes = [, , , , , , , , , , , , , , , , , , , ]
# edges
list_net_edges = [(, ), (, ), (, ), (, ), (, ),
                  (, ), (, ), (, ),
                  (, ), (, ), (, ),
                  (, ), (, ), (, ),
                  (, ), (, ), (, ),
                  (, ), (, ), (, ),
                  (, ), (, ),(, ),(, ),
                  (, ), (, ),(, ),(, ),(, )]
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=, alpha=0.6)#点的样式
nx.draw_networkx_edges(net_grid, pos=pos, width=0.5, alpha=0.4)#边的样式
plt.show()

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

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

代码语言:javascript
复制
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=, alpha=0.7)#点的样式
nx.draw_networkx_edges(net_grid, pos=pos, width=0.3, alpha=0.2)#边的样式
plt.show()

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 袁厨的算法小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、NetWorkx安装
    • 1.win+r进入命令行界面
      • 2.输入安装代码
      • 三、NetworkX基础知识
        • 1.创建图
          • 2.添加节点
            • 3.添加边
              • 4.给图中的节点和边添加属性
                • 添加节点属性
                • 添加布局属性
                • 给节点添加不同的颜色
              • 5.样例实现
                • 学到这里基本的图就会画了,下面学习一下通过数据集进行绘制绘制网络图
                  • 6.导入数据进行绘图
                  相关产品与服务
                  灰盒安全测试
                  腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档