var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height");
var color = d3.scaleOrdinal(d3.schemeCategory20);
var simulation = d3.forceSimulation()
.force("link", d3.forceLink().id(function(d) { return d.id; }))
.force("charge", d3.forceManyBody())
.force("center", d3.forceCenter(width/4, height/4));
var graph = {
"nodes": [
{"id": "Myriel", "group": 1},
{"id": "Napoleon", "group": 1},
{"id": "Mlle.Baptistine", "group": 1},
{"id": "Mme.Magloire", "group": 1},
{"id": "CountessdeLo", "group": 1},
{"id": "Geborand", "group": 1},
{"id": "Champtercier", "group": 1},
{"id": "Cravatte", "group": 1},
{"id": "Count", "group": 1},
{"id": "OldMan", "group": 1}
],
"links": [
{"source": "Napoleon", "target": "Myriel", "value": 13},
{"source": "Mlle.Baptistine", "target": "Myriel", "value": 8},
{"source": "Mme.Magloire", "target": "Mlle.Baptistine", "value": 6},
{"source": "CountessdeLo", "target": "Myriel", "value": 10},
{"source": "Geborand", "target": "Myriel", "value": 16},
{"source": "Champtercier", "target": "Myriel", "value": 17},
{"source": "Cravatte", "target": "Myriel", "value": 19},
{"source": "Count", "target": "Myriel", "value": 20},
{"source": "OldMan", "target": "Myriel", "value": 8}
]
};
var link = svg.append("g")
.attr("class", "links")
.selectAll("line")
.data(graph.links)
.enter().append("line")
.attr("stroke-width", function(d) { return Math.sqrt(d.value); });
function modified() {
\t \t for(var j = 0 ; j < graph.nodes.length ; j++) {
\t \t \t for(var i = 0 ; i < graph.links.length ; i++) {
\t \t \t \t if(graph.nodes[j].id == graph.links[i].source) {
\t \t \t \t \t graph.nodes[j].value = graph.links[i].value;
\t \t \t \t \t break;
\t \t \t \t }
\t \t \t }
\t \t }
\t \t return graph.nodes;
}
var node = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(modified())
.enter().append("circle")
.attr("r", function (d) {
\t \t if(d.value == NaN) {
\t \t \t d.value = 5;
\t \t }
\t \t return d.value })
.attr("fill", function(d) { return color(d.group); })
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
node.append("title")
.text(function(d) { return d.id; });
simulation
.nodes(graph.nodes)
.on("tick", ticked);
simulation.force("link")
.links(graph.links);
function ticked() {
link
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
node
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
}
function dragstarted(d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart();
d.fx = d.x;
d.fy = d.y;
}
function dragged(d) {
d.fx = d3.event.x;
d.fy = d3.event.y;
}
function dragended(d) {
if (!d3.event.active) simulation.alphaTarget(0);
d.fx = null;
d.fy = null;
}
.links line {
stroke: #999;
stroke-opacity: 0.6;
}
.nodes circle {
stroke: #fff;
stroke-width: 1.5px;
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="960" height="600"></svg>
, das liegt daran, dass Links für Linien und Knoten sind für Kreis. Daher sind die Verbindungsdaten nicht an Knotendaten gebunden. Drucken Sie das d, um zu überprüfen, was es enthält –
Ok danke, ich verstehe. Ich rief 'd' für ein Knotenattribut an und es zeigte die Knoten Daten an und rief dann 'd' innerhalb 'linkDistance' auf und es gab die Verbindungsdaten zurück. Also, die nächste Frage, gibt es eine Möglichkeit, Knotengröße mit einem Link-Parameter zu setzen? Ich ändere die Verbindungsdaten dynamisch und muss die Knotengrößen für jeden Satz von Verbindungen ändern. – dl00065
Problem ist die Anzahl der Knoten und Links sind nicht gleich. Ich weiß nicht, was Sie erreichen wollen. –