You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pyvis网络图可视化中高亮指定路径?

在Pyvis Network中高亮最短路径的实现方法

Pyvis没有内置的路径高亮API,但可以通过修改节点和边的样式属性来实现高亮效果,核心思路是对最短路径中的节点和边单独设置视觉样式(比如颜色、大小、宽度等)。

实现步骤

1. 准备最短路径数据

假设你已经通过A*算法得到了最短路径的节点列表,格式如下:

# 示例:从Jon Snow到Tywin Lannister的最短路径节点序列
shortest_path = ["Jon Snow", "Robb Stark", "Tywin Lannister"]

2. 高亮路径中的节点

遍历Pyvis网络的节点列表,对路径内的节点设置特殊样式(比如红色背景、更大的尺寸):

# 遍历所有节点,修改路径内节点的样式
highlight_node_color = "#ff0000"
highlight_node_size = 25

for node in got_net.nodes:
    if node["id"] in shortest_path:
        node["color"] = highlight_node_color
        node["size"] = highlight_node_size
    # 非路径节点可以设置默认样式(可选)
    else:
        node["color"] = "#97c2fc"
        node["size"] = 15

3. 高亮路径中的边

首先将路径节点转换为相邻节点对(比如(Node1, Node2)、(Node2, Node3)),然后遍历边列表修改对应边的样式:

# 生成路径对应的边对(注意顺序,Pyvis的边可能是双向的,需要兼容两种顺序)
path_edges = set()
for i in range(len(shortest_path)-1):
    src = shortest_path[i]
    dst = shortest_path[i+1]
    path_edges.add((src, dst))
    path_edges.add((dst, src))  # 处理无向图的情况

# 遍历所有边,修改路径内边的样式
highlight_edge_color = "#ff0000"
highlight_edge_width = 5

for edge in got_net.edges:
    edge_pair = (edge["from"], edge["to"])
    if edge_pair in path_edges:
        edge["color"] = highlight_edge_color
        edge["width"] = highlight_edge_width
    # 非路径边设置默认样式(可选)
    else:
        edge["color"] = "#4a7abc"
        edge["width"] = 1

完整修改后的示例代码

结合你提供的《权力的游戏》代码,整合高亮逻辑后的完整代码如下:

from pyvis.network import Network
import pandas as pd

got_net = Network(height='750px', width='100%', bgcolor='#222222', font_color='white')

# set the physics layout of the network
got_net.barnes_hut()
got_data = pd.read_csv('https://www.macalester.edu/~abeverid/data/stormofswords.csv')

sources = got_data['Source']
targets = got_data['Target']
weights = got_data['Weight']

edge_data = zip(sources, targets, weights)

for e in edge_data:
    src = e[0]
    dst = e[1]
    w = e[2]

    got_net.add_node(src, src, title=src)
    got_net.add_node(dst, dst, title=dst)
    got_net.add_edge(src, dst, value=w)

neighbor_map = got_net.get_adj_list()

# add neighbor data to node hover data
for node in got_net.nodes:
    node['title'] += ' Neighbors:<br>' + '<br>'.join(neighbor_map[node['id']])
    node['value'] = len(neighbor_map[node['id']])

# ------------------- 路径高亮逻辑开始 -------------------
# 假设已通过A*算法得到的最短路径
shortest_path = ["Jon Snow", "Robb Stark", "Tywin Lannister"]

# 高亮节点
highlight_node_color = "#ff0000"
highlight_node_size = 25
for node in got_net.nodes:
    if node["id"] in shortest_path:
        node["color"] = highlight_node_color
        node["size"] = highlight_node_size
    else:
        node["color"] = "#97c2fc"
        node["size"] = 15

# 高亮边
path_edges = set()
for i in range(len(shortest_path)-1):
    src = shortest_path[i]
    dst = shortest_path[i+1]
    path_edges.add((src, dst))
    path_edges.add((dst, src))

highlight_edge_color = "#ff0000"
highlight_edge_width = 5
for edge in got_net.edges:
    edge_pair = (edge["from"], edge["to"])
    if edge_pair in path_edges:
        edge["color"] = highlight_edge_color
        edge["width"] = highlight_edge_width
    else:
        edge["color"] = "#4a7abc"
        edge["width"] = 1
# ------------------- 路径高亮逻辑结束 -------------------

got_net.show('gameofthrones.html')

额外优化建议

  • 如果是有向图,不需要添加反向的边对(即去掉path_edges.add((dst, src)))
  • 可以自定义更多样式属性,比如节点的borderWidth、边的dash(虚线样式)来区分路径
  • 对于大型网络,建议先过滤非路径节点/边的样式,减少视觉干扰

内容的提问来源于stack exchange,提问作者Abhishek Jha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:27:29