2017-11-29 9 views
0

これで時間が掛かっていて、何が間違っているのか分かりません。d3 scatterplotを更新すると、新しいデータポイントが正しい位置にありません

私のプロットは、ユーザーが選択する一連のパラメータに基づいて更新されるはずです。プロットが新しいデータポイントを追加する必要がある場合、新しいポイントはプロット上に正しく表示されません。すべての円がラインにする必要があり、これらのパラメータを持つ

Check out the new plot here

は、新しいプロットをチェックしてください。元の「線」が正しい位置にある間、新しい「線」はグリッドと一致しません。

ここに新しいプロットを作成する関数があります。これは正常に動作し、すべてのデータポイントが必要な場所にあります。

export const newPlot = (Params) => { 
    d3.selectAll("svg").remove(); 

    let margin = {top: 50, right: 20, bottom: 30, left: 40}, 
     width = 960 - margin.left - margin.right, 
     height = 500 - margin.top - margin.bottom; 

    let x = d3.scaleLinear().range([0, width]); 
    let y = d3.scaleLinear().range([height, 0]); 


    let svg = d3.select('.plot').append("svg") 
     .attr('class', 'svgPlot') 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
     .append("g") 
     .attr("transform","translate(" + margin.left + "," + margin.top + ")"); 


    d3.json(`../assets/data/${Params.type}${Params.Year}.json`, (error, data) => { 
     if (error) throw error; 

     const refinedData = parametrize(data, Params); 
     refinedData.forEach((d) => { 
     d[Params.xSelect] = Number(d[Params.xSelect]); 
     d[Params.ySelect] = Number(d[Params.ySelect]); 
     }); 

     let min = d3.min(refinedData,(d) => d[Params.xSelect]); 
     x.domain([(min - 2 <= 0 ? 0 : min - 2), 
       d3.max(refinedData,(d) => d[Params.xSelect])]); 
     y.domain([0, d3.max(refinedData,(d) => d[Params.ySelect])]); 


     svg.selectAll("circles") 
     .data(refinedData) 
     .enter().append("circle") 
     .attr('id', (d) => `${d.Player}`) 
     .attr("r", 5) 
     .attr("cx", (d) => x((d[Params.xSelect]))) 
     .attr("cy", (d) => y((d[Params.ySelect]))); 



     svg.append("g") 
     .attr("class", "x-axis") 
     .attr("transform", "translate(0," + height + ")") 
     .call(d3.axisBottom(x)); 


    svg.append("g") 
     .attr("class", "y-axis") 
     .call(d3.axisLeft(y)); 


     svg.append('text') 
     .attr("class", "label") 
     .attr('id', 'xlabel') 
     .attr("transform","translate(" + (width - 20) + " ," + (height-5) + ")") 
     .style("fill", "white") 
     .style("text-anchor", "middle") 
     .text(`${Params.xSelect}`); 

     svg.append('text') 
     .attr("class", "label") 
     .attr('id', 'ylabel') 
     .attr("transform", "rotate(-90)") 
     .attr("y", 1) 
     .attr("x", (height/2 - 250)) 
     .attr("dy", "1em") 
     .style("font-family", "sans-serif") 
     .style("fill", "white") 
     .style("text-anchor", "middle") 
     .text(`${Params.ySelect}`); 
     }); 

}; 

ここに更新機能があります。追加されたサークルは正しい場所にはなく、すべて同じ量だけオフセットされています。

export const rePlot = (Params) => { 

    let margin = {top: 50, right: 20, bottom: 30, left: 40}, 
     width = 960 - margin.left - margin.right, 
     height = 500 - margin.top - margin.bottom; 

    let xUp = d3.scaleLinear().range([0, width]); 
    let yUp = d3.scaleLinear().range([height, 0]); 

    let tooltip = d3.select("body").append("div") 
     .attr("class", "toolTip") 
     .style("display", "none"); 

    let svg = d3.select('.svgPlot'); 

    d3.json(`../assets/data/${Params.type}${Params.Year}.json`, (error, data) => { 
    if (error) throw error; 

    const refinedData = parametrize(data, Params); 

    refinedData.forEach((d) => { 
     d[Params.xSelect] = Number(d[Params.xSelect]); 
     d[Params.ySelect] = Number(d[Params.ySelect]); 
    }); 

    let min = d3.min(refinedData,(d) => d[Params.xSelect]); 
    xUp.domain([(min - 2 <= 0 ? 0 : min - 2), 
       d3.max(refinedData,(d) => d[Params.xSelect])]); 
    yUp.domain([0, d3.max(refinedData,(d) => d[Params.ySelect])]); 

    svg.select('.x-axis') 
     .transition() 
     .duration(1000) 
     .call(d3.axisBottom(xUp)); 


    svg.select('.y-axis') 
     .transition() 
     .duration(1000) 
     .call(d3.axisLeft(yUp)); 


    svg.select('#xlabel') 
    .text(`${Params.xSelect}`); 

    svg.select('#ylabel') 
     .text(`${Params.ySelect}`); 


    let circle = svg.selectAll("circle") 
        .data(refinedData); 


    circle.exit() 
      .transition() 
      .remove(); 

    circle.transition() 
     .duration(1000) 
     .attr("r", 5) 
     .attr("cx", (d) => xUp((d[Params.xSelect]))) 
     .attr("cy", (d) => yUp((d[Params.ySelect]))); 


    circle.enter().append("circle") 
     .attr('id', (d) => `${d.Player}`) 
     .attr("r", 5) 
     .attr("cx", (d) => xUp((d[Params.xSelect]))) 
     .attr("cy", (d) => yUp((d[Params.ySelect]))); 

     }); 
} 

答えて

0

円のあなたの最初のセットが変換されたグループに追加されます:この場合

let svg = d3.select('.plot').append("svg") 
    .attr('class', 'svgPlot') 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform","translate(" + margin.left + "," + margin.top + ")"); 

svg変数は変換基を指します。しかし、後で再選択すると、ルートSVG要素に実際に追加されます。

let svg = d3.select('.svgPlot'); 

これは、この違いの起点です。

関連する問題