【问题标题】:Generate Network plot from dataframe从数据框生成网络图
【发布时间】:2020-11-24 05:33:42
【问题描述】:

假设我有这个数据框,其中列a-number 表示具有指向b-number 中节点的边的节点:

    a_number    b_number
0   343              991
1   991              633
2   343              633
3   633              628
4   343              633
5   628              916
6   697              886
7   916              572
8   697              884
9   886              125

如何生成此图的图像表示,如下所示:

【问题讨论】:

    标签: python graph networkx graphviz


    【解决方案1】:

    Networkx 是 Python 中图形的首选库: https://networkx.org/documentation/stable/index.html

    首先进行导入:

    import networkx as nx
    

    要开始这样的图,请声明一个初始化有向图(有向图):

    G = nx.DiGraph()
    

    然后添加一些节点:

    G.add_node(343)
    G.add_node(991)
    G.add_node(633)
    

    然后是一些边:

    G.add_edge(343,991)
    G.add_edge(991,633)
    G.add_edge(343,633)
    

    最后绘制图形G:

    nx.draw(G, with_labels = True, font_size=14 , node_size=2000)
    

    使用 with_labels = True 这样你就可以拥有节点号,node_size=2000 使节点更大,font_size=14 使字体也更大

    这是代码的输出:

    现在要从数据帧中读取,只需执行如下循环:

    for  i, (x, y) in df.iterrows():
        G.add_node(x)
        G.add_node(y)
        G.add_edge(x,y)
    

    如果节点或边已经存在,则不会添加新的,因此您无需担心

    【讨论】:

    • 如何自动读取输入数据框?
    【解决方案2】:

    您也可以使用graphviz 库:

    from graphviz import Digraph
    dot = Digraph()
    
    for i, (a, b) in df.iterrows():
        dot.edge(str(a), str(b))
        
    dot.render('graph.gv', view=True)
    

    【讨论】:

    • 可以添加图片吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2017-02-04
    相关资源
    最近更新 更多