首页 > 解决方案 > 如何过滤具有特定属性的节点并使用networkx图保留路径

问题描述

这些天我正在研究networkx图。假设我有这张图。优先级 1 与蓝色节点,优先级 2 与黄色节点,优先级 3 与紫色节点,优先级 4 与绿色节点。

在此处输入图像描述

我想按优先级过滤。例如第一个优先级 1,它应该过滤带有蓝色的节点。我想保留蓝色节点(优先级 1)并忽略其余节点,它应该看起来像这样。

在此处输入图像描述

对于优先级 2,包括优先级节点,它应该以黄色显示节点。保持优先级 1(蓝色)和优先级 2(黄色)。在这里,我应该保持从 10 到 190 的路径,因为有一条来自被忽略节点的路径。它应该看起来像这样。

在此处输入图像描述

优先级 3 和 4 也是如此。例如,对于优先级 3,我想将优先级 1、2 和 3 保持在一起,就像我在优先级 2 中展示的那样。

我就是这样开始的。

collector = nx.DiGraph()
for n1, atrr1 in g1.nodes(data ='True'):
    for n2, atrr2 in g1.nodes(data ='True'):
        if ((g1.node[n1]['priority'] ==1) & (g1.node[n2]['priority'] ==2)):

            if (has_path(g1,n1, n2)):
                collector.add_edge(n1,n2)

        if ((g1.node[n2]['priority'] ==2) & (g1.node[n1]['priority'] ==2)):

            if (has_path(g1,n1, n2)):
                collector.add_edge(n1,n2) 


nx.draw(collector, with_labels = True, pos = nx.spring_layout(collector))
plt.rcParams["figure.figsize"] = [6,6]
plt.axis('off')
plt.show()

谁能帮我在python中做到这一点?

标签: pythongraphnetworkx

解决方案


一种方法是计算图形可达性矩阵(如果节点可以通过图形边缘从节点到达,则具有1in 行a、列的方矩阵)。你可以在这里找到如何实现它。然后,您所要做的就是过滤掉您想要的节点并使用计算矩阵为过滤后的节点重新绘制边(通过仅遍历与新图中出现的节点相对应的行和列并绘制一个有 a 的边缘)。bba1


推荐阅读