【问题标题】:Building terms relations within a network在网络中建立术语关系
【发布时间】:2020-09-08 05:46:48
【问题描述】:

我试图表示 A 列中的数字与其 B 中的对应值之间的关系。

A            B
Home     [Kitchen, Home, Towel]
Donald   [US, 02 , Donald, Trump]
Trump    [Trump,Family, Cat, Dog]
Dog      [Dog,Cat,Paws]

A 列中的数字和 B 中的数字是图中的节点。我想将 B 中的元素连接到 A 或相互连接。例如:

  • A 中的家与自身相连;如果我在 B 列中查看(该值仅出现在第一行),B 中的 Home 连接到 Kitchen and Towel(传入链接);
  • Donald 与自身相连,因为 Donald 仅在 B 中;但是,B 中的 Donald 也与 US、02 和 Trump 相关(传入链接);
  • 特朗普与唐纳德有一个传出链接和传入链接(家庭、猫和狗);
  • Dog 与 Trump 有一个传出链接和传入链接(Cat 和 Paws)。

那么规则应该如下:

  • 如果A中的单词在B中的另一行,则创建外链;
  • 如果 A 中的单词也包含在 B 中,则为 B 中的每个单词创建指向 A 中单词的传入链接。

我应该如何调整我的代码?

file = file.assign(B=file.B.map(list)).explode('B')


G = nx.DiGraph()
nx.add_path(G, file['A'])
nx.add_path(G, file['B'])

nx.draw_networkx(G)
plt.show()

【问题讨论】:

    标签: python graph networkx


    【解决方案1】:

    将您的表格转换为熊猫dataframe,然后循环遍历其行,您可以像这样添加相应的边:

    import networkx as nx
    import pandas as pd
    from pyvis.network import Network
    
    
    df = pd.DataFrame(
        [
            ['Home', ['Kitchen', 'Home', 'Towel']],
            ['Donald', ['US', '02' , 'Donald', 'Trump']],
            ['Trump', ['Trump','Family', 'Cat', 'Dog']],
            ['Dog', ['Dog', 'Cat' , 'Paws']]
        ],
        columns=['A', 'B']
    )
    
    G = nx.DiGraph()
    
    for i, j in enumerate(df['A']):
        for index, row in df.iterrows():
            if i != index:
                if j in row['B']:
                    G.add_edge(row['A'], j)
            else:
                for n in row['B']:
                    if j != n:
                        G.add_edge(j, n)
    
        if G.in_degree(j) == 0:
            G.add_edge(j , j)
    
    N = Network(directed=True)  # using pyvis to show self loops as well
    
    for n, attrs in G.nodes.data():
        N.add_node(n)
    
    for e in G.edges.data():
        N.add_edge(e[0], e[1])
    
    N.write_html('graph.html')
    

    这给了我以下图表:

    希望这是你想要的!

    【讨论】:

    • 嗨,Azim,是的,这就是我想要的。非常感谢你的帮助。愚蠢的简单问题:如何可视化图表?
    • 嗨@Math,这根本不是一个愚蠢的问题,很多人都有这个问题,尤其是大图。我通常更喜欢使用 [pyvis] [1],因为它具有交互性并且在视觉上也更令人愉悦。它还具有 [Networkx 集成] (pyvis.readthedocs.io/en/latest/…),这使事情变得更容易。在上面的答案中,可视化是用graph.html 编写的。 [1]:pyvis.readthedocs.io/en/latest
    • 感谢您的回答@Azim。在您分享的最后一个链接之后,我尝试使用G.show('graph.html'),但出现此错误:AttributeError: 'DiGraph' object has no attribute 'show'。我想我仍然缺少一些东西来直观地重现您创建的图表。我希望你能帮助我
    • 当然。您收到此错误是因为networkx.DiGraph 类没有名为show() 的方法。将DiGraph 中的节点和边添加到您创建的pyvis.network.Network 对象后,您需要使用其write_html() 方法将图形保存在您想要的位置,然后使用浏览器打开它例如@987654335 @ 是您的Network 对象,您可以使用N.write_html('path/to/your_graph.html')N.show('path/to/your_graph.html') 保存您的图表。
    • 添加节点或边时,如果设置physics参数False,可以使图形静态化。例如G.add_edge(i , j, physics=False).
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多