Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在d3中鼠标向下移动时更改数据集_Javascript_Svg_D3.js - Fatal编程技术网

Javascript 在d3中鼠标向下移动时更改数据集

Javascript 在d3中鼠标向下移动时更改数据集,javascript,svg,d3.js,Javascript,Svg,D3.js,我已经从一个数据集创建了一个条形图。我还创建了一个圆形对象,我想作为一个按钮。在圆圈中鼠标向下移动时,我想更改用于条形图的数据集,然后重新绘制图形。我已经尝试将mousedown处理程序作为函数添加,但是当我单击时,数据集没有改变。以下是矩形的原始selectAll: svg.selectAll("rect") .data(data) .enter() .append("rect") .attr("x", functio

我已经从一个数据集创建了一个条形图。我还创建了一个圆形对象,我想作为一个按钮。在圆圈中鼠标向下移动时,我想更改用于条形图的数据集,然后重新绘制图形。我已经尝试将mousedown处理程序作为函数添加,但是当我单击时,数据集没有改变。以下是矩形的原始selectAll:

 svg.selectAll("rect")
         .data(data)
         .enter() 
         .append("rect")
         .attr("x", function(d, i) {
             return i * (width / data.length);})
         .attr("y", function(d) { 
             return 100 - d ;})
         .attr("width", function(d,i) {
              return barWidth ;})
         .attr("height", function(d) {
            return 150 - (100 - d);
         });
这是我在下面渲染的圆(我希望它是一个切换按钮):


我尝试过直接将svg.selectAll(“rect”)复制到mousedown函数中,并将数据重新绑定到不同的预定义数据集。我还尝试在.on“mousedown”函数中重新定义该数据集,但条形图仍然没有重新绘制。将mousedown分离成一个单独的函数,我在svg.append(“circle”)外部调用该函数也不起作用。我猜问题是我试图通过处理另一个事件来改变一个绘图对象,但我觉得一定有办法解决这个问题。非常感谢您的任何建议。

如果您展示您的确切问题或
jsfiddle
工作,我可能会尝试找到问题所在

结构和流程必须是这样的

两个SVG
圆圈
和条形图

两种功能

function drawgraph(var dataset)
{
//draw graph with this dataset
}

 function drawcircle()
{
//using `d3.js` draw circle
// and in .mousedown call the drawgraph(dataset)
}
方法很简单


分离svg和代码不要将两者结合起来。

代码必须与此类似

var rects = svg.selectAll("rect")
               .data(data)
               .enter() 
               .append("rect")
               .attr("x", function(d, i) {
                  return i * (width / data.length);})
               .attr("y", function(d) { 
                  return 100 - d ;})
               .attr("width", function(d,i) {
                  return barWidth ;})
               .attr("height", function(d) {
                  return 150 - (100 - d);
            });

svg.append("circle")
    .attr("cx", 525)
    .attr("cy", 275)
    .attr("r", 45)
    .attr("stroke", "white")
    .attr("fill", "#660066")
    .attr("opacity", "0.7")
    .on("mouseover", function(){d3.select(this)
        .style("opacity", "1");
      })
    .on("mouseout", function(){d3.select(this)
        .style("opacity", "0.7");
      })    
    .on("click", function() {
        rects.data(newdata)
             .enter() 
             .attr("x", function(d, i) {
                 return i * (width / data.length);})
             .attr("y", function(d) { 
                 return 100 - d ;})
             .attr("width", function(d,i) {
                 return barWidth ;})
             .attr("height", function(d) {
                 return 150 - (100 - d);
             });
      });

您没有向我们展示您遇到问题的实际代码。如果旧数据集和新数据集的大小相同,请记住enter选择将为空,仅复制代码将完全无效。您可能想要处理更新选择。谢谢,当我将drawgraph放入函数中时,它可以工作,但是当页面第一次加载时,如何使用初始数据集调用函数?没关系,我已经解决了。在我所有的函数定义下面,我只需要添加一个函数调用:drawGraph();
var rects = svg.selectAll("rect")
               .data(data)
               .enter() 
               .append("rect")
               .attr("x", function(d, i) {
                  return i * (width / data.length);})
               .attr("y", function(d) { 
                  return 100 - d ;})
               .attr("width", function(d,i) {
                  return barWidth ;})
               .attr("height", function(d) {
                  return 150 - (100 - d);
            });

svg.append("circle")
    .attr("cx", 525)
    .attr("cy", 275)
    .attr("r", 45)
    .attr("stroke", "white")
    .attr("fill", "#660066")
    .attr("opacity", "0.7")
    .on("mouseover", function(){d3.select(this)
        .style("opacity", "1");
      })
    .on("mouseout", function(){d3.select(this)
        .style("opacity", "0.7");
      })    
    .on("click", function() {
        rects.data(newdata)
             .enter() 
             .attr("x", function(d, i) {
                 return i * (width / data.length);})
             .attr("y", function(d) { 
                 return 100 - d ;})
             .attr("width", function(d,i) {
                 return barWidth ;})
             .attr("height", function(d) {
                 return 150 - (100 - d);
             });
      });