Natasha
Natasha

Reputation: 1521

How to stop Networkx from changing the order of head and tail nodes(u,v) to (v,u) in an edge?

I've got a simple graph created using networkx.

import networkx as nx
import matplotlib.pyplot as plt
from pprint import pprint

G = nx.Graph()
head_nodes = range(0, 9)
tail_nodes = range(1, 10)
edge_ls = list(zip(head_nodes, tail_nodes))
G.add_nodes_from(range(0, 10))
G.add_edges_from(edge_ls)
pprint(G.nodes())
nx.draw(G)
plt.show()

I want to remove the edge between node 0 and 1 and add three new nodes (say node 10,11,12). Then, edges have to be created between node 0 and 10, 10 and 11, 11 and 2.

I'm using G.remove_edge(0,1) to remove the edge between node 0 and 1.

Could someone suggest which function can be used to add n new nodes?

Also, if n new nodes are added, will these nodes be numbered automatically?

I intend to do this in a loop, delete an edge that already exists between two nodes and add n new nodes and edges connecting these nodes.

EDIT: I tried the following to add n new edges

G = nx.Graph()
head_nodes = range(0, 9)
tail_nodes = range(1, 10)
edge_ls = list(zip(head_nodes, tail_nodes))
G.add_nodes_from(range(0, 10))
G.add_edges_from(edge_ls)

head = 0
tail = 1
G.remove_edge(head, tail)
Nnodes = G.number_of_nodes()
newnodes = [head, Nnodes+1, Nnodes+2, Nnodes+3, tail] # head and tail already exists
newedges = [(x, y) for x, y in zip(newnodes[0:len(newnodes)-1], newnodes[1:len(newnodes)])]
G.add_edges_from(newedges)
pprint(G.edges())

Output:

EdgeView([(0, 11), (1, 2), (1, 13), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13)])

Expected Output:
EdgeView([(0, 11), (1, 2), (13, 1), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13)])

I'm not sure why the edge that was added in the order (13,1)(head, tail) is stored as (1,13). Any suggestion on how to preserve the order of head and tail node while adding a new edge?

EDIT2: replacing nx.Graph() with nx.OrderedGraph() also doesn't help.

Upvotes: 0

Views: 389

Answers (1)

Alex Hall
Alex Hall

Reputation: 36013

A Graph is an undirected graph, where (1, 13) and (13, 1) mean the same thing, the edges have no 'arrows'.

What you want is a DiGraph, meaning a directed graph. See https://networkx.github.io/documentation/stable/reference/classes/index.html

An OrderedGraph is something else - it just means that when you iterate over nodes and edges, they come out in a particular order (similar to lists vs sets).

Upvotes: 2

Related Questions