javascript - d3v4 饼图 - 在段悬停时 - 像蛋糕片一样展开段
问题描述
我正在调整这个饼图代码 - 并尝试为该段设置动画,使其在悬停时像一块蛋糕一样突出。不知道为什么鼠标悬停/离开事件的范围不起作用。我试图调整半径,但它好像没有正确获得弧形对象
var color = d3.scale.category20c();
var data = [{"label":"Category A", "value":20},
{"label":"Category B", "value":50},
{"label":"Category C", "value":30},
{"label":"Category A", "value":20},
{"label":"Category B", "value":50},
{"label":"Category C", "value":30},
{"label":"Category A", "value":20},
{"label":"Category B", "value":50},
{"label":"Category C", "value":5}];
var $this = '#chart';
d3.select($this)
.selectAll('svg')
.remove();
const width = 300,
height = 300,
radius = 120,
innerradius = 0;
var arc = d3
.arc()
.outerRadius(radius)
.innerRadius(innerradius);
data.forEach(function(d) {
d.total = +d.value;
});
var pie = d3
.pie()
.sort(null)
.value(function(d) {
return d.total;
});
var svg = d3
.select($this)
.append('svg')
.attr('width', width)
.attr('height', height)
.append('g')
.attr('class', 'piechart')
.attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');
var segments = svg.append('g').attr('class', 'segments');
var slices = segments
.selectAll('.arc')
.data(pie(data))
.enter()
.append('g')
.attr('class', 'arc');
slices
.append('path')
.attr('d', arc)
.attr('fill', function(d, i) {
return color(i);
})
.transition()
.attrTween('d', function(d) {
var i = d3.interpolate(d.startAngle+0.1, d.endAngle);
return function(t) {
d.endAngle = i(t);
return arc(d);
}
});
slices.on('mouseover', function(d) {
console.log("mouseover", radius);
console.log("this", this)
console.log("d3.select(this)", d3.select(this))
let expandArc = d3.arc()
.innerRadius(innerradius)
.outerRadius(radius * 1.2);
/*
d3
.arc()
.outerRadius(radius)
.innerRadius(innerradius)
*/
d3.select(this)
.transition()
.duration(1000)
//.ease('bounce')
.attr('d', expandArc);
});
slices.on('mouseout', function() {
console.log("mouseout");
});
解决方案
展开切片
鼠标事件实际上是与元素绑定slices
的。<g>
然后d3.select(this)
是<g>
而不是确切的path
元素。你可以看到悬停后<g>
会有属性,d
但是我们需要改变d
.path
尝试
slices.on('mouseover', function(d) {
let expandArc = d3.arc()
.innerRadius(innerradius)
.outerRadius(radius * 1.2);
d3.select(this)
.select("path")
.transition()
.duration(1000)
//.ease('bounce')
.attr('d', expandArc);
});
翻译切片
找到路径的质心并在悬停时进行平移
let offset = 4;// how much do you want to translate from the origin
slices.on('mouseover', function(d) {
d3.select(this)
.transition()
.duration(1000)
.attr('transform', 'translate(' + arc.centroid(d)[0] / offset + ',' + arc.centroid(d)[1] / offset + ')')
});
slices.on('mouseout', function() {
d3.select(this)
.transition()
.duration(1000)
.attr('transform', 'translate(0,0)')
});
推荐阅读
- php - 检查自定义帖子类型类别中是否已存在帖子名称
- javascript - 返回的主键整数在查找时递增
- python-3.x - 如何在 python folium 地图上添加点击事件
- javascript - 尝试设置窗口高度,但在 react.js 中出现错误
- powerbi - Power Bi 中的循环依赖
- php - Wordpress,从模板部分调用类方法
- mysql - mysql 如何将mysql选择结果的列转换为行
- flutter - 将上下文传递给 showdialog,以便在开始页面加载时不会丢失
- reactjs - Rendertron 呈现的 HTML 不包括作为点击事件的定义
- flutter - 如何在flutter中获取手机号码