我在具有类名画布的 div 元素中创建 d3 图形,如下所示:
var width = 960,
height = 450,
colors = d3.scale.category10();
var svg = d3.select('.canvas').append('svg').attr('width', width).attr('height', height).style('background-color', '#cccccc');
我正在使用强制布局,如下所示:
var nodes = [],
lastNodeId = -1,
links = [];
// init D3 force layout
var force = d3.layout.force()
.nodes(nodes)
.links(links)
.size([width, height])
.linkDistance(100)
.linkStrength(1)
.charge(-500)
.on('tick', tick)
我添加矩形节点如下:
var circle = svg.append('svg:g').selectAll('g');
circle = circle.data(nodes, function(d) { return d.id; });
// update existing nodes
circle.selectAll('circle')
.style('fill', 'LightGreen');
// add new nodes
var g = circle.enter().append('svg:g');
g.append('svg:rect')
.attr('class', 'node')
.attr('width', 50)
.attr('height', 50)
// Adding double click event handler for the node. If the user double clicks on a link,
// then a window prompt is displayed in which the user inputs the new text for the label.
// This way the user can change a label text.
.on('dblclick', function(d) {
var newText = window.prompt("Enter the new node text", "");
d3.select(this).select('text')
.text(function(d){
return newText;
})
})
默认情况下,我将节点 ID 作为文本。
var g = circle.enter().append('svg:g');
// show node IDs
g.append('svg:text')
.attr('x', 25)
.attr('y', 25)
.attr('class', 'id')
.text(function(d) {return d.id;});
如您所见,我为节点添加了双击处理程序。其中代码提示用户输入节点的新文本并将文本放入节点中。但问题是我没有看到节点文本发生变化。请让我知道要编写什么代码以更改节点文本。该方法是否也适用于更改链接(节点之间)文本?
我创建链接如下:
var path = svg.append('svg:g').selectAll('path');
path = path.data(links);
linkLabels = svg.selectAll("link").data(links).enter()
.append("text")
.attr("x", function(d) { return d.source.x + (d.target.x - d.source.x)/2; })
.attr("y", function(d) { return d.source.y + (d.target.y - d.source.y)/2; })
.text(function(d) { return (d.source.id + "-" + d.target.id); });
// add new links
var edges = path.enter().append('svg:path')
.attr('class', 'link')
// Adding double click event handler for the link. If the user double clicks on a link,
// then a window prompt is displayed in which the user inputs the new text for the label.
// This way the user can change a label text.
.on('dblclick', function(d) {
var newText = window.prompt("Enter the new label text", d.label);
d3.select(this.parentEdge).select('text')
.text(function(d){
return newText;
})
});
双击链接但链接文本没有更改时,我会看到提示。