使用Python networkx读取文件并绘制随机图

2 投票
1 回答
1257 浏览
提问于 2025-04-18 12:29

我正在尝试读取一个文件,这个文件里有超过10000条记录,分为3列。第一列和第二列是节点,第三列是以秒为单位的时间。我最开始想用这些数据绘制一个随机图G=(n,m),然后再把第三列的数据分配到两个相关的节点之间。之后,我还需要计算这个图中的节点数、边数和桥的数量。

我有点迷糊了,不知道是先绘制图形再进行计数,还是先计数再绘制图形。任何建议都很有帮助。

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
import scipy as sy
import itertools as it
import time

with open("File.txt") as f:
     data = f.read()
     data = data.split('\n')
node_one = [row[0] for row in data]
node_two = [row[1] for row in data]
def draw_graph(graph): 
    G = nx.Graph()
    #G.add_edges_from([(node_one[0], node_two[1]])
    #G.add_edges_from(node_one, node_two)
    G.number_of_nodes()
    G.number_of_edges() 
    G.neighbors(edge[0], edge[1])
    n = nx.number_connected_components(G)
    bridge_count = 0
    for edge in G.edges():
        if len(set(G.neighbors(edge[0])) & set(G.neighbors(edge[1]))) == 0:         
           G.remove_edge(edge[0], edge[1])          
             if nx.number_connected_components(G) > n:                  
                print edge, 'is a bridge'
                bridge_count += 1
                G.add_edge(edge[0], edge[1])
print number_of_nodes()

print number_edges()

print neighbors()

print bridge_count

我遇到的错误是:

Traceback (most recent call last): File "edge_bridge.py", line 13, in
node_one = [row[0] for row in data]

IndexError: 字符串索引超出范围

1 个回答

2
G.number_of_nodes()
G.number_of_edges()

可以帮你进行计数,这些操作可以和绘制图表分开进行。你可以按照这里的说明来给边添加属性。

你这里所说的桥的定义是什么?是指两个没有共同邻居的节点之间的边吗?如果是这样,你可以逐个检查每条边,看看这两个端点的邻居是否有共同的。如果没有共同的邻居,那就是一条桥。

如果桥的定义是指一条边被移除后会产生更多不连通的部分,正如@mdml在评论中提到的。你可以像上面提到的那样进行迭代,只需多加一步。当没有共同邻居时,从图中删除这条边,计算连通部分的数量,如果数量增加,那就是一条桥。然后记得在检查下一个边之前把这条边放回图中。下面的过程类似:

G = nx.Graph()
G.add_edges_from([(1,2), (1,3), (2,3), (2,4), (2,5), (5,6), (6,7), (5,7)])
n = nx.number_connected_components(G)
bridge_count = 0
for edge in G.edges():
    if len(set(G.neighbors(edge[0])) & set(G.neighbors(edge[1]))) == 0:
        G.remove_edge(edge[0], edge[1])
        if nx.number_connected_components(G) > n:
            print edge, 'is a bridge'
            bridge_count += 1
        G.add_edge(edge[0], edge[1])
print bridge_count

输出结果是

(2, 4) is a bridge
(2, 5) is a bridge
2

撰写回答