Chapter 15 — Lab 8
下拉筛选 · 悬停提示 · 动态更新
掌握下拉框(select)筛选的 D3 实现模式
学会实现鼠标悬停(hover)交互效果
理解 d3.interval() 的使用场景与用法
能够实现数据驱动的多视图联动更新
交互让可视化从静态展示变成数据探索工具。本阶段你将为项目添加筛选、悬停提示、动画等交互功能,让用户能够自主探索数据背后的信息。
HTML select 配合 D3 数据更新实现筛选:
<select id='category-select'>
<option value='all'>全部</option>
<option value='A'>类别 A</option>
</select>
<div id='chart'></div>
d3.select('#category-select').on('change', function() {
currentCategory = this.value;
updateChart();
});
function updateChart() {
const filtered = (currentCategory === 'all')
? data
: data.filter(d => d.category === currentCategory);
svg.selectAll('circle')
.data(filtered)
.join('circle')
.transition().duration(300)...
}
Tooltip 是最重要的交互形式之一:
const tooltip = d3.select('body').append('div')
.style('position', 'absolute')
.style('background', 'rgba(30,30,30,0.9)')
.style('color', '#fff')
.style('padding', '10px 14px')
.style('border-radius', '6px')
.style('font-size', '13px')
.style('pointer-events', 'none')
.style('opacity', 0).style('z-index', 1000);
circles
.on('mouseover', (event, d) => {
tooltip.style('opacity', 1)
.html(`<strong>${d.name}</strong><br>${d.value}`)
.style('left', (event.pageX + 15) + 'px')
.style('top', (event.pageY - 10) + 'px');
})
.on('mousemove', (event) => {
tooltip
.style('left', (event.pageX + 15) + 'px')
.style('top', (event.pageY - 10) + 'px');
})
.on('mouseout', () => {
tooltip.transition().duration(200).style('opacity', 0);
});
d3.interval() 用于定时任务(如地图旋转、实时数据刷新):
// 地图持续旋转(~15 FPS)
let rotation = 0;
d3.interval(() => {
rotation += 0.3;
projection.rotate([rotation, 0]);
svg.selectAll('path').attr('d', geoPath);
}, 66);
// 暂停/恢复
const timer = d3.interval(() => { ... }, 66);
timer.stop();
timer.restart(callback, 66);
// 启动时只执行一次用 d3.timeout
d3.timeout(() => {
renderChart();
}, 100);
注意:动画放在最后阶段再加,优先确保交互基本功能正常。
交互设计的优先级:hover tooltip > click 筛选 > 键盘/手势 > 动画。先实现 tooltip 和下拉框,d3.interval 旋转/动画放最后。
实验报告(Word 填写): ① 交互功能清单(列出已实现的功能) ② 核心交互代码截图 ③ 交互效果截图 ④ 已知问题及改进计划