栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

networks模块及固定坐标问题——python

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

networks模块及固定坐标问题——python

一、绘制无向图 1、对节点的操作
G = nx.Graph()
G.add_node('a')   #单个添加
G.add_nodes_from(['b','c','d','e'])  #多个
nx.add_cycle(G,['f','g','h','i'])    #添加一个环
# print(G.nodes())
H = nx.path_graph(10)   #返回由10个节点挨个连接的无向图,所有有九条边
G.add_nodes_from(H)    #创建一个子图H加入G
# G.add_node(H)         #直接将图作为节点
# print(G.nodes())
print('所有节点:',G.nodes())
print('所有节点个数',G.number_of_nodes())
nx.draw(G,with_labels=True)
plt.show()

输出:

所有节点: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
所有节点个数 19


删除节点

G.remove_node(1)
G.remove_nodes_from(['b','c','d','e'])  #删除集合中所有节点
nx.draw(G,with_labels=True)
plt.show()

输出:

2、对边的操作
#添加边
F = nx.Graph() #创建无向图
F.add_edge(11,12)   #添加一条边,11连12
#等价于
e = (13,14)
F.add_edge(*e)
H = nx.path_graph(10)
F.add_edges_from(H.edges())   #不能写作 F.add_edges_from(H)
print('图中所有的边:',F.edges())            #节点用nodes
print('图中所有边个数',F.number_of_edges())    
nx.draw(F,with_labels=True,node_color='yellow',node_shape='s',font_color='blue')  #节点设置正方形,标签为蓝色
plt.show()

输出:

图中所有的边: [(11, 12), (13, 14), (0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9)]
图中所有边个数 11


其中对nx.draw()中参数讲解,可参考。

二、有向图
G = nx.DiGraph()
start = [1,3,5,7]
to = [2,4,6,8]
for j in range(len(start)):
    G.add_edge(start[j],to[j])
nx.draw(G,with_labels=True)
plt.show()

输出:

三、带权无向图
G = nx.Graph()
start = [1,3,5,7]
to = [2,4,6,8]
value = [1,0.5,12,5]
for j in range(len(start)):
    G.add_weighted_edges_from([(start[j],to[j],value[j])])  #边的起点,终点,权重
nx.draw(G,with_labels=True,pos=nx.circular_layout(G),width=[float(v['weight']) for (r,c,v) in G.edges(data=True)])
plt.show()
#这里将权重的大小,设置为边的粗细

输出:

四、带权有向图
G = nx.DiGraph()
start = [1,3,5,7]
to = [2,4,6,8]
value = [1,0.5,12,5]
for j in range(len(start)):
    G.add_weighted_edges_from([(start[j],to[j],value[j])])  #边的起点,终点,权重
nx.draw(G,with_labels=True,pos=nx.circular_layout(G),width=[float(v['weight']) for (r,c,v) in G.edges(data=True)])
plt.show()

输出:

五、固定坐标绘制无向图 示例1
# 固定坐标绘图
x = [1,3,4,5,7,6]
y = [4,5,2,8,5,10]
pos = {i+1:[x[i],y[i]] for i in range(len(x))}
G = nx.Graph()
G.add_nodes_from(pos.keys())
for n,p in pos.items():
    G._node[n]['pos'] = p
G.add_edges_from([(1,3),(1,5),(2,4),(3,6),(4,6)])
nx.draw(G,pos=pos,with_labels=True,font_size=8,node_size=150)
plt.show()

输出:

示例2
import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
# 添加对应的边和点
for i in range(1, 10):
    G.add_node(i, desc=str(i))  # 结点名称不能为str,desc为标签即结点名称
G.add_edge(1, 2, name='6')          # 添加边, 参数name为边权值
G.add_edge(1, 3, name='4')
G.add_edge(1, 4, name='5')
G.add_edge(2, 5, name='1')
G.add_edge(3, 5, name='1')
G.add_edge(4, 6, name='2')
G.add_edge(5, 7, name='9')
G.add_edge(5, 8, name='7')
G.add_edge(6, 8, name='4')
G.add_edge(7, 9, name='2')
G.add_edge(8, 9, name='4')

pos = [(1, 3), (1, 3), (2, 4), (2, 2),  (2, 1),  (3, 3),  (4, 1),  (5, 4), (5, 2),  (6, 3)]  # pos列表从第0位开始,但我定义是从结点1开始,这里令前两个坐标相同
# 按pos所定位置画出节点,无标签无权值
nx.draw_networkx(G, pos, with_labels=None)
# 画出标签
node_labels = nx.get_node_attributes(G, 'desc')
nx.draw_networkx_labels(G, pos, labels=node_labels)
# 画出边权值
edge_labels = nx.get_edge_attributes(G, 'name')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

plt.title('AOE_CPM', fontsize=10)
plt.show()

输出:

Networkx教程
固定坐标

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019252.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号