【问题标题】:How to simultaneously update the color of elements in a SVG when I mouseover elements of a second SVG using D3当我使用 D3 将鼠标悬停在第二个 SVG 的元素上时,如何同时更新 SVG 中元素的颜色
【发布时间】:2015-11-28 02:42:14
【问题描述】:

我创建了两个不同的SVGs。一个包含带有数据点的图形,另一个包含三条线。线条颜色应该取决于所选数据点,我还没有设法完成这项工作(下面有更多详细信息)。 jsfiddle 可以在这里找到:jsfiddle。

当我mouseover数据点时,我想做的是改变三行的颜色。我设法将所有线条的颜色更改为相同的颜色,但实际上想使用与相应数据点关联的颜色,但我不知道如何将存储在myColors 中的颜色数据传递给我设置线条颜色的功能。

相关代码如下所示。我将带有数据点的图形添加到mySvg,当我mouseover 数据点时,我将它们的颜色更改为黑色,将另一个SVG 中的线条颜色更改为绿色。但是,我实际上不想将所有线条的颜色更改为绿色,而是将它们的颜色更改为myColors 中定义的颜色(请参阅上面链接的 jsfiddle 以查找数据)。我怎么能这样做?

var circles = mySvg.selectAll("circle")
                         .data(lineData)
                         .enter()
                         .append("circle");

var circleAttributes = circles
                       .attr("cx", function (d) { return xScale(d.x); })
                       .attr("cy", function (d) { return yScale(d.y); })
                       .attr("r", 6)
                       .style("fill", 'red')
                       .on('mouseover', function(d){
                           d3.select(this).style("fill", 'black');
                           d3.select('#myLines').selectAll("line").attr("class","sweepline").style("stroke", 'green');

                           })

                       .on('mouseout', function(d){
                           d3.select(this).style("fill", 'red');

                        }); 

【问题讨论】:

  • 我收到了你的信息 ;-) 这次我不确定,如果我理解你的问题。也许,那是因为我无法理解你试图用你的代码实现的目标。我仍然想念大局。无论如何,我已经用我认为可以解决您问题的方法更新了您的 JSFiddle。如果这解决了您的问题,我将把它放在一个答案中,并提供一些进一步的解释。
  • @altocumulus:你是救生员! :) 这正是我一直在寻找的,但我无法解决的问题!是的,请将其作为答案与其他 cmets 一起发布,我将接受(并投票)它。关键线似乎是'return d[5][i].color;'所以请详细说明。给出“大图”是困难的,但这是我能想到的最好的最小例子,我不得不承认它确实看起来不太合理。非常感谢您的努力!我只能在明天之前对您的回答发表评论,所以如果我没有尽快回复,请不要感到惊讶。

标签: javascript d3.js mouseover


【解决方案1】:

与许多 d3 问题一样,使用数据绑定可以轻松解决这一问题。您的自定义颜色可以绑定到您附加到第二个 SVG 的行。由于您的数组myColors,由每行自定义颜色的数组组成,与您的其他数组(如names、x1Val、y1Val 等)具有相同的结构,因此它可以轻松集成到数据数组中coords 用于将信息绑定到您的线路:

var coords = d3.zip(names, x1Val, y1Val, x2Val, y2Val, myColors);

每行的这些数据稍后可以在您的圈子的mouseover 事件处理程序中使用,在行上设置stroke 样式。

.on('mouseover', function(d,i) {
    // ...
    d3.select('#myLines')
        .selectAll("line")
            .style("stroke", function(d) {
                return d[5][i].color;
            });
})

回调决定颜色

  1. 访问自定义颜色数组,该数组位于绑定到行的数据数组的第 5 位,因此d[5],
  2. 获取此颜色数组的ith 对象。 i 是这个圆圈的索引,它作为参数传递给事件处理程序,并通过闭包提供给 stroke 回调,
  3. 从此对象获取属性.color

查看更新后的JSFiddle 以获取工作示例。


此外,我更新了mouseout 处理程序以删除先前设置的stroke 样式,导致线条被重置为由sweepline 类设置的默认颜色。至少在我看来,这种行为似乎消失了。

d3.select('#myLines')
    .selectAll("line")
        .style("stroke", null); 

【讨论】:

  • 非常非常有帮助,再次感谢!看来我必须在数据结构上投入更多时间。对于我的实际问题,我将不得不从 CSV 或 JSON 文件中读取这些数据。然后挑战将是从这些文件中获取数据结构“坐标”,但我想有一些聪明的方法可以做到这一点。再次感谢,下一个问题见! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2021-05-15
  • 1970-01-01
  • 2016-07-31
相关资源
最近更新 更多