Search code examples
graphnetworkxgraph-layout

How to get the length of lines representing edges in the plot of graph after layout out using networkx


For a graph in networkx, I have made a layout to draw a network graph using code below:

data = pd.read_csv('data\\email-dept3.csv')
edges = [edge for edge in zip(data['source'],data['target'])]
print(len(edges))
G = nx.Graph()
G.add_edges_from(edges)

node_pos = nx.kamada_kawai_layout(G)

#I want to get the edge length as one attributes, but I don't know how to code this function
edge_length = calculate_edge_length()

nx.draw_networkx_nodes(G,node_pos,**options)#draw nodes
[nx.draw_networkx_edges(G,node_pos,edgelist=[key],alpha=np.amin([1,value*100]),width=2) for key,value in cent.items()] 

plt.show()

And the result is:

the shown network graph

What I want to do is get the every edge's length in this graph. Because after layout, every node has a position in screen, and the edge has its length according to its two nodes' position. But in networkx's API, I can't find the method to get the edge's length. And I also don't know how to calculate this value.

If you need more information, please contact me.


Solution

  • I am trying all kinds of methods to adjust the transparency of edges. The length of line is one of my consideration.

    Interesting idea! Seems like a worthwhile experiment; I'll let you decide if it works well or not. :-)

    But in networkx's API, I can't find the method to get the edge's length

    I think you have to compute them yourself. Fortunately, that's not too hard. Here's an example.

    import numpy as np
    import pandas as pd
    import networkx as nx
    import matplotlib.pyplot as plt
    plt.rcParams["figure.figsize"] = (10,10)
    
    def example_graph():
        """
        Return the classic Karate Club network, but give text labels to the nodes.
        """
        labels = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJZKLMNOPQRSTUVWXYZ'
        kg = nx.karate_club_graph()
        edges = [(labels[i], labels[j]) for i,j in kg.edges()]
        G = nx.Graph()
        G.add_edges_from(edges)
        return G
    
    # Test network
    G = example_graph()
    
    # Determine layout node positions
    node_pos = nx.kamada_kawai_layout(G)
    
    # Determine edge distances (from the node positions)
    node_pos_df = pd.DataFrame(node_pos.values(), columns=['x', 'y'], index=node_pos.keys())
    node_pos_df = node_pos_df.rename_axis('label').sort_index()
    edges = np.array(G.edges())
    u_pos = node_pos_df.loc[edges[:, 0]].values
    v_pos = node_pos_df.loc[edges[:, 1]].values
    distances = np.linalg.norm(u_pos - v_pos, axis=1)
    
    ## Optional: Add the distances as edge attributes
    #edge_distances = {(u,v): d for (u,v), d in zip(G.edges(), distances)}
    #nx.set_edge_attributes(G, edge_distances, "layout_distance")
    
    # Compute alpha: Set 0.15 as minimum alpha, 1.0 as maximum alpha
    d_min, d_max = distances.min(), distances.max()
    alphas = 1.0 - 0.85 * (distances - d_min) / (d_max - d_min)
    
    # Draw graph
    nx.draw_networkx_nodes(G, node_pos)
    nx.draw_networkx_edges(G, node_pos, edgelist=G.edges(), alpha=alphas, width=2)
    
    plt.show()
    

    enter image description here