0

0

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

碧海醫心

碧海醫心

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

|

432人浏览过

|

来源于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):

Outwrite
Outwrite

AI写作浏览器插件,将您的想法变成有力的句子

下载
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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
append用法
append用法

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

344

2023.10.25

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

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

1074

2023.11.14

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

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

176

2025.09.12

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

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

415

2023.08.08

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

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

510

2024.05.29

undefined是什么
undefined是什么

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

5401

2023.07.31

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

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

3101

2024.08.14

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

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

701

2025.12.25

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 54.6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号