happy
happy

Reputation: 67

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.

Upvotes: 1

Views: 408

Answers (1)

Stuart Berg
Stuart Berg

Reputation: 18162

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

Upvotes: 1

Related Questions