2017-10-31 6 views
1

は現在、私はバブルチャートは、(現在、私が唯一のいくつかの気泡を示しています)私は、地図上にプロットするデータがたくさんあるenter image description hered3js:バブルチャートをズームするにはどうすればいいですか?

を示されているようd3jsを使用して作られています。グラフをフォーカス可能にする方法はありますか?私はユーザーに特定の領域をズームできる機能を与えたい。

d3jsでどのように行うのですか?

次のように私が持っているスクリプトは次のとおりです。

var data = [{name: "A", rank: 0, student_percentile: 100.0, 
     admit_probability: 24}, 
     {name: "B", rank: 45, student_percentile: 40.3, 
     admit_probability: 24}, 
     {name: "C", rank: 89, student_percentile: 89.7, 
     admit_probability: 24}, 
     {name: "D", rank: 23, student_percentile: 10.9, 
     admit_probability: 24}, 
     {name: "E", rank: 56, student_percentile: 30.3, 
     admit_probability: 24}]; 

var margin = 40, 
    width = 600, 
    height = 400; 
function d3(data){ 
    //var margin = {top: 30, right: 20, bottom: 30, left: 50} 

    console.log(data); 
    //d3.extent(data, function(d) { return +d.admit_probability; }) 

    xscale = d3.scaleLinear() 
     .domain(
       d3.extent(data, function(d) { return +d.student_percentile; }) 
      ) 
     .nice() 
     .range([0, width]); 

    yscale = d3.scaleLinear() 
     .domain(d3.extent(data, function(d) { return +d.rank; })) 
     .nice() 
     .range([height, 0]); 

    var xAxis = d3.axisBottom().scale(xscale); 

    var yAxis = d3.axisLeft().scale(yscale); 

    svg = d3.select('.chart') 
     .classed("svg-container", true) 
     .append('svg') 
     .attr('class', 'chart') 
     .attr("viewBox", "0 0 680 490") 
     .attr("preserveAspectRatio", "xMinYMin meet") 
     .classed("svg-content-responsive", true) 
     .append("g") 
     .attr("transform", "translate(" + margin + "," + margin + ")"); 

    svg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis); 

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

    var color = d3.scaleOrdinal(d3.schemeCategory10); 

    var local = d3.local(); 
    circles = svg.selectAll(null) 
      .data(data) 
      .enter() 
      .append("circle") 
      .attr("cx", width/2) 
      .attr("cy", height/2) 
      .attr("opacity", 0.3) 
      .attr("r", 20) 
      .style("fill", function(d){ 
      if(+d.admit_probability <= 40){ 
       return "red"; 
      } 
      else if(+d.admit_probability > 40 && +d.admit_probability <= 70){ 
       return "yellow"; 
      } 
      else{ 
       return "green"; 
      } 
      }) 
      .attr("cx", function(d) { 
      return xscale(+d.student_percentile); 
      }) 
      .attr("cy", function(d) { 
      return yscale(+d.rank); 
      }) 
      .on('mouseover', function(d, i) { 
      local.set(this, d3.select(this).style("fill")); 
      d3.select(this) 
       .transition() 
       .duration(1000) 
       .ease(d3.easeBounce) 
       .attr("r", 32) 
       .style("cursor", "pointer") 
       .attr("text-anchor", "middle"); 
      } 
      ) 
      .on('mouseout', function(d, i) { 
      d3.select(this).style("fill", local.get(this)); 
      d3.select(this).transition() 
       .style("opacity", 0.3) 
       .attr("r", 20) 
       .style("cursor", "default") 
      .transition() 
      .duration(1000) 
      .ease(d3.easeBounce) 
      }); 

    texts = svg.selectAll(null) 
     .data(data) 
     .enter() 
     .append('text') 
     .attr("x", function(d) { 
     return xscale(+d.student_percentile); 
     }) 
     .attr("text-anchor", "middle") 
     .attr("y", function(d) { 
     return yscale(+d.rank); 
     }) 
     .text(function(d) { 
     return +d.admit_probability; 
     }) 
     .attr("pointer-events", "none") 
     .attr("font-family", "sans-serif") 
     .attr("font-size", "12px") 
     .attr("fill", "red"); 

    svg.append("text") 
     .attr("transform", "translate(" + (width/2) + " ," + (height + margin) + ")") 
     .style("text-anchor", "middle") 
     .text("Percentile"); 

    svg.append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 0 - margin) 
     .attr("x",0 - (height/2)) 
     .attr("dy", "1em") 
     .style("text-anchor", "middle") 
     .text("Rank"); 

    $('circle').tipsy({ 
     gravity: 'w', 
     html: true, 
     title: function() { 
      var d = this.__data__; 
      return d.name + '<br/> Rank: ' + d.rank; 
     } 
    }); 
} 
+0

共有して編集可能なフィドルを拡大するにはd3jsブラシ機能を使用することです – Anbarasan

+0

http://jsfiddle.net/h87403om/1/ – Yesha

答えて

1

あなたはD3のズームイベントハンドラを使用して/アウト機能でシンプルなズームを追加して、グラフの大きさを変換することができます。

svg = d3.select('.chart') 
    .classed("svg-container", true) 
    .append('svg') 
    .attr('class', 'chart') 
    .attr("viewBox", "0 0 680 490") 
    .attr("preserveAspectRatio", "xMinYMin meet") 
    .classed("svg-content-responsive", true) 
    // call d3 Zoom 
    .call(d3.zoom().on("zoom", function() { 
     svg.attr("transform", d3.event.transform) 
     })) 
    .append("g") 
    .attr("transform", "translate(" + margin + "," + margin + ")"); 

ズームイン/アウトするには、マウスのスクロールまたはダブルクリックでズームインし、シフト+ダブルクリックしてズームアウトします。

別のアプローチは、地域を選択して、/アウト

var brush = d3.brush().extent([[0, 0], [width, height]]).on("end", brushended), 
     idleTimeout, 
     idleDelay = 350; 

    svg.append("g") 
     .attr("class", "brush") 
     .call(brush); 

    function brushended() { 
     var s = d3.event.selection; 
     if (!s) { 
      if (!idleTimeout) return idleTimeout = setTimeout(idled, idleDelay); 

      yscale.domain(d3.extent(data, function(d) { return +d.rank; })).nice(); 

      xscale.domain(d3.extent(data, function(d) { return +d.student_percentile; })).nice() 

     } else { 

      xscale.domain([s[0][0], s[1][0]].map(xscale.invert, xscale)); 
      yscale.domain([s[1][1], s[0][1]].map(yscale.invert, yscale)); 
      svg.select(".brush").call(brush.move, null); 
     } 
     zoom(); 
    } 

    function idled() { 
     idleTimeout = null; 
    } 

    function zoom() { 

     var t = svg.transition().duration(750); 
     svg.select(".x axis").transition(t).call(xAxis); 
     svg.select(".y axis").transition(t).call(yAxis); 
     // apply new scale to the svg elements that depend on scale. 
     svg.selectAll("text").transition(t) 
      .attr("x", function(d) { 
      return xscale(+d.student_percentile); 
      }) 
      .attr("y", function(d) { 
      return yscale(+d.rank); 
      }) 
    } 
+0

いただきありがとうございますあなた溶液。私はこれ以上の研究の後にこれをやってみましたが、ユーザーがページをダブルクリックすると、ズームインされますが、ページをリフレッシュせずに、インタル状態に戻る方法はありません。私もチュートリアルをいくつか試しましたが、そのすべてにこの問題がありました。基本的に、ズームアウトの手順は? – Yesha

+0

@Yesha最も使いやすい方法は、マウススクロールを使用してズームイン/ズームアウトすることです。同じことを達成するためのもう1つのアクションは、ダブルクリックしてズームインしてくぼみ+ダブルクリックしてズームアウトすることです。これは直感的なやりとりではないので、私はd3jsブラシ機能を使用するための答えを更新します。 – tejesh95

+0

ありがとうございました。私はあなたの最初のソリューションを使用することができますが、私は2番目の方法を使用する方法を理解することはできませんと本当に申し訳ありません。私は現在のsvg要素で与えたメソッドを呼び出しました。その後、「エリアを選択してズームイン/ズームアウトする」とはどういう意味ですか?私はウェブインタフェースを使用しています。だから私はそれをテストするために何をすべきか理解できません。また、私たちのウェブサイトはモバイル対応であるため、モバイルでも同じ機能を使用します。 – Yesha

関連する問題