NetworkX - Tokyo metro

Robert Johansson, Matematyczny Python. Obliczenia naukowe i analiza danych z użyciem NumPy, SciPy i Matplotlib, Helion 2021. [Tokyo metro example]

INTRODUCTION


import json
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

# Importing data.
with open("tokyo-metro.json") as infile:
    D = json.load(infile)

print(list(D))   # metro lines (keys)
# ['C', 'G', 'F', 'H', 'M', 'N', 'T', 'Y', 'Z']

print(D['C'])   # line info (values are dicts)
# {'color': '#149848', 
# 'transfers': [['C3', 'F15'], ['C4', 'Z2'], ...], 
# 'travel_times': [['C1', 'C2', 2], ['C2', 'C3', 2], ...]}

# Creating the metro graph.
G = nx.Graph()
for line in D.values():
    G.add_weighted_edges_from(line["travel_times"])
    G.add_edges_from(line["transfers"])

# Edges for transfers do not have weights.
# We add the additional attribute (bool) for all edges.
for (node1, node2) in G.edges():
    G[node1][node2]['transfer'] = ("weight" not in G[node1][node2])

# We add 5 minutes for transfer.
for (node1, node2) in G.edges():
    if G[node1][node2]['transfer']:
        G[node1][node2]['weight'] = 5

# Colors for all nodes from the same metro line.
# node[0] gives the metro line.
colors = [D[node[0]]["color"] for node in G.nodes()]   # a list

nx.draw(G, with_labels=True, node_color=colors)
plt.show()

deg_max = max(deg for (node, deg) in G.degree())   # 6

deg_max_list = [node for (node, deg) in G.degree() if deg == deg_max]
# ['G5', 'M13', 'Y16', 'Z4', 'N7']

path = nx.shortest_path(G, "Y24", "C19")
# ['Y24', 'Y23', 'Y22', 'Y21', 'Y20', 'Y19', 'Y18', 'C9', 'C10',
# 'C11', 'C12', 'C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C19']

path_time = sum(G[path[n]][path[n+1]]['weight'] for n in range(len(path)-1)) # 40 min