Назначьте цвет каждому пути в NetworkX - PullRequest
1 голос
/ 04 мая 2020

У меня есть машины, города и маршруты. Каждый город - это узел. Каждый маршрут - это путь, генерируемый автомобилем.

Разные автомобили будут иметь разные пути, иногда пути могут пересекаться (что означает, что разные автомобили нашли один и тот же город на своем пути), иногда нет.

Я бы представил график со всеми городами и разными путями и построил график с помощью графика. Пример:

List of cities: CityA -CityB -CityD -CityZ -CityK
List of cars: Car1, Car2

Routes:
Car1 will have a path through   cityA - cityB - cityD  this path will be colored in red
Car2 will have a path though    cityZ - cityA - cityK  this path will be colored in blue

Использование networkx.classes.function.add_path Я не могу этого добиться, потому что не буду сохранять информацию о разных автомобилях, будет только список подключенных узел:

As in the previous example add_path, G.edges(): [(CityA-CityB),(CityB-CityD),(CityZ-CityA),(CityA-CityK)]

Я не уверен, что то, что я ищу, может быть достигнуто с помощью networkx.

Решением для заговора является просто передача списка в заговор, но делать это я не буду даже использовать NetworkX и следующие шаги, чтобы проанализировать график.

1 Ответ

0 голосов
/ 04 мая 2020

Вы можете установить атрибуты узла и края в NetworkX, которые затем можно использовать, например, для настройки определенных аспектов графика. В этом случае вы можете установить цветовой атрибут по краям графика и использовать этот атрибут для установки edge_color в nx.draw. Вот как вы могли бы сделать это с примерами путей, которыми вы поделились:

import networkx as nx
from matplotlib import pyplot as plt

path_car1 = ['cityA','cityB','cityD']
path_car2 = ['cityZ','cityA','cityK']

paths = [path_car1, path_car2]
colors = ['Red','Blue']

Теперь создайте ориентированный граф, итерируйте по спискам путей и назначенным цветам, чтобы добавить их как ребра, соответствующие атрибуты :

G = nx.DiGraph()
for path, color in zip(paths, colors):
    for edge in zip(path[:-1], path[1:]):
        G.add_edge(*edge, color=color)

Вы можете получить значения данного атрибута для всех ребер с помощью:

edge_colors = nx.get_edge_attributes(G, 'color')

Теперь при построении графика вы можете установить цвета ребер с помощью аргумента edge_color:

plt.figure(figsize=(10,7))
pos = nx.spring_layout(G, scale=20)
nx.draw(G, pos, 
        node_color='black',
        with_labels=True, 
        node_size=1200,
        edgelist=G.edges(),
        edge_color=edge_colors.values(),
        arrowsize=15,
        font_color='white',
        width=3,
        alpha=0.9)

enter image description here

...