Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.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图表和react中,放大和缩小功能未按预期工作_Javascript_Reactjs_D3.js - Fatal编程技术网

Javascript 在D3图表和react中,放大和缩小功能未按预期工作

Javascript 在D3图表和react中,放大和缩小功能未按预期工作,javascript,reactjs,d3.js,Javascript,Reactjs,D3.js,在我的D3图表中,放大和缩小功能在D3图表中无法正常工作 它将缩放整个图形,而不仅仅是绘制的线和区域。预期行为应仅放大和缩小图表,而不是x轴和y轴 当我使用d3.zoom时使用下面的代码- .call(d3.zoom().on("zoom", function () { svg.attr("transform", d3.event.transform) })); 但是上面的代码也会更新axis。所以我尝试添加剪辑路径并尝试使用它,但它不起作用 // A function that

在我的D3图表中,放大和缩小功能在D3图表中无法正常工作

它将缩放整个图形,而不仅仅是绘制的线和区域。预期行为应仅放大和缩小图表,而不是x轴和y轴

当我使用d3.zoom时使用下面的代码-

.call(d3.zoom().on("zoom", function () {
   svg.attr("transform", d3.event.transform)
 }));
但是上面的代码也会更新axis。所以我尝试添加剪辑路径并尝试使用它,但它不起作用

   // A function that updates the chart when the user zoom and thus new boundaries are available

    const updateChart = () => {
      // recover the new scale
      var newX = d3.event.transform.rescaleX(xScale);
      var newY = d3.event.transform.rescaleY(yScale);

      // update axes with these new boundaries
      xAxis.call(d3.axisBottom(newX));
      yAxis.call(d3.axisLeft(newY));

      // update circle position
      scatter
        .selectAll("circle")
        .attr("cx", function(d) {
          return newX(d.Sepal_Length);
        })
        .attr("cy", function(d) {
          return newY(d.Petal_Length);
        });
    };

    var zoom = d3
      .zoom()
      .scaleExtent([0.5, 20]) // This control how much you can unzoom (x0.5) and zoom (x20)
      .extent([[0, 0], [containerWidth, containerHeight]])
      .on("zoom", updateChart);

    var svg = d3
      .select(this.refs.chart)
      .append("svg")
      .attr("width", containerWidth)
      .attr("height", containerHeight)
      .call(zoom);

    // Create the scatter variable: where both the circles and the brush take place
    var scatter = svg.append("g").attr("clip-path", "url(#clip)");
此分散应移动圆以进行放大和缩小。我的工作代码沙箱-


谢谢

我尝试在react之外重新制作,你必须跟随d3 zoom hierarki

绘制def

画一个剪辑

绘制要在片段内移动的项目

更新元素 缩放后,请记住比例正在更改。如果不这样做,请使用新比例更新所有元素,否则它将随着缩放而下降

风险值数据=[ { 开始时间:1567765320049, 震级:0, 震级:0, startupRunningStatus:处于同步状态 }, { 开始时间:1567851720049, 震级:0, 震级:0, startupRunningStatus:处于同步状态 }, { 开始时间:1568024520049, 震级:10级, 震级:10, startupRunningStatus:处于同步状态 }, { 开始时间:156823720049, 震级:10级, 震级:0, startupRunningStatus:不同步 }, { 起始时间:1568629320049, 震级:0, 震级:10, startupRunningStatus:不同步 }, { 开始时间:1569061320049, 震级:0, 震级:0, startupRunningStatus:处于同步状态 }, { 起始时间:1569579720049, 震级:-20, 震级:0, startupRunningStatus:不同步 }, { 起始时间:1570184520049, 震级:-20, 地震震级:-10, startupRunningStatus:不同步 }, { 起始时间:1570875049, 震级:0, 震级:0, startupRunningStatus:处于同步状态 }, { 开始时间:1571653320049, 震级:10级, 星等:-0, startupRunningStatus:不同步 }, { 开始时间:1572517320049, 震级:0, 地震震级:-10, startupRunningStatus:不同步 }, { 开始时间:1573467720049, 震级:0, 地震震级:-10, startupRunningStatus:不同步 }, { 开始时间:1574504520049, 震级:10级, 地震震级:-10, startupRunningStatus:不同步 }, { 开始时间:1575627720049, 震级:10级, 地震震级:-10, startupRunningStatus:不同步 } ]; var drawLineGraph=函数ContainerHeight,containerWidth,data,yLabel,warnLine{ //当用户缩放时更新图表的功能,因此新边界可用 var newX= const updateChart==>{ d3.选择FocusCircle。样式为“显示”、“无” //恢复新比例 newX=d3.event.transform.rescalexscale; var-newY=yScale; //使用这些新边界更新轴 d3.selectaxisX.calld3.axisBottomnewX; //d3.选择“axisY”。调用d3.axisLeftnewY; //更新圆位置 分散 .selectAllcircle .attrcx,已运行{ 如果d{ 返回newXd.startTime; } } .消耗性,功能性{ 如果d{ 返回newYd.magnity; } }; 变量line2=d3 线 .X功能{ 返回newXd.startTime; } .功能正常{ 返回newYd.0; }; var面积=d3 地区 .X功能{ 返回newXd.startTime; } .y0d{ 返回yScaled.magnity; } .Y1高度; var线=d3 线 .X功能{ 返回newXd.startTime; } .功能正常{ 返回newYd.magnity; }; svg.onmousemove,函数{ d3.选择焦点圆圈。样式为“显示”、“块” var mouse=d3.mousethis; var mouseDate=newX.invertmouse[0]; var i=bisectDatedata,mouseDate;//返回当前数据项的索引 var d0=数据[i-1]; var d1=数据[i]; 让d; //计算出哪个日期值最接近鼠标 如果类型为d1!==未定义{ d=鼠标移动时间-d0.startTime>d1.startTime-mouseDate?d1:d0; }否则{ d=d0; } div .html `${parseDated.startTime} 震级:${d.magnity}` .styleleft,d3.event.pageX+px .styletop,d3.event.pageY-28+px; var x=newXd.startTime; var y=yScaled.震级; 集中 .选择聚焦圆 .attrcx,x .消耗率,y; 集中 .选择FocusLinex .x1,x .attry1,yScaleyDomain[0] .x2,x .attry2,yScaleyDomain[1]; 集中 .选择FocusLiney .attrx1,xScalexDomain[0] .属性1,y .attrx2,xScalexDomain[1] .attry2,y; }; scatter.selectline2.attrd,line2; scatter.select.line.attrd,line; scatter.selectarea.attrd,区域; }; var zoom=d3 快速移动 .scaleExtent[0.5,20]//此控件控制可以取消缩放x0.5和缩放x20的大小 .范围[[0,0],[containerWidth,containerHeight]] .onzoom,updateChart; var svg=d3 。选择“图表” .appendsvg .attrwidth,集装箱宽度 .高度,集装箱高度; var clip=svg .appendefs .appendSVG:clipPath .attrid,clip .appendSVG:rect .attrwidth,集装箱宽度 .集装箱高度 艾特克斯先生,50岁 .attry,0; //创建散射变量:圆和画笔同时出现的位置 var scatter=svg.appendg.attrclip-path,urlclip; var-margin={顶部:50,左侧:50,右侧:50,底部:80}; 变量高度=容器高度-margin.top-margin.bottom; 变量宽度=集装箱宽度-margin.left-margin.right; var xDomain=d3.extenddata,函数d{ 返回d.startTime; }; var yDomain=d3.extendData,函数D{ 返回d.量级; }; var xScale=d3 .斯卡莱蒂时间 .范围[0,宽度] .域域域; var yScale=d3 .鳞片线 .范围[高度,0] .域域域; var xAxis=d3.x刻度; var yAxis=d3.0;axisLeftyScale; var线=d3 线 .X功能{ 返回xScaled.startTime; } .功能正常{ 返回yScaled.magnity; }; 变量line2=d3 线 .X功能{ 返回xScaled.startTime; } .功能正常{ 返回yScaled.magnity; }; var面积=d3 地区 .X功能{ 返回xScaled.startTime; } //.x0功能{ //返回xScaled.startTime; // } //.X1D{ //返回xScaled.magnity; // } .y0d{ 返回yScaled.magnity; } .Y1高度; //.Y0高度 //.y1d{return yScaled.magnity;}; //var面积=d3 //.区域 //.x0功能{ //返回xScaled.startTime; // } //.X1D{ //返回xScaled.startTime; // } //.y0d{ //返回yScaled.magnity; // } //.y1d{ //返回yScale0; // }; //var面积=d3 //.区域 //.X功能{ //返回xScaled.startTime; // } //.y0d{ //返回yScaled.magnity; // } //.Y1YScale10; //定义工具提示的div var div=d3 .selectbody .appenddiv .attr类,工具提示 .不透明度,0; var g=散射 .附录 .attransform,translate+margin.left+,+margin.top+; var g2=svg .附录 .attransform,translate+margin.left+,+margin.top+; g、 附录路径 .datumdata .等级、面积 .attrid,区域 .attrd,区域; g、 附加 .attrclass,x轴 .attrid,axisX .attrtransform,translate0,+高度+ .callxAxis; g2.2附录G .属性类,y轴 .attrid,axisY 卡利亚克斯先生 .附录文本 .attransform,旋转-90 .attry,6岁 .attrdy,.71em .attr文本锚定,结束 .textyLabel; g、 附录路径 .datumdata .阶级,阶层 .attrd,行; g、 附录路径 .datumdata .attrclass,第2行 .attrid,第2行 .attrd,第2行; g、 selectAllcircle .数据 进来 A.附加圆 .attrcx,已运行{ 返回xScaled.startTime; } .消耗性,功能性{ 返回yScaled.magnity; } .attrr,已运行{ 如果d.startupRunningStatus==不同步{ 返回5; } } .类,圆; //图例代码 svg A.附加圆 .attrcx,40岁 .自然减员,380 attrr先生,6岁 .stylefill,1391d8; svg A.附加圆 .attrcx,40岁 .自然减员,400 attrr先生,6岁 .stylefill,红色; svg .附录文本 艾特克斯先生,60岁 attry先生,380 .text启动配置 .STYLE字体大小,15px .路线基线,中间; svg .附录文本 艾特克斯先生,60岁 attry先生,400 .text运行配置 .STYLE字体大小,15px .路线基线,中间; //焦点跟踪 var focus=g.appendg.styledisplay,无; 集中 .附录 .attrid,focusLineX .attrclass,focusLine; 集中 .附录 .attrid,focusLineY .attrclass,focusLine; 集中 A.附加圆 .attrid,focusCircle attrr先生,5岁 .attrclass,圆焦点圆; //网格线 常数make_x_轴==>{ 返回d3.xscale; }; 分散 .附录 .attr类、网格 .attrtransform,translate50,+高度+50+ 呼叫 使_x_轴 .tickSize高度,0,0 .tickFormat ; var DisectDate=d3.Disectd函数{ 返回d.startTime; }.左; var parseDate=d3。时间格式%Y-%m-%d%H:%m:%S; g、 selectAlldot .数据 进来 .appendrect .attr类,覆盖 .宽度,宽度 .身高,身高 svg.onmouseover,函数d{ 控制台。记录“ok” focus.styledisplay,空; div 过渡 .持续时间200 .不透明度,0.9; } .onmouseout,函数{ focus.styledisplay,无; div 过渡 .持续时间300 .不透明度,0; } .onmousemove,函数{ var mouse=d3.mousethis; var mouseDate=xScale.invertmouse[0]; var i=bisectDatedata,mouseDate;//返回当前数据项的索引 var d0=数据[i-1]; var d1=数据[i]; 让d; //计算出哪个日期值最接近鼠标 如果类型为d1!==未定义{ d=鼠标移动时间-d0.startTime>d1.startTime-mouseDate?d1:d0; }否则{ d=d0; } div .html `${parseDated.startTime} 震级:${d.magnity}` .styleleft,d3.event.pageX+px .styletop,d3.event.pageY-28+px; var x=xScaled.startTime; var y=yScaled.震级; 集中 .选择聚焦圆 .attrcx,x .消耗率,y; 集中 .选择FocusLinex .x1,x .attry1,yScaleyDomain[0] .x2,x .attry2,yScaleyDomain[1]; 集中 .选择FocusLiney .attrx1,xScalexDomain[0] .属性1,y .attrx2,xScalexDomain[1] .attry2,y; }; svg .appendrect .attrwidth,集装箱宽度 .集装箱高度 .stylefill,无 .stylepointer事件,所有 .callzoom; //警戒线 //如果 //警告线&& //yDomain[0]warnLine.lineValue // { //附属品 //.attrx1,xScalexDomain[0] //.attry1,yscalewanline.lineValue //.attrx2,xScalexDomain[1] //.attry2,yscalewanline.lineValue //.attrclass,零线; //g.追加文本 //.attrx,xScalexDomain[1] //.attry,yscalewanline.lineValue //1岁 //.attr文本锚定,结束 //.textwarnLine.label //.attrclass,零行文本; // } } 绘图线图410700,数据,震级{ lineValue:0, 标签:启动配置! }; .轴线路径, .轴线{ 填充:无; 行程:E0; 形状渲染:边缘清晰; } .x轴路径{ 显示:无; } .线路{ 填充:无; 笔画:红色; 笔画宽度:2px; } .line2{ 填充:无; 行程:2e59cf; 笔画宽度:0.3px; } .圆圈{ /*填充物:白色; 笔画:钢蓝; 笔画宽度:2px*/ 填充:钢蓝; 笔画:钢蓝; /*笔画宽度:2px*/ } .区域{ 填充:2e59cf; 中风:无; 不透明度:0.1; } .零线{ 填充:无; 行程:1391d8; 笔画宽度:1px; 行程数组:8; } .zerolinetext{ 填充:1391d8; } .覆盖{ 填充:无; 中风:无; 指针事件:全部; } .焦点线{ 填充:无; 笔画:钢蓝; 笔划宽度:0.5px; } .焦点圆{ 填充物:红色; } 分区工具提示{ 位置:绝对位置; 文本对齐:居中; 宽度:150px; 高度:38px; 填充:2px; 字体:12px无衬线; 背景:淡蓝色; 边界:0px; 边界半径:8px; 指针事件:无; } .grid.勾选{ 笔画:浅灰色; 笔划宽度:0.7px; 行程数组:8; 不透明度:0.3; } .网格路径{ 笔画宽度:0; } 图表
我理解方法,但我可以看到Y轴现在没有显示。Y轴没有显示,因为它在剪辑内部绘制,剪辑以x=50开始。Y轴将被裁剪,请看我绘制剪辑时的代码,我只是编辑它并使其位于剪辑外部,对不起,我没有检查我看到的你有带值的剪辑,但它没有在任何地方使用?是的,我只是在变量上命名了它,所以我可以将它指向你,而不是程序,指向你 让你明白,我更新答案还能看到Y轴不显示吗相信我,很难向人们解释一些事情你是对的,我已经在我的react应用程序中添加了这段代码,还有一个问题是放大和缩小,如果你注意到的话,我们会在角落里看到焦点圈。