2017-03-10 15 views
2

このtutorialを使って円の集合を作成し、属性を読み込んで線分を並べ、色分けして移動(ドラッグ&ドロップ)できるようにしました。 。私は、ノードを作成し、各ノードに「サークル」と「テキスト」を追加する必要があることを知っていますが、すべて一緒に機能させることはできません。D3 js - ドラッグ・アンド・ドロップのラベルやテキストを追加

フルネームサイド負傷不在

NAME0ポートなしなし

名1右舷いいえ

Name2は右舷いいえはい

:ここ

<!DOCTYPE html> 
<html> 
<head> 
    <title>Set Lineups</title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
    <script src="d3.js"></script> 
    <style> 
     body {padding: 15px} 
     .active { 
      stroke: #000; 
      stroke-width: 2px; 
     } 
     text { 
      font: 10px sans-serif; 
      pointer-events: none; 
      text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff; 
     } 
    </style> 
</head> 

<body> 
<!--begin svg block--> 
    <svg width="960" height="500"></svg> 
    <script> 
    //now in js 

    //define variables 
    var svg = d3.select("svg"), 
     width = +svg.attr("width"), 
     height = +svg.attr("height"), 
     radius = 32; 

    // setup x 
    var xValue = function(d) { 
     if (d.Side == "Starboard") {return x=Math.round(2*radius)} 
      else if (d.Side == "BiStar") {return x=Math.round(2*radius)} 
      else if (d.Side == "Port") {return x=Math.round(5*radius)} 
      else if (d.Side == "BiPort") {return x=Math.round(5*radius)} 
      else if (d.Side == "Cox") {return x=Math.round(8*radius)} 
    } 

    // setup y 
    var yPort = 0 
    var yStar = 0 
    var yCox = 0 
    var yValue = function(d) { 
     if (d.Side == "Starboard") { 
      y = Math.round(2*radius) + yStar; 
      yStar = y; 
      return y} 
      else if (d.Side == "BiStar") { 
       y = Math.round(2*radius) + yStar; 
       yStar = y; 
       return y} 
      else if (d.Side == "Port") { 
       y = Math.round(2*radius) + yPort; 
       yPort = y; 
       return y} 
      else if (d.Side == "BiPort") { 
       y = Math.round(2*radius) + yPort; 
       yPort = y; 
       return y} 
      else if (d.Side == "Cox") { 
       y = Math.round(2*radius) + yCox; 
       yCox = y; 
       return y} 
    } 

    //read in the data 
    d3.csv("Roster.csv", function(data) { 
     data.forEach(function(d) { 
      name : d["Full Name"]; 
      side : d["Side"]; 
      injured : d["Injured"]; 
      absent : d["Absent"]; 
      console.log(d); 
     }); 

     var node = svg.selectAll(".node") 
      .data(data) 
      .enter().append("g") 
      .attr("class", "node") 
      .call(d3.drag() 
       .on("start", dragstarted) 
       .on("drag", dragged) 
       .on("end", dragended)); 

     node.append("circle") 
      .style("fill", function(dg, i) { 
       if (dg.Side == "Port") {color = "red"} 
        else if (dg.Side == "Starboard") {color = "green"} 
        else if (dg.Side == "BiPort") {color = "orange"} 
        else if (dg.Side == "BiStar") {color = "blue"} 
        else if (dg.Side == "Cox") {color = "grey"} 
       if (dg.Injured == "Yes") {color = "yellow"} 
       if (dg.Absent == "Yes") {color = "yellow"} 
       return color; 
      }) 
      .attr("cx", function(dg) { return xValue(dg); }) 
      .attr("cy", function(dg) { return yValue(dg); }) 

     node.append("text") 
      .attr("dx", 12) 
      .attr("dy", ".35em") 
      .attr("cx", function(dg) { return xValue(dg); }) 
      .attr("cy", function(dg) { return yValue(dg); }) 
      .text(function(dg) {return dg['Full Name']}); 


     function dragstarted(dg) { 
      d3.select(this).raise().classed("active", true); 
     } 

     function dragged(dg) { 
      d3.select(this).attr("cx", dg.x = d3.event.x).attr("cy", dg.y = d3.event.y); 
     } 

     function dragended(dg) { 
      d3.select(this).classed("active", false); 
     } 

    }) 
</script> 
</body> 

は、データのスナップショットです

名前2 BiPortいいえいいえ

NAME3 BiStarいいえ

NAME4右舷はいいいえ

Name5コックスいいえ

答えて

0

あなたは正しいアプローチを持っていますが、ノードへの変換を割り当てた場合、それは容易になります(またはg要素)、デフォルトではテキストと円が揃うようにしています。この回答ではというアプローチをとっています(ただし、ノードの動きを再計算してテキストと円の座標を個別に再計算することもできます)

中央あなたは困難を経験することができる理由を、あなたは、ドラッグ機能であなたは属性cxcyを設定していることがわかります:

d3.select(this).attr("cx", dg.x = d3.event.x).attr("cy", dg.y = d3.event.y); 

しかし、ドラッグg /ノード要素は、それらの性質を持っていません - その行が参照するthisです。これは、最初にサークルに追加されたときにドラッグ機能をノードに移動したためです。

代わりに、上記の行は、ドラッグされたg /ノードのトランスフォームを再計算できるもので置き換えてください。これは、ドラッグされたg /ノード(および他の子供も)内のテキストとサークルの両方を更新します。

もちろん、g /ノードごとにトランスフォームを使用する場合は、cx,cyという円のプロパティをまったく使用する必要はありません。

一緒に、それは次のようになります。

var svg = d3.select("svg"), 
 
    width = +svg.attr("width"), 
 
    height = +svg.attr("height"), 
 
    radius = 32; 
 

 
var circles = d3.range(20).map(function() { 
 
    return { 
 
    x: Math.round(Math.random() * (width - radius * 2) + radius), 
 
    y: Math.round(Math.random() * (height - radius * 2) + radius) 
 
    }; 
 
}); 
 

 
var color = d3.scaleOrdinal() 
 
    .range(d3.schemeCategory20); 
 
    
 
var circleGroup = svg.selectAll('g') 
 
    .data(circles) 
 
    .enter().append('g') 
 
    .attr('transform',function(d) { return 'translate('+d.x+','+d.y+')'; }) 
 
    .call(d3.drag() 
 
     .on("start", dragstarted) 
 
     .on("drag", dragged) 
 
     .on("end", dragended)); 
 

 
circleGroup.append("circle") 
 
    .attr("r", radius) 
 
    .style("fill", function(d, i) { return color(i); }) 
 

 
circleGroup.append("text") 
 
    .text(function(d,i) { return i; }) 
 
    .style('text-anchor','middle') 
 
    .attr('y',4); 
 

 

 
function dragstarted(d) { 
 
    d3.select(this).raise().classed("active", true); 
 
} 
 

 
function dragged(d) { 
 
    d3.select(this).attr("transform","translate("+(d.x = d3.event.x)+','+(d.y = d3.event.y)+')'); 
 
} 
 

 
function dragended(d) { 
 
    d3.select(this).classed("active", false); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.5.0/d3.min.js"></script> 
 
<svg width="500" height="300"></svg>

+0

感謝の男!これは非常に便利でした。私の「変形」の理解は完全には完全ではありませんでした。それ以上のグーグル・グーグルと私のギャップを埋めるのを助けてくれました(https://www.dashingd3js.com/svg-group-element-and-d3js)。 – Rodd

+0

だからサークルは私がそれらをしたい場所を初期化しないことを除いて、私は働くためにすべてを得た。最初に変換される項目が未定義であるというエラーが発生します。しかし、いったんオブジェクトをドラッグしようとすると、トランスフォームはうまく動作します。 インスペクタを確認したところ、それぞれのオブジェクトに適切なxとyが格納されていますが、それでもまだ初期化されていません。 Rodd

+0

OOOOH WAIT。サークルグループの最初の変換で初期化... .attr( 'transform'、function(d){return '変換+' + xValue(d)+ '、' + yValue(d)+ ')';} ) – Rodd

関連する問題