Networkx学习1 - 无向图&有向图&加权图

Python中的Networkx能够方便地创建社会网络,语义网络等网络结构,并进行各种分析,记录下学习的过程,方便自己的记忆。

1. 安装

在windows中安装的python3.9以及pycharm2020社区版,配置python环境变量

安装networkx,直接pip install nexworkx即可,调试版本为networkx2.6.2, 在pycharm中创建python项目,Venv中再次导入一下networkx。

2. 无向图

 例1:创建无向图nx.Graph() 无向图中两点间最多只有一条边。

import networkx as nx
import matplotlib.pyplot as plt

#无向图
G = nx.Graph()
G.add_node(1)   #添加一个节点
G.add_edge(2,3) #添加一个边,隐含的添加两个节点2,3
G.add_edge(3,2) #无向图中,23和32是同一条边
print('nodes:',G.nodes())   #输出全部的节点
print('edges:', G.edges())  #输出全部的边
print('number of edges:',G.number_of_edges())   #输出边的数量
nx.draw(G)
plt.savefig("wuxiangtu.png")
plt.show()

创建的点的位置是随机的,结果如下:

例2:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_node(1)
G.add_node(2)  # 加点
G.add_nodes_from([3, 4, 5, 6])  # 加点集合
G.add_edge(1, 3)
nx.add_cycle(G, [1,2,3,4])  #加环,使用nx的add_cycle()方法,创建4条边
G.add_edges_from([(3, 5), (3, 6), (6, 7)])  # 加边集合
nx.draw(G)
plt.savefig("youxiangtu.png")
plt.show()

 

3. 有向图
 

nx.DiGraph()创建有向图

例1:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
G.add_node(1)
G.add_node(2)
G.add_nodes_from([3, 4, 5, 6])
nx.add_cycle(G,[1, 2, 3, 4])    #创建环
G.add_edge(1, 3)
G.add_edges_from([(3, 5), (3, 6), (6, 7)])
# G = G.to_undirected()     #测试有向图转换为无向图
# G = G.to_directed()       #测试无向图转换为有向图
nx.draw(G, with_labels=True)    #为了显示节点的标签名称,使用with_labels=True
plt.savefig("youxiangtu.png")
plt.show()

 

有向图和无向图可以互相转换

  • Graph.to_undirected()
  • Graph.to_directed()

在无向图转换为有向图时,所有边将变成双向边

例2:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()

#road_nodes = {'a': 1, 'b': 2, 'c': 3}
road_nodes = {'a':{1:1}, 'b':{2:2}, 'c':{3:3}}
road_edges = [('a', 'b'), ('b', 'c')]

G.add_nodes_from(road_nodes.items())
G.add_edges_from(road_edges)

nx.draw(G, with_labels=True)
plt.savefig("youxiangtu.png")
plt.show()

4. 加权图

有向图和无向图都可以给边赋予权重,用到的方法是add_weighted_edges_from,它接受1个或多个三元组[u,v,w]作为参数,其中u是起点,v是终点,w是权重。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()  # 建立一个空的无向图G
G.add_edge(2, 3)  # 添加一条边2-3(隐含着添加了两个节点2、3)
G.add_weighted_edges_from([(3, 4, 3.5), (3, 5, 7.0)])  # 对于无向图,边3-2与边2-3被认为是一条边

print("weight from 2 to 3", G.get_edge_data(2, 3))

print("weight from 3 to 4", G.get_edge_data(3, 4))

print("weight from 3 to 5", G.get_edge_data(3, 5))

nx.draw(G, with_labels=True)
plt.savefig("wuxiangtu.png")
plt.show()

 结果:

weight from 2 to 3 {}
weight from 3 to 4 {'weight': 3.5}
weight from 3 to 5 {'weight': 7.0}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值