d3.js - 带有交互式图例悬停问题的饼图
d3.js - Pie chart with interactive legend hover problems
我用人口数据 popu 制作了 d3.js 饼图和相关图例。当我将鼠标悬停在饼图上时,我实现了放大相关图例方形部分和饼图本身(更大的外半径)。现在我正试图做相反的事情。当我将鼠标悬停在图例正方形上时,我想放大正方形本身和相关的饼图部分。就像这里的这个例子 https://www.amcharts.com/demos/pie-chart-with-legend/。我将只写下与饼图问题相关的部分代码。
var pie = d3.pie()
.value(function(d) {return d.pop})(popu);
var seg = d3.arc()
.innerRadius(100)
.outerRadius(150)
.padAngle(.1)
.padRadius(45);
var segover = d3.arc()
.innerRadius(100)
.outerRadius(170)
.padAngle(.1)
.padRadius(45);
所以这部分工作得很好。
svg.append("g")
.attr("class", "pieChart")
.attr("transform", "translate(1250,570)")
.selectAll("path")
.data(pie)
.append("path")
.attr("class", "pie")
.attr("id", function(d){return d.data.id})
.attr("d", seg)
.on("mouseenter", function(d){
d3.select(this)
.transition(10)
.duration(100)
.attr("d", segover)
})
然后我尝试将鼠标悬停在与图例相关的段上时更改饼图段。
var pieEl = svg.selectAll(".pie");
var piePath = pieEl.nodes();
svg.append("g")
.attr("class", "legend")
.attr("transform", "translate(-50,280)")
.selectAll(".mySquers")
.data(pie)
.enter()
.append("rect")
.attr("class", "rec")
.attr("x", 100)
.attr("y", function(d,i){ return 100 + i*25})
.attr("width", "15")
.attr("height", "15")
.attr("id", function(d,i){ return (popu[d,i].id)})
.style("fill",function(d,i){
if (this.id == piePath[i].id){
return piePath[i].getAttribute("fill")
}
})
.on("mouseenter", function(d){
for (var i=0; i<piePath.length; i++){
if (piePath[i].id == d.data.id){
piePath[i].setAttribute("d", segover);
}}
})
当我在 DOM 中使用 setAttribute("d", segover) 而不是像通常那样将 d 属性写成字符串时 (d="M144.58.....") 我有一个函数 (d= "function(pie){ _e);}" 并且在悬停时饼图段消失。但是例如,如果我在悬停时将属性填充设置为红色,它会发生变化并且段被绘制。所以代码的符号是好的。d 路径是否有一些行为 d3.arc() 我想念什么?欢迎任何建议。
我认为您应该将数据作为参数传递给函数。通常,当您直接 return 函数时,它被作为默认参数。
piePath[i].setAttribute("d", segover(*data associated with segment*));
svg.append("g")
.attr("class", "pieChart")
.attr("transform", "translate(1250,570)")
.selectAll("path")...
.attr("d", seg) // this is same as : attr("d", seg(d))
.on("mouseenter", function(d){
d3.select(this)
.transition(10)
.duration(100)
.attr("d", segover) // same here
})
我用人口数据 popu 制作了 d3.js 饼图和相关图例。当我将鼠标悬停在饼图上时,我实现了放大相关图例方形部分和饼图本身(更大的外半径)。现在我正试图做相反的事情。当我将鼠标悬停在图例正方形上时,我想放大正方形本身和相关的饼图部分。就像这里的这个例子 https://www.amcharts.com/demos/pie-chart-with-legend/。我将只写下与饼图问题相关的部分代码。
var pie = d3.pie()
.value(function(d) {return d.pop})(popu);
var seg = d3.arc()
.innerRadius(100)
.outerRadius(150)
.padAngle(.1)
.padRadius(45);
var segover = d3.arc()
.innerRadius(100)
.outerRadius(170)
.padAngle(.1)
.padRadius(45);
所以这部分工作得很好。
svg.append("g")
.attr("class", "pieChart")
.attr("transform", "translate(1250,570)")
.selectAll("path")
.data(pie)
.append("path")
.attr("class", "pie")
.attr("id", function(d){return d.data.id})
.attr("d", seg)
.on("mouseenter", function(d){
d3.select(this)
.transition(10)
.duration(100)
.attr("d", segover)
})
然后我尝试将鼠标悬停在与图例相关的段上时更改饼图段。
var pieEl = svg.selectAll(".pie");
var piePath = pieEl.nodes();
svg.append("g")
.attr("class", "legend")
.attr("transform", "translate(-50,280)")
.selectAll(".mySquers")
.data(pie)
.enter()
.append("rect")
.attr("class", "rec")
.attr("x", 100)
.attr("y", function(d,i){ return 100 + i*25})
.attr("width", "15")
.attr("height", "15")
.attr("id", function(d,i){ return (popu[d,i].id)})
.style("fill",function(d,i){
if (this.id == piePath[i].id){
return piePath[i].getAttribute("fill")
}
})
.on("mouseenter", function(d){
for (var i=0; i<piePath.length; i++){
if (piePath[i].id == d.data.id){
piePath[i].setAttribute("d", segover);
}}
})
当我在 DOM 中使用 setAttribute("d", segover) 而不是像通常那样将 d 属性写成字符串时 (d="M144.58.....") 我有一个函数 (d= "function(pie){ _e);}" 并且在悬停时饼图段消失。但是例如,如果我在悬停时将属性填充设置为红色,它会发生变化并且段被绘制。所以代码的符号是好的。d 路径是否有一些行为 d3.arc() 我想念什么?欢迎任何建议。
我认为您应该将数据作为参数传递给函数。通常,当您直接 return 函数时,它被作为默认参数。
piePath[i].setAttribute("d", segover(*data associated with segment*));
svg.append("g")
.attr("class", "pieChart")
.attr("transform", "translate(1250,570)")
.selectAll("path")...
.attr("d", seg) // this is same as : attr("d", seg(d))
.on("mouseenter", function(d){
d3.select(this)
.transition(10)
.duration(100)
.attr("d", segover) // same here
})