如何显示不同节点之间的关系
Posted
技术标签:
【中文标题】如何显示不同节点之间的关系【英文标题】:How to display relationships between different nodes 【发布时间】:2020-10-18 14:58:55 【问题描述】:我希望能够看到两个(或更多)节点之间的关系。
假设我有这两条路径: 1-2-4-5-7-8 1-3-4-6-7-8
由此我们可以看到节点 2 和 5 “链接在一起”,节点 3 和 6 也是如此。
但如果我只是将这些路径添加到图表中,我最终会得到类似的结果:
G = nx.DiGraph()
nx.add_path(G, [1,2,4,5,7,8])
nx.add_path(G, [1,3,4,6,7,8])
nx.draw(G, with_labels=True)
plt.show()
但它没有显示 2&5 和 3&6 之间的关系,而且似乎我可以拥有 2&6 和 3&5 的组合,即使它们在我的初始路径中不存在。
还有什么可以显示的吗?
我正在编写这个 python 并使用库 networkx 来构建图形和 pygraphviz 以进行可视化/渲染。
【问题讨论】:
您的路径都不包括从 2 到 5 或从 3 到 6 的弧;这两个遍历都跨过中间节点。你希望这幅画展示什么?如果您希望看到从 2 到 5 的弧线,为什么不从 1 到 4 以及所有其他弧? 也许 OP 的意思是两条链是相同的,但一条链使用“2”和“5”,而另一条链在同一个地方使用“3”和“5”。但是OP应该让它更清楚一点。 OP 还应该添加生成的点文件。也许像这样的表示:digraph G 1 -> 2 -> 4 -> 5 -> 7 -> 8; 1 -> 3 -> 4 -> 6 -> 7 -> 8
更符合预期。
我理解所显示内容背后的逻辑,但我的意思是,根据我拥有的数据,如果我走 1->2 的路径,那么以下总是 2->4-> 5->7->8。而且我从来没有遇到过1->2->4->6->7->8这样的路径。基本上 2->4->5 和 3->4->6 应该是树的分离部分。
但是,iiuc,这是不可能的。每个节点名称必须是唯一的。因此,如果 1 具有 2 的边缘,2 具有 4 的边缘,则 1 和 4 通过节点 2 连接。所以你可能不得不重命名不同分支中的节点@florian
@yatu 我想唯一的解决方案是将节点重命名为两个节点的融合,以便路径看起来像 (1,2)->(2,4)->(4,5 )->(5,7)->(7,8)。这样节点(2-> 4)永远不会导致节点(4,6)。这并不理想,但我想我可以使用它。谢谢
【参考方案1】:
但它没有显示 2&5 和 3&6 之间的关系
我认为您可能会混淆 path 究竟是什么。通过向网络添加路径,您将路径中的所有连续节点添加为边。所以添加路径(1,2,4)
与添加边缘((1,2), (2,4))
相同。因此,图中的节点2
和5
通过节点序列2,4,5
连接,遵循此逻辑。
但是根据您的描述,您需要所有这些节点的组合,例如:
from itertools import combinations
G = nx.DiGraph()
l1 = [1,2,4,5,7,8]
G.add_edges_from(combinations(l1, r=2))
plt.figure(figsize=(10,6))
nx.draw(G, with_labels=True)
plt.show()
似乎我可以使用 2&6 和 3&5 的组合,即使它们在我的初始路径中不存在。
节点2
和6
,即使它们是通过不同的路径添加的,它们都是connected,这意味着节点6
可以从节点2
通过1访问,2,4,5,7,8 和 1,3,4,6,7,8 来自第二条路径。
【讨论】:
我知道节点 6 通过节点 4 连接到节点 2 和 3,这正是我不想要的。根据我拥有的数据,我想表示节点 5 只有在我来自节点 2 和 4 时才会出现,而节点 6 只有在我来自节点 3 和 4 时才会出现。基本上路径 2->4- >5 和 3->4->6 应该是树的平行分支。 答案对@florian 有帮助吗?不要忘记您可以投票并接受答案。见What should I do when someone answers my question?,谢谢! 我赞成(我认为?)您对我最初帖子的最后评论,但那个特定的答案并没有帮助。此处显示不存在的边(例如 1->8 或 1->5)。以上是关于如何显示不同节点之间的关系的主要内容,如果未能解决你的问题,请参考以下文章
如何理解配置图中节点之间的关联关系,它和类之间的关联关系有啥联系