为 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)
我有汽车、城市和路线。 每个城市都是一个节点。 每条路线都是汽车生成的路径。
不同的车会有不同的路径,有时路径会相交(这意味着不同的车在它们的路径中找到了同一个城市),有时不会。
我会用所有城市和所有不同路径绘制一个图表,并用 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)