2015-11-25 3 views
6

Ich versuche, diesen Code bl.ocks.org/mbostock/7881887 zu ändern, damit ich diese Technik verwenden kann, um eine Wortwolke anzuzeigen, wo die Kreisgröße sein würde relativ zu der Anzahl von Wörtern in einer Datei, aber mein Hauptproblem ist im Moment herauszufinden, wie man Text zu den Kreisen an erster Stelle hinzufügen kann. Entspannend kann ich sehen, was wie eine Funktion aussieht, die das im Code tut ... node.append ("text")? Also nahm ich an, ich wäre in der Lage, einen "Namen" -Wert zu "d" in der Knotenfunktion hinzuzufügen und weg würden wir gehen. Wie Sie sehen können, habe ich gerade den Namen hinzugefügt: text wobei text = "Test" zu d. Jede Hilfe, die irgendeinen Text überhaupt innerhalb oder in der Nähe von diesen Kreisen erscheinen lässt, würde sehr geschätzt werden! Ich bin eine neue D3, wie du es wahrscheinlich erzählen kannst und habe viele Abende damit verbracht, das zu googeln, um überhaupt nichts zu finden. Ich kann Beispiele für eine andere Art der Grafik sehen ... die Kraft Layout zB http://bl.ocks.org/mbostock/1093130 aber sie scheinen so verschieden ich nicht einen zum anderen :-(Wie füge ich Etiketten zu d3.js force bubble chart hinzu

anwenden können

hier ist mein jsfiddle https://jsfiddle.net/TimBrighton/vn7reroe/1/

var width = 960, 
    height = 500, 
    padding = 1.5, // separation between same-color nodes 
    clusterPadding = 6, // separation between different-color nodes 
    maxRadius = 12; 

var n = 100, // total number of nodes 
    m = 5; // number of distinct clusters 

var color = d3.scale.category10() 
    .domain(d3.range(m)); 

// The largest node for each cluster. 
var clusters = new Array(m); 

var nodes = d3.range(n).map(function() { 
    test="Test"; 
    var i = Math.floor(Math.random() * m), 
     r = Math.sqrt((i + 1)/m * -Math.log(Math.random())) * maxRadius,  
     d = { 
     name: test, 
     cluster: i, 
     radius: r, 
     name: "test", 
     x: Math.cos(i/m * 2 * Math.PI) * 200 + width/2 + Math.random(), 
     y: Math.sin(i/m * 2 * Math.PI) * 200 + height/2 + Math.random() 
     }; 
    if (!clusters[i] || (r > clusters[i].radius)) clusters[i] = d; 
    console.log(d.name); 
    return d; 

}); 

var force = d3.layout.force() 
    .nodes(nodes) 
    .size([width, height]) 
    .gravity(.02) 
    .charge(0) 
    .on("tick", tick) 
    .start(); 

var svg = d3.select("body").append("svg") 
    .attr("width", width) 
    .attr("height", height); 

var node = svg.selectAll("circle") 
    .data(nodes) 
    .enter().append("circle") 
    .style("fill", function(d) { return color(d.cluster); }) 
    .call(force.drag); 


node.append("text") 
.text(function(d) { return d.name; }) 
    // .style("font-size", function(d) { return Math.min(2 * d.r, (2 * d.r - 8)/this.getComputedTextLength() * 24) + "px"; }) 
    //.attr("dy", ".35em"); 

    .attr("dx", 10) 
    .attr("dy", ".35em") 
    .text(function(d) { return d.name }) 
    .style("stroke", "gray"); 

node.transition() 
    .duration(750) 
    .delay(function(d, i) { return i * 5; }) 
    .attrTween("r", function(d) { 
     var i = d3.interpolate(0, d.radius); 
     return function(t) { return d.radius = i(t); }; 
    }); 




function tick(e) { 
    node 
     .each(cluster(10 * e.alpha * e.alpha)) 
     .each(collide(.5)) 
     .attr("cx", function(d) { return d.x; }) 
     .attr("cy", function(d) { return d.y; }); 
} 

// Move d to be adjacent to the cluster node. 
function cluster(alpha) { 
    return function(d) { 
    var cluster = clusters[d.cluster]; 
    if (cluster === d) return; 
    var x = d.x - cluster.x, 
     y = d.y - cluster.y, 
     l = Math.sqrt(x * x + y * y), 
     r = d.radius + cluster.radius; 
    if (l != r) { 
     l = (l - r)/l * alpha; 
     d.x -= x *= l; 
     d.y -= y *= l; 
     cluster.x += x; 
     cluster.y += y; 
    } 
    }; 
} 

// Resolves collisions between d and all other circles. 
function collide(alpha) { 
    var quadtree = d3.geom.quadtree(nodes); 
    return function(d) { 
    var r = d.radius + maxRadius + Math.max(padding, clusterPadding), 
     nx1 = d.x - r, 
     nx2 = d.x + r, 
     ny1 = d.y - r, 
     ny2 = d.y + r; 
    quadtree.visit(function(quad, x1, y1, x2, y2) { 
     if (quad.point && (quad.point !== d)) { 
     var x = d.x - quad.point.x, 
      y = d.y - quad.point.y, 
      l = Math.sqrt(x * x + y * y), 
      r = d.radius + quad.point.radius + (d.cluster === quad.point.cluster ? padding : clusterPadding); 
     if (l < r) { 
      l = (l - r)/l * alpha; 
      d.x -= x *= l; 
      d.y -= y *= l; 
      quad.point.x += x; 
      quad.point.y += y; 
     } 
     } 
     return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1; 
    }); 
    }; 
} 

Antwort

6

Sie fügen den TEXT DOM mit in den Kreis DOM.

das ist der Grund, warum Sie den Text nicht sehen.

<circle cx="331.0297405069362" cy="238.4899367858363" style="fill: rgb(255, 127, 14);" r="24.842603758681765"> 
    <text dx="10" dy=".35em" style="stroke: gray;">test</text> 
</circle> 

Dies ist inc orrect.

Der richtige Weg wäre, eine Gruppe mit einem Kreis und Text zu versehen. So:

<g transform="translate(402.3818560847106,240.01473655622326)"> 
    <circle r="31.769893912794977" style="fill: rgb(255, 127, 14);"> </circle> 
    <text dx="-10" dy=".35em" style="stroke: gray;">test</text> 
</g> 

Also, dies zu tun zuerst machen Sie Gruppen wie folgt aus:

var node = svg.selectAll("circle") 
    .data(nodes) 
    .enter().append("g").call(force.drag); 

Kreis zur Gruppe hinzufügen:

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

Fügen Sie Text der Gruppe

//add text to the group  
node.append("text") 
    .text(function (d) { 
    return d.name; 
}) 
.attr("dx", -10) 
    .attr("dy", ".35em") 
    .text(function (d) { 
    return d.name 
}) 
    .style("stroke", "gray"); 

Insid e die Zecke Funktion stattdessen die cx cy des Kreises aktualisieren wir die vollständige Gruppe bewegen, müssen so Gebrauch verwandelt wie Thsi:

function tick(e) { 
    node.each(cluster(10 * e.alpha * e.alpha)) 
     .each(collide(.5)) 
    //.attr("transform", functon(d) {}); 
    .attr("transform", function (d) { 
     var k = "translate(" + d.x + "," + d.y + ")"; 
     return k; 
    }) 

} 

Arbeits Code here.

+2

Wow, vielen Dank !! Danke Cyril und Stackoverflow. Ich bin verkauft! Ich hoffe, dir eines Tages wieder zu helfen, aber jetzt vielen Dank für deine Zeit. – TimBrighton

Verwandte Themen