【问题标题】:Color nodes by networkx通过networkx着色节点
【发布时间】:2019-06-22 02:30:21
【问题描述】:

我正在通过 csv 文件中的数据生成网络拓扑图,其中 s0..s2 和 c1..c3 是图的节点。

network.csv:

来源、港口、目的地

s1,1,c3

s2,1,c1

s0,1,c2

s1,2,s2

s2,2,s0

我需要将所有源设为蓝色,将目标设为绿色。 如何在不覆盖源节点的情况下做到这一点?

【问题讨论】:

    标签: python-3.x csv networkx topology


    【解决方案1】:

    以下是一个可行的解决方案:

    import csv
    import networkx as nx
    from matplotlib import pyplot as plt
    
    with open('../resources/network.csv') as csvfile:
        reader = csv.DictReader(csvfile)
        edges = {(row['source'], row['destination']) for row in reader }
    print(edges) # {('s1', 'c3'), ('s1', 's2'), ('s0', 'c2'), ('s2', 's0'), ('s2', 'c1')}
    
    G = nx.DiGraph()
    source_nodes = set([edge[0] for edge in edges])
    G.add_edges_from(edges)
    for n in G.nodes():
        G.nodes[n]['color'] = 'b' if n in source_nodes else 'g'
    
    pos = nx.spring_layout(G)
    colors = [node[1]['color'] for node in G.nodes(data=True)]
    nx.draw_networkx(G, pos, with_labels=True, node_color=colors)
    plt.show()
    

    我们首先将 csv 读取到一个边列表中,该列表稍后用于构建 G。为了更好地定义颜色,我们将每个源节点设置为蓝色,其余节点设置为绿色(即所有也不是源节点的目标节点)。

    我们还使用nx.draw_networkx 来获得用于绘制图形的更紧凑的实现。

    结果应该是这样的:

    【讨论】:

    • 非常感谢您的帮助。但有时我会得到一个源节点为绿色(s2)。我有一个程序,每次我运行主程序(diff python 文件)时,我在 csv 中都有新的连接。所以有时当我运行这段代码时,我会得到一个绿色的源节点
    • 很高兴为您提供帮助 :) 如果没有实际的代码和数据,很难说为什么会发生这种情况。边缘 / source_nodes 可能不是您认为的那样。尝试打印它们并重现这样的场景。值得一提的是,csv部分与绘图部分完全无关,我的猜测是读取csv的问题。
    • 现在我在目的地多了一个节点,即 M0,你能告诉我如何给它一个与其他两个节点不同的颜色吗?
    • 如何从端口号的 CSV 添加边缘权重。 ?例如:S11、S21 等在它们的边缘?
    • 很抱歉,我认为如果生成一个新问题,您可能不会注意到它。
    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 2021-11-02
    • 2016-04-23
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多