python - 计算networkx中节点之间的边
问题描述
我有一个图,其中我的节点可以在两个方向上在它们之间有多个边,我想根据它们之间所有边的总和来设置节点之间的宽度。
import networkx as nx
nodes = [0,1]
edges = [(0,1),(1,0)]
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
weights = [2,3]
nx.draw(G, width = weights)
我想将 0 到 1 之间的宽度设置为 5,因为这是总重量。
解决方案
首先,您需要创建一个MultiDiGraph
并向其添加所有可能的边。这是因为它支持同一组节点之间的多个有向egdes,包括自环。
import networkx as nx
nodes = [0, 1, 2, 3, 4, 5]
edges = [(0,1), (1,0), (1, 0),(0, 1), (2, 3), (2, 3), (2, 3), (2, 3),
(4, 1), (4, 1), (4, 1), (4, 1), (4, 1), (4, 1), (4, 5), (5, 0)]
G = nx.MultiDiGraph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
接下来,创建一个包含每条边数的字典
from collections import Counter
width_dict = Counter(G.edges())
edge_width = [ (u, v, {'width': value})
for ((u, v), value) in width_dict.items()]
现在DiGraph
从edge_width
上面创建的字典中创建一个新的
G_new = nx.DiGraph()
G_new.add_edges_from(edge_width)
使用加厚边缘绘图
这是此处提到的答案的扩展。
edges = G_new.edges()
weights = [G_new[u][v]['width'] for u,v in edges]
nx.draw(G_new, edges=edges, width=weights)
添加边缘标签
有关更多信息,请参阅此答案。
pos = nx.spring_layout(G_new)
nx.draw(G_new, pos)
edge_labels=dict([((u,v,),d['width'])
for u,v,d in G_new.edges(data=True)])
nx.draw_networkx_edges(G_new, pos=pos)
nx.draw_networkx_edge_labels(G_new, pos, edge_labels=edge_labels,
label_pos=0.25, font_size=10)
您还可以使用工作代码查看此 Google Colab Notebook 。
参考
推荐阅读
- fullcalendar - 完整日历 5 - 更改月份更新网址
- javascript - React - 浏览器未检测到更改并且控制台显示“[HMR] 等待来自 WDS 的更新信号...”
- javascript - 如何在 Javascript 正则表达式中指定字符的开始序列和字符的结束序列
- docker - 提示输入国家/地区的键盘后,使用 Ubuntu 18.04 映像的 docker build 挂起
- sql - 如何在 SQL 查询中提取所有表(包括 where 引用)?
- mysql - 如何将 VARCHAR 列单元格值转换为日期格式?
- java - 执行 String .split() 时无法删除前导空格
- c# - 从 XmlSchemaElement 获取 XPath
- python - Django 模型不保存表单中的所有数据
- reactjs - 推送到历史会给出一个空白页面而不是查询页面