为 NetworkX 中的每条路径分配颜色

Assign a color to each path in NetworkX

我有汽车、城市和路线。 每个城市都是一个节点。 每条路线都是汽车生成的路径。

不同的车会有不同的路径,有时路径会相交(这意味着不同的车在它们的路径中找到了同一个城市),有时不会。

我会用所有城市和所有不同路径绘制一个图表,并用 plotly 绘制图表。 示例:

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 实现。

绘图的解决方案只是将列表传递给 plotly 但这样做我什至不会使用 NetworkX,接下来的步骤是分析图表。

您可以在 NetworkX 中设置节点和边属性,然后您可以使用这些属性来自定义图的某些方面。在这种情况下,您可以为图形的边缘设置颜色属性,并使用此属性设置 nx.draw 中的 edge_color。以下是如何使用您共享的示例路径执行此操作:

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)