使用d3.js在svg路径元素上绘制文本
Draw text on svg path element with d3.js
我正试图修改这个力向图,特别是我想做的是在每个图边缘上绘制文本。我尝试了以下操作:
// add new links
path.enter().append('svg:path')
.attr('class', 'link')
.classed('selected', function(d) { return d === selected_link; })
.style('marker-start', function(d) { return d.left ? 'url(#start-arrow)' : ''; })
.style('marker-end', function(d) { return d.right ? 'url(#end-arrow)' : ''; })
.on('mousedown', function(d) {
if(d3.event.ctrlKey) return;
// select link
mousedown_link = d;
if(mousedown_link === selected_link) selected_link = null;
else selected_link = mousedown_link;
selected_node = null;
restart();
})
.append('svg:text').attr('x', 0).attr('y', 4)
.attr('class', 'id').text(function(d) { console.log(d.id); return d.id; })
只有最后一行是我修改的。我还为link
对象添加了id
属性,因此我正在使用的代码并不完全是我所链接的。日志语句按预期打印,但没有出现文本或错误消息。如何在每个link
的中间添加文本?
您将需要使用svg组<g>
,这将允许您在其中添加元素。
var new_paths = path.enter().append('g'),
links = new_paths.append('svg:path').attr('class', 'link');
可以随意添加links
的样式或行为。然后,对于标签,您将再次追加到组:
var labels = new_paths.append('svg:text').attr('class', 'label');
同样,你可以在labels
上添加任何你想要的。
当你定义force时,你需要选择链接和标签,就像这样:
force.on("tick", function() {
links.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; });
labels.attr("transform",function(d){
return
"translate("+
(0.5*(d.source.x+d.target.x))+
","+
(0.5*(d.source.y+d.target.y))+
")";
});
});
这里是一个演示提琴http://jsfiddle.net/k2oyef30/
更新对不起,我以前没有学你的样子。这是你的特殊解决方案。
将路径定义为:
// handles to link and node element groups
var path = svg.append('svg:g').selectAll('.path'),
circle = svg.append('svg:g').selectAll('g');
在function tick() {
中,你必须选择.links
或.id
path.select('.link').attr('d', function(d) {
和管理新元素:
path.select('.id').attr("transform",function(d){
return "translate("+
(0.5*(d.source.x+d.target.x))+
","+
(0.5*(d.source.y+d.target.y))+
")";
});
在function restart() {
内部,您必须创建<g>
元素,例如使用path
类,并将元素附加到其中。
// add new links
var newPaths = path.enter().append('svg:g').attr('class','path');
newPaths.append('svg:path')
.attr('class', 'link')
.classed('selected', function(d) { return d === selected_link; })
.style('marker-start', function(d) { return d.left ? 'url(#start-arrow)' : ''; })
.style('marker-end', function(d) { return d.right ? 'url(#end-arrow)' : ''; })
.on('mousedown', function(d) {
if(d3.event.ctrlKey) return;
// select link
mousedown_link = d;
if(mousedown_link === selected_link) selected_link = null;
else selected_link = mousedown_link;
selected_node = null;
restart();
});
newPaths.append('svg:text').attr('x', 0).attr('y', 4)
.attr('class', 'id').text(function(d) { return d.id; });
示例定义的问题是它已经选择了<path>
元素,使您无法选择新的<g class="path">
相关文章:
- Html画布绘制速度因画布元素过多而减慢
- 画布-绘制的线,但没有显示在谷歌检查元素
- 在元素上绘制边框,但不捕获事件
- 如何在画布元素上绘制视频
- 绘制DOM元素:鼠标事件会被背景元素混淆
- 未捕获的类型错误:对象#<HTML对象元素>没有方法'重新绘制工作流'
- 使用javascript绘制多个以数组元素为文本中心的圆
- 是否可以指示浏览器首先绘制页面的哪些元素
- 如何在正确的位置绘制画布元素
- 如何确定浏览器何时完成绘制插入的元素
- 在画布元素上动态绘制
- 如何在拉斐尔中获取绘制的矩形元素
- 如何在带有触摸的PhoneGap中的画布元素上绘制
- 为什么ctx.drawImage只将视频元素的一部分绘制到画布上
- 在重新排序DOM时,如何重新绘制和重新组织同位素容器中的元素
- Javascript 将动态图像从 URL 绘制到画布元素上
- 为什么画布绘制图像在使用 dom 图像元素时不起作用
- 使用数据表(Meteor Tabular)在新行中绘制数组的每个元素
- 如何绘制多条线,数组的每个元素一条线包含vega规范数据中的y值
- SVG:在子元素内部绘制