Bipartite graph in NetworkX

前端 未结 3 1599
攒了一身酷
攒了一身酷 2020-12-01 15:02
B.add_nodes_from(a, bipartite=1)
B.add_nodes_from(b, bipartite=0)
nx.draw(B, with_labels = True)  
plt.savefig(\"graph.png\")

I am getting the foll

相关标签:
3条回答
  • 2020-12-01 15:12

    NetworkX already has a function to do exactly this.

    Its called networkx.drawing.layout.bipartite_layout

    You use it to generate the dictionary that is fed to the drawing functions like nx.draw via the pos argument like so:

    nx.draw_networkx(
        B,
        pos = nx.drawing.layout.bipartite_layout(B, B_first_partition_nodes), 
        width = edge_widths*5) # Or whatever other display options you like
    

    Where B is the full bipartite graph (represented as a regular networkx graph), and B_first_partition_nodes are the nodes you wish to place in the first partition.

    This generates a dictionary of numeric positions that is passed to the pos argument of the drawing function. You can specify layout options as well, see the main page.

    Obligatory example output:

    0 讨论(0)
  • 2020-12-01 15:18

    You could do something like this, to draw nodes from each partition at a particular x coordinate:

    X, Y = bipartite.sets(B)
    pos = dict()
    pos.update( (n, (1, i)) for i, n in enumerate(X) ) # put nodes from X at x=1
    pos.update( (n, (2, i)) for i, n in enumerate(Y) ) # put nodes from Y at x=2
    nx.draw(B, pos=pos)
    plt.show()
    

    bipartite-graph

    The key is creating the dict for the the nx.draw pos parameter, which is:

    A dictionary with nodes as keys and positions as values.

    See the docs.

    0 讨论(0)
  • 2020-12-01 15:34

    Another example, combining graph with bipartite graph:

    G = nx.read_edgelist('file.txt', delimiter="\t")
    aux = G.edges(data=True)
    B = nx.Graph()
    B.add_nodes_from(list(employees), bipartite=0)
    B.add_nodes_from(list(movies), bipartite=1)
    B.add_edges_from(aux)
    
    %matplotlib notebook
    import [matplotlib][1].pyplot as plt
    plt.figure()
    
    edges = B.edges()
    print(edges)
    X, Y = bipartite.sets(B)
    pos = dict()
    pos.update( (n, (1, i)) for i, n in enumerate(X) ) # put nodes from X at x=1
    pos.update( (n, (2, i)) for i, n in enumerate(Y) ) # put nodes from Y at x=2
    nx.draw_networkx(B, pos=pos, edges=edges)
    plt.show()
    
    0 讨论(0)
提交回复
热议问题