讲师中心 微信公众号
AI工具推荐 视频效率加速

D3 Donut Chart 数据绑定与 Tooltip 正确实现指南

风磊大大_6162

风磊大大_6162

发布时间:2026-02-01 11:49:10

|

492人浏览过

|

来源于php中文网

原创

D3 Donut Chart 数据绑定与 Tooltip 正确实现指南

本文详解如何在 d3 v3 中为环形图(donut chart)正确绑定数据,解决 `d.data` 为 `undefined` 的常见问题,并实现可靠的 tooltip 交互逻辑。

在使用 D3 v3 构建环形图时,一个高频陷阱是事件回调中无法访问原始数据——例如 onMouseEnter(d) => console.log(d.data) 输出 undefined。根本原因在于:事件监听器被绑定在父容器(如 )上,而非实际承载数据的 元素。D3 的 .data() 绑定作用于选中的 DOM 节点集合,而 gElement.on("mouseenter", ...) 中的 d 指向的是 的绑定数据(此处为空),并非 的饼图扇形数据。

✅ 正确做法是:将事件监听器直接绑定到已绑定数据的 元素上。这需要在调用 .data().enter().append("path") 后,保存该选择集(selection)并复用它,而非重复调用 gElement.selectAll("path")(后者返回的是无数据的新选择集)。

以下为修复后的核心逻辑(基于 D3 v3.5.17):

应用程序在线商店宣传网站模板
应用程序在线商店宣传网站模板

应用程序在线商店宣传网站模板是一款提供免费应用程序在线商店宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。

下载
function updateChart(data) {
  // 生成饼图布局数据
  const pieData = d3.layout.pie()
    .startAngle(-(Math.PI / 2) * 5)
    .value(d => d[1])
    .sort(null)
    .padAngle(padAngle)(data);

  // 更新已有路径:过渡动画
  gElement.selectAll("path")
    .transition()
    .duration(transitionDuration)
    .attrTween("d", arcTween);

  // 关键:获取并保存新创建的 path 选择集
  const paths = gElement.selectAll("path")
    .data(pieData)
    .enter()
    .append("path");

  // 对 paths 集合统一设置属性和事件
  paths
    .attr("class", "donut_chart")
    .attr("fill", d => color(d.data[0])) // ✅ d.data 现在有效!
    .attr("d", chartArc)
    .each(function(d) { this._current = d; })
    .on("mouseenter", onMouseEnter) // ✅ 事件绑定到 path,d 即饼图扇形数据
    .on("mouseleave", onMouseLeave);
}

function onMouseEnter(d) {
  console.log("Data:", d.data);        // → ["high", 3], ["middle", 4], etc.
  console.log("Value:", d.value);      // → 3, 4, 2
  console.log("Index:", d.index);      // → 0, 1, 2
}

⚠️ 注意事项:

  • 避免滥用 event.explicitOriginalTarget.__data__:虽然可临时取数,但属非标准、不可靠且破坏封装的 hack 方式,生产环境严禁使用。
  • .each() 中的 this._current = d 是平滑过渡的关键:它为每个 缓存当前数据状态,供 arcTween 函数插值使用。
  • d.data 结构说明:d3.layout.pie() 输出的每个 d 对象包含 data(原始输入项,如 ["high", 3])、value(数值)、startAngle/endAngle 等字段,d.data[0] 即类别名,d.data[1] 即对应值。
  • D3 版本适配:本文示例基于 D3 v3;若升级至 D4+,需改用 d3.pie()、d3.arc() 及 selection.join(),API 差异较大,不可直接迁移。

通过将事件监听器精准绑定到数据驱动的 元素,并确保 data() 调用与事件注册处于同一选择集上下文,即可彻底解决 d.data 丢失问题,为 tooltip、高亮、动态标签等交互功能奠定坚实基础。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
append用法
append用法

append是一个常用的命令行工具,用于将一个文件的内容追加到另一个文件的末尾。想了解更多append用法相关内容,可以阅读本专题下面的文章。

598

2023.10.25

python中append的用法
python中append的用法

在Python中,append()是列表对象的一个方法,用于向列表末尾添加一个元素。想了解更多append的更多内容,可以阅读本专题下面的文章。

1476

2023.11.14

python中append的含义
python中append的含义

本专题整合了python中append的相关内容,阅读专题下面的文章了解更多详细内容。

2704

2025.09.12

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

876

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

6463

2024.05.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

12045

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

5527

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2516

2025.12.25

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn