最近发现一个特别好用的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。
返回搜狐,查看更多
责任编辑:
平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。