【问题标题】:Treat Edges between the same nodes as different将相同节点之间的边视为不同
【发布时间】:2019-02-26 02:05:43
【问题描述】:

我正在使用 networkx 从节点对的边创建图形。问题是有时这对重复但它们是单独的边缘。

因此,在下面的示例中,每个链接都是一个单独的跃点,我们将流量从 c:3 发送到 d:4 作为 STM-16,然后它返回到 STM-4 再返回到发送它的 c:3到 e:5。所以我想把这一切渲染成一条直线。

两个节点之间的每个链接都是不同的,并且有一个单独的链接标签

例子:

edgeList=[]

start_time = time.time() 

G = nx.Graph()

G.add_edges_from([
(('a:1'), ('b:2'), {'link':'one'}),
(('b:2'), ('c:3'), {'link':'two'}),
(('c:3'), ('d:4'), {'link':'three'}),
(('d:4'), ('c:3'), {'link':'four'}),
(('c:3'), ('e:5'), {'link':'five'})
])

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

这给了我: graph output

我要找的是一条直线,我想从

a:1>>b:2>>c:3>>d:4>>c:3>>e:5

在 C3 直线而不是分叉

我不能使用有向图,因为我没有方向,我有一个 (node1, node2, linkname) 的无序集合

另外,我不能更改节点名称,它们稍后用于拉入一组节点属性

【问题讨论】:

    标签: python networkx


    【解决方案1】:

    您违反了图的一个基本属性:给定标签唯一地标识一个节点。你告诉networkx去“回到c:3”,它完全按照你说的做了。

    首先,了解图的本质:所有这些边同时存在。绘制图形时,图片中没有线性排序。没有“回到”,只有一端带有箭头的边缘。

    您的基本图论矛盾在这里:

    we send traffic from c:3 to d:4 as STM-16
    and it comes back groomed down to STM-4 
    back to c:3 where it is sent on to e:5
    

    您为两个不同的节点赋予了相同的标签。用图表术语来说,这意味着它们相同的状态,但您的描述清楚地表明您期望不同的操作。简而言之,下定决心。如果它们需要不同的操作,那么它们就是不同的状态,您必须在图形规范中这样描述它们。如果您有一家工厂恰好将这两个步骤放在同一个物理位置,那么这就是您在工厂建设中的问题,而不是这个绘图实用程序的担心。 :-)

    我看到了两个基本的选择:

    (1) 描述性地标记您的步骤。返回位置 c 实际上是第 5 步,而不是返回第 3 步。

    G.add_edges_from([
    (('a:1'), ('b:2'), {'link':'one'}),
    (('b:2'), ('c:3'), {'link':'two'}),
    (('c:3'), ('d:4'), {'link':'three'}),
    (('d:4'), ('c:5'), {'link':'four'}),
    (('c:5'), ('e:6'), {'link':'five'})
    ])
    

    (2) 给networkx 一个标签,用你的 术语描述事物,但使用不显示的装饰:

    G.add_edges_from([
    (('a:1'), ('b:2'), {'link':'one'}),
    (('b:2'), ('c:3'), {'link':'two'}),
    (('c:3'), ('d:4'), {'link':'three'}),
    (('d:4'), (' c:3 '), {'link':'four'}),
    ((' c:3 '), ('e:5'), {'link':'five'})
    ])
    

    我不确定这是否会特别愚弄networkx,但请试一试。如果这不起作用,请尝试使用下划线或句点。在最坏的情况下,也许“c:3.1”和“c:3.2”会满足您的需求。

    【讨论】:

    • 好的,谢谢。所以我希望我可以以一种更以边缘为中心的方式来做到这一点,因为我的边缘标签是唯一的,但如果这不可能,那么我想我需要想办法用唯一的节点跳来构造边缘并映射节点名称作为属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多