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

如何为PyVis生成的可视化图谱添加节点搜索及定位放大功能

PyVis实现节点搜索定位功能的可行方案

核心原理

PyVis生成的HTML文件内置了vis.js的全局实例,你不需要修改PyVis源码,只要往生成的HTML里注入自定义的搜索UI和定位逻辑即可实现需求。

方案1:手动修改生成的HTML(快速验证)

  • 第一步:先正常生成你需要的图谱HTML,示例代码如下:
from pyvis.network import Network

net = Network(directed=True, height="1000px", width="100%")
# 此处补充你自己的加节点、加边逻辑
net.save_graph("call_chain.html")
  • 第二步:打开生成的call_chain.html,在</body>标签之前插入以下代码:
<!-- 搜索框UI -->
<div style="position: absolute; top: 20px; left: 20px; z-index: 999; background: white; padding: 10px; border-radius: 4px; box-shadow: 0 2px 6px rgba(0,0,0,0.2);">
  <input type="text" id="nodeSearch" placeholder="输入节点ID/名称搜索" style="padding: 6px; width: 200px; margin-right: 8px;">
  <button onclick="searchAndLocate()" style="padding: 6px 12px;">搜索定位</button>
</div>

<script>
function searchAndLocate() {
  const searchVal = document.getElementById('nodeSearch').value.trim();
  if (!searchVal) return;
  // 从节点数据集过滤匹配节点,可自定义匹配规则
  const matchedNodes = network.body.data.nodes.get({
    filter: node => {
      return node.id.toString().includes(searchVal) || (node.label && node.label.includes(searchVal));
    }
  });
  if (matchedNodes.length === 0) {
    alert('未找到匹配节点');
    return;
  }
  // 定位到第一个匹配节点,带过渡动画
  network.focus(matchedNodes[0].id, {
    scale: 2.5, // 缩放比例,可自行调整
    animation: {
      duration: 800, // 动画时长,单位毫秒
      easingFunction: 'easeInOutQuad'
    }
  });
  // 选中节点高亮展示
  network.selectNodes([matchedNodes[0].id]);
}
// 支持回车触发搜索
document.getElementById('nodeSearch').addEventListener('keypress', e => {
  if (e.key === 'Enter') searchAndLocate();
});
</script>
  • 第三步:保存HTML后重新打开即可使用搜索定位功能。

方案2:Python代码自动注入逻辑(适合批量生成场景)

不需要每次手动修改HTML,直接在生成阶段注入自定义代码:

from pyvis.network import Network

net = Network(directed=True, height="1000px", width="100%")
# 此处补充你自己的加节点、加边逻辑

# 生成HTML字符串
html_str = net.generate_html()

# 自定义搜索功能代码
search_code = """
<!-- 搜索框UI -->
<div style="position: absolute; top: 20px; left: 20px; z-index: 999; background: white; padding: 10px; border-radius: 4px; box-shadow: 0 2px 6px rgba(0,0,0,0.2);">
  <input type="text" id="nodeSearch" placeholder="输入节点ID/名称搜索" style="padding: 6px; width: 200px; margin-right: 8px;">
  <button onclick="searchAndLocate()" style="padding: 6px 12px;">搜索定位</button>
</div>

<script>
function searchAndLocate() {
  const searchVal = document.getElementById('nodeSearch').value.trim();
  if (!searchVal) return;
  const matchedNodes = network.body.data.nodes.get({
    filter: node => {
      return node.id.toString().includes(searchVal) || (node.label && node.label.includes(searchVal));
    }
  });
  if (matchedNodes.length === 0) {
    alert('未找到匹配节点');
    return;
  }
  network.focus(matchedNodes[0].id, {
    scale: 2.5,
    animation: {
      duration: 800,
      easingFunction: 'easeInOutQuad'
    }
  });
  network.selectNodes([matchedNodes[0].id]);
}
document.getElementById('nodeSearch').addEventListener('keypress', e => {
  if (e.key === 'Enter') searchAndLocate();
});
</script>
"""

# 注入代码到body结束标签前
html_str = html_str.replace('</body>', search_code + '</body>')

# 保存最终文件
with open("call_chain.html", "w", encoding="utf-8") as f:
    f.write(html_str)

可自定义调整项

  • 匹配规则可自行修改,需要严格全匹配就把includes改为===,需要忽略大小写就将匹配内容统一转小写后再比较
  • scale参数控制放大倍数,数值越大放大比例越高
  • duration参数控制定位动画时长,设为0可直接跳转无过渡效果
  • 搜索框的样式、位置可通过修改CSS代码自行调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:57:03