其他
GitHub 标星 8.2k!Python 超赞的绘图库 networkx
The following article is from 袁厨的算法小屋 Author tan45du
(给Python开发者加星标,提升Python技能)
来源:袁厨的算法小屋-tan45du (本文来自作者投稿)
一、概述
二、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基础知识
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。
- EOF -
觉得本文对你有帮助?请分享给更多人
关注「Python开发者」加星标,提升Python技能
点赞和在看就是最大的支持❤️