如何在 Vega 中实现节点悬停高亮链接效果


如何在 vega 中实现节点悬停高亮链接效果

本文旨在指导如何在 Vega 可视化库中实现节点悬停时高亮显示相关链接的功能。通过修改 Vega 的信号和 Marks 属性,我们可以动态改变链接的样式,使其在鼠标悬停于节点上时突出显示,从而增强交互性和数据可读性。本文将提供详细的配置步骤和示例代码,帮助您快速实现这一效果。

要在 Vega 中实现节点悬停时高亮显示链接的效果,主要涉及到以下几个步骤:定义信号(Signals)来追踪鼠标悬停状态,以及修改 Marks 的编码(Encode)属性来根据悬停状态改变链接的样式。

1. 定义信号(Signals)

首先,需要在 Vega 规范中定义一个信号,用于追踪当前鼠标悬停的节点。这个信号会在鼠标悬停在节点上时更新为节点的标识符,而在鼠标移开节点时重置为 null。

{
  "name": "active",
  "value": null,
  "on": [
    {"events": "symbol:mouseover", "update": "datum.name"},
    {"events": "mouseover[!event.item]", "update": "null"}
  ]
}

这段代码定义了一个名为 active 的信号。

  • name: 信号的名称,这里是 "active"。
  • value: 信号的初始值,设置为 null。
  • on: 定义了信号更新的触发条件。
    • {"events": "symbol:mouseover", "update": "datum.name"}:当鼠标悬停在 symbol(即节点)上时,将 active 信号更新为当前节点的数据项的 name 属性。
    • {"events": "mouseover[!event.item]", "update": "null"}:当鼠标移开节点时,将 active 信号重置为 null。[!event.item] 表示鼠标移开的是当前节点。

2. 修改 Marks 编码(Encode)

接下来,需要修改链接(path)的 Marks 编码属性,使其根据 active 信号的值来改变链接的样式。

{
  "type": "path",
  "from": {"data": "link-data"},
  "interactive": false,
  "encode": {
    "update": {
      "stroke": [
        {
          "test": "datum.source.name === active || datum.target.name === active",
          "value": "firebrick"
        },
        {"value": "#ccc"}
      ],
      "strokeWidth": {"value": 0.5}
    }
  },
  "transform": [
    {
      "type": "linkpath",
      "require": {"signal": "force"},
      "shape": "line",
      "sourceX": "datum.source.x",
      "sourceY": "datum.source.y",
      "targetX": "datum.target.x",
      "targetY": "datum.target.y"
    }
  ]
}

这段代码修改了链接的 stroke 属性。

YouMind YouMind

AI内容创作和信息整理平台

YouMind 207 查看详情 YouMind
  • stroke: 定义了链接的颜色。
    • {"test": "datum.source.name === active || datum.target.name === active", "value": "firebrick"}:如果链接的源节点或目标节点的 name 属性与 active 信号的值相等(即鼠标悬停在与该链接相关的节点上),则将链接的颜色设置为 firebrick(红色)。
    • {"value": "#ccc"}:否则,将链接的颜色设置为 #ccc(浅灰色)。

3. 完整示例

下面是一个完整的 Vega 规范示例,展示了如何实现节点悬停高亮链接的效果。 该示例基于力导向图布局,并使用 miserables.json 数据集。

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "description": "A node-link diagram with force-directed layout, depicting character co-occurrence in the novel Les Misérables.",
  "width": 700,
  "height": 500,
  "padding": 0,
  "autosize": "none",
  "signals": [
    {"name": "cx", "update": "width / 2"},
    {"name": "cy", "update": "height / 2"},
    {
      "name": "nodeRadius",
      "value": 8,
      "bind": {"input": "range", "min": 1, "max": 50, "step": 1}
    },
    {
      "name": "nodeCharge",
      "value": -30,
      "bind": {"input": "range", "min": -100, "max": 10, "step": 1}
    },
    {
      "name": "linkDistance",
      "value": 30,
      "bind": {"input": "range", "min": 5, "max": 100, "step": 1}
    },
    {"name": "static", "value": true, "bind": {"input": "checkbox"}},
    {
      "description": "State variable for active node fix status.",
      "name": "fix",
      "value": false,
      "on": [
        {
          "events": "symbol:mouseout[!event.buttons], window:mouseup",
          "update": "false"
        },
        {"events": "symbol:mouseover", "update": "fix || true"},
        {
          "events": "[symbol:mousedown, window:mouseup] > window:mousemove!",
          "update": "xy()",
          "force": true
        }
      ]
    },
    {
      "description": "Graph node most recently interacted with.",
      "name": "node",
      "value": null,
      "on": [
        {"events": "symbol:mouseover", "update": "fix === true ? item() : node"}
      ]
    },
    {
      "description": "Flag to restart Force simulation upon data changes.",
      "name": "restart",
      "value": false,
      "on": [{"events": {"signal": "fix"}, "update": "fix && fix.length"}]
    },
    {
      "name": "active",
      "value": null,
      "on": [
        {"events": "symbol:mouseover", "update": "datum.name"},
        {"events": "mouseover[!event.item]", "update": "null"}
      ]
    }
  ],
  "data": [
    {
      "name": "node-data",
      "url": "data/miserables.json",
      "format": {"type": "json", "property": "nodes"}
    },
    {
      "name": "link-data",
      "url": "data/miserables.json",
      "format": {"type": "json", "property": "links"}
    }
  ],
  "scales": [
    {
      "name": "color",
      "type": "ordinal",
      "domain": {"data": "node-data", "field": "group"},
      "range": {"scheme": "category20c"}
    }
  ],
  "marks": [
    {
      "name": "nodes",
      "type": "symbol",
      "zindex": 1,
      "from": {"data": "node-data"},
      "on": [
        {
          "trigger": "fix",
          "modify": "node",
          "values": "fix === true ? {fx: node.x, fy: node.y} : {fx: fix[0], fy: fix[1]}"
        },
        {"trigger": "!fix", "modify": "node", "values": "{fx: null, fy: null}"}
      ],
      "encode": {
        "enter": {"stroke": {"value": "white"}},
        "update": {
          "fill": {
            "signal": "datum.name==active?'yellow': scale('color', datum.group)"
          },
          "size": {"signal": "2 * nodeRadius * nodeRadius"},
          "cursor": {"value": "pointer"}
        }
      },
      "transform": [
        {
          "type": "force",
          "iterations": 300,
          "restart": {"signal": "restart"},
          "static": {"signal": "static"},
          "signal": "force",
          "forces": [
            {"force": "center", "x": {"signal": "cx"}, "y": {"signal": "cy"}},
            {"force": "collide", "radius": {"signal": "nodeRadius"}},
            {"force": "nbody", "strength": {"signal": "nodeCharge"}},
            {
              "force": "link",
              "links": "link-data",
              "distance": {"signal": "linkDistance"}
            }
          ]
        }
      ]
    },
    {
      "type": "path",
      "from": {"data": "link-data"},
      "interactive": false,
      "encode": {
        "update": {
          "stroke": [
            {
              "test": "datum.source.name === active || datum.target.name === active",
              "value": "firebrick"
            },
            {"value": "#ccc"}
          ],
          "strokeWidth": {"value": 0.5}
        }
      },
      "transform": [
        {
          "type": "linkpath",
          "require": {"signal": "force"},
          "shape": "line",
          "sourceX": "datum.source.x",
          "sourceY": "datum.source.y",
          "targetX": "datum.target.x",
          "targetY": "datum.target.y"
        }
      ]
    }
  ]
}

注意事项:

  • 确保 Vega 的版本在 5.0 或以上,因为某些功能可能在旧版本中不可用。
  • 根据实际数据结构,调整 datum.source.name 和 datum.target.name 中的属性名称,以正确匹配节点标识符。
  • 可以根据需要自定义高亮显示的颜色和样式。

总结:

通过定义信号来追踪鼠标悬停状态,并修改 Marks 的编码属性,可以轻松实现在 Vega 中节点悬停高亮链接的效果。这种交互方式能够显著提升数据可视化的可读性和用户体验。

以上就是如何在 Vega 中实现节点悬停高亮链接效果的详细内容,更多请关注其它相关文章!


# git  # 廊坊关键词排名渠道  # 黄岩seo软件营销公司  # 禅城狮山网站建设  # 外贸建站 seo功能  # 泰安网站的建设  # 是一个  # 的是  # 使其  # 这段  # 如何在  # 上时  # 移开  # 数据结构  # js  # json  # node  # go  # github  # seo  # 编码  # ai  # win  # 数据可视化  # 鼠标  # 设置为  # 网站建设的任职要求  # 律师网站建设工程  # 宜春网站优化  # 上海优势网站建设制作  # 网络营销网站建设有哪些 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频  XPath动态元素定位:如何精准选择文本内容变化的元素  《雷电模拟器》截图方法介绍  AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  mysql数据库索引类型有哪些_mysql索引类型解析  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  《原神》月之一版本新增书籍一览  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  实现可重用自定义Python Range类  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  ToDesk远程摄像头功能使用方法_ToDesk远程视频画面查看设置教程  解决异步Python机器人中同步操作的阻塞问题  圆通快递官方入口不需要登录 在线查询入口快速查询  消除网页顶部意外空白线:CSS布局常见问题与解决方案  美发店速赢秘籍  《猎聘》筛选猎头岗位方法  BunnyStream TUS视频上传指南:解决401认证错误与参数配置  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  uc浏览器官网网页版使用 uc浏览器官网免费在线首页  优化长HTML属性值:SonarQube警告与实用策略  PHP安全加载非公开目录图片与动态内容类型处理指南  《腾讯相册管家》注销账号方法  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  C++ optional用法详解_C++17处理可能为空的返回值  PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略  铁路12306入口 铁路12306官网版入口登录网址  使用jQuery精确检测除指定元素外任意位置的点击事件  React应用中Commerce.js数据加载与状态管理最佳实践  Eclipse开发J*a快速入门  哈尔滨城市通昵称修改方法  快递查询,一键速查  Python中安全地将环境变量转换为整数的类型注解指南  使用VS Code作为你的个人知识管理系统  Golang如何操作指针参数_Go pointer参数传递规则  抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法  Go App Engine 项目结构与包管理深度指南  139邮箱登录入口官网 139邮箱登录入口官网网址  顺丰快递在线查询系统 顺丰快递官方查单入口  HTML与J*aScript实现下拉菜单驱动的动态表格:构建交互式维修表单  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  windows10怎么开启卓越性能_windows10电源选项代码激活  顺丰快递单号查询寄件人 顺丰寄件人查询入口  江苏大剧院会员卡购买步骤  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  B站怎么快速升级 B站用户等级提升攻略【详解】  C#解析来自网络的XML流数据 实时错误处理与重试机制  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  天堂漫画网页版在线阅读 天堂漫画手机版入口 

 2025-10-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.