【问题标题】:How to draw subgraph using networkx如何使用networkx绘制子图
【发布时间】:2015-04-24 04:31:46
【问题描述】:

我尝试根据节点名称列表从 networkx 中的 karate_club_graph 绘制子图,但失败了。怎么能画出我想展示的子图?

import networkx as nx
from matplotlib import pylab as pl

G = nx.karate_club_graph()
res = [0,1,2,3,4,5]
new_nodes = []
for n in G.nodes(data=True):
  if n[0] in res:
    new_nodes.append(n)

k = G.subgraph(new_nodes)
pos = nx.spring_layout(k)

pl.figure()
nx.draw(k, pos=pos)
pl.show()

【问题讨论】:

    标签: python networkx


    【解决方案1】:

    您遇到的问题是您的 subgraph 命令告诉它创建一个带有节点列表的子图,其中每个元素不仅是节点名称,而且是有关该节点名称的数据。命令G.subgraph 只需要节点名称列表。

    解决这个问题的最简单方法就是

    k = G.subgraph(res)
    

    即使res 中的某些节点不在G 中,它也会起作用。

    我将进行此更改,并通过在绘图中添加额外的子图来展示如何以一致的位置多次绘制。它将绘制您的k,然后绘制由不在k 中的所有节点组成的子图。请注意,由于subgraph 的工作方式,两者之间不会存在任何边缘。

    import networkx as nx
    from matplotlib import pylab as pl
    
    G = nx.karate_club_graph()
    res = [0,1,2,3,4,5, 'parrot'] #I've added 'parrot', a node that's not in G
                                  #just to demonstrate that G.subgraph is okay
                                  #with nodes not in G.    
    pos = nx.spring_layout(G)  #setting the positions with respect to G, not k.
    k = G.subgraph(res)  
    
    pl.figure()
    nx.draw_networkx(k, pos=pos)
    
    othersubgraph = G.subgraph(range(6,G.order()))
    nx.draw_networkx(othersubgraph, pos=pos, node_color = 'b')
    pl.show()
    

    G.nodes()调用中有data=True的效果如下:

    print G.nodes()
    > [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]
    print G.nodes(data=True)
    > [(0, {'club': 'Mr. Hi'}), (1, {'club': 'Mr. Hi'}), (2, {'club': 'Mr. Hi'}), (3, {'club': 'Mr. Hi'}), (4, {'club': 'Mr. Hi'}), (5, {'club': 'Mr. Hi'}), (6, {'club': 'Mr. Hi'}), (7, {'club': 'Mr. Hi'}) ...  *I've snipped stuff out*
    

    所以G.nodes() 只是给出节点名称。 G.nodes(data=True) 给出了一个元组列表,其中第一个条目是节点名称,第二个条目中显示了关于这些节点的任何数据。

    【讨论】:

    • 你能告诉我什么时候以及为什么设置 data=true 是什么意思吗?
    • 我已经编辑了答案来解释它。基本上拥有data=True 意味着它还提供了图形存储的有关节点的任何数据。
    • 我还有一个问题:实际上我想知道子图显示了从原始图中选择的节点,而它们的位置与原始图相比保持不变;但是通过上面的这种方式,我观察到子图的形状和位置已经改变。你有什么想法来实现这样的效果吗?
    • pos=nx.spring_layout(G)。然后pos 是一个字典,这样pos[u] 给出了节点ux,y 坐标。那么当你画k时,使用这个位置dict。
    • 最后 - 我刚刚检查了 G.subgraph(res) 是否有效,即使 res 中的某些节点不在 G 中。
    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多