Search code examples
pythonmatplotlibgraphnetworkx

how to plot a networkx graph using the (x,y) coordinates of the points list?


I have points as x,y and I want to plot my graph using the (x,y) coordinates of my points list so that I can see the axis. here are my code and photo of the graph

import networkx as nx
import matplotlib.pyplot as plt
def add_edge_to_graph(G,e1,e2,w):
   G.add_edge(e1,e2,weight=w) 

G=nx.Graph()
points=[(1, 10), (8, 10), (10, 8), (7, 4), (3, 1)] #(x,y) points
edges=[(0, 1, 10), (1, 2, 5), (2, 3, 25), (0, 3, 3), (3, 4, 8)]#(v1,v2, weight)

for i in range(len(edges)):
       add_edge_to_graph(G,points[edges[i][0]],points[edges[i][1]],edges[i][2])
       
     
pos = nx.spring_layout(G)
nx.draw(G,pos=pos,node_color='k')
nx.draw(G, pos=pos, node_size=1500)  # draw nodes and edges
nx.draw_networkx_labels(G, pos=pos)  # draw node labels/names
# draw edge weights
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
plt.axis()
plt.show() 

https://i.sstatic.net/criYx.png


Solution

  • This should solve your problem:

    import networkx as nx
    import matplotlib.pyplot as plt
    
    
    def add_edge_to_graph(G, e1, e2, w):
        G.add_edge(e1, e2, weight=w)
    
    
    G = nx.Graph()
    points = [(1, 10), (8, 10), (10, 8), (7, 4), (3, 1)]  # (x,y) points
    edges = [(0, 1, 10), (1, 2, 5), (2, 3, 25), (0, 3, 3), (3, 4, 8)]  # (v1,v2, weight)
    
    for i in range(len(edges)):
        add_edge_to_graph(G, points[edges[i][0]], points[edges[i][1]], edges[i][2])
    
    # you want your own layout
    # pos = nx.spring_layout(G)
    pos = {point: point for point in points}
    
    # add axis
    fig, ax = plt.subplots()
    nx.draw(G, pos=pos, node_color='k', ax=ax)
    nx.draw(G, pos=pos, node_size=1500, ax=ax)  # draw nodes and edges
    nx.draw_networkx_labels(G, pos=pos)  # draw node labels/names
    # draw edge weights
    labels = nx.get_edge_attributes(G, 'weight')
    nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, ax=ax)
    plt.axis("on")
    ax.set_xlim(0, 11)
    ax.set_ylim(0,11)
    ax.tick_params(left=True, bottom=True, labelleft=True, labelbottom=True)
    plt.show()
    

    Result

    Figure with axes on and right positions

    Backround

    For the axis, I used plt.axis("on") as already suggested above together with How to make x and y axes appear when using networkx and matplotlib?

    Additionaly, I replaced the spring_layout with the positions in your points list.