var text = svg.append("g").selectAll("text") .data(force.nodes()) .enter() .append("text") .attr("dy", ".35em") .attr("text-anchor", "middle") .style('fill', function (node) { var color; var link = links[node.index]; color = "#A254A2"; return color; }).attr('x', function (d) { var re_en = /[a-zA-Z]+/g; if (d.name.match(re_en)) { d3.select(this).append('tspan') .attr('x', 0) .attr('y', 2) .text(function () { returnd.name; }); } elseif(d.name.length <= 4){ d3.select(this).append('tspan') .attr('x', 0) .attr('y', 2) .text(function () { returnd.name; }); } else { vartop = d.name.substring(0, 4); varbot = d.name.substring(4, d.name.length); d3.select(this).text(function () { return ''; }); d3.select(this).append('tspan') .attr('x', 0) .attr('y', -7) .text(function () { return top; }); d3.select(this).append('tspan') .attr('x', 0) .attr('y', 10) .text(function () { return bot; }); } });
时间: 2024-02-10 21:30:51 浏览: 149
这是一个使用D3.js绘制SVG图形的代码。具体来说,它创建了一个文本元素(text),并为每个节点添加了一个文本标签。其中,文本的内容来自于节点的名称(d.name),并根据名称的长度来进行分行。
具体实现中,代码首先使用selectAll方法选择所有的文本元素。接着,使用data方法将节点数据与文本元素进行绑定。然后,使用enter方法来添加新的文本元素。在添加文本元素时,首先设置文本的垂直对齐方式(dy)和水平对齐方式(text-anchor),然后根据节点的名称来设置文本的颜色(fill)。
接下来,代码使用attr方法来设置文本的位置。对于名称长度小于等于4的节点,直接将文本放在中心位置即可。对于名称长度大于4的节点,需要将名称分成两行进行显示。具体实现中,代码使用正则表达式来判断节点名称中是否包含英文字母,如果包含则将名称分成两行,否则直接将名称放在中心位置。
最后,代码使用tspan元素来分别设置文本的上下两行。在设置文本位置时,使用了x和y属性来控制文本的水平和垂直位置。
总之,这段代码使用D3.js实现了节点文本的分行显示,可以使得节点名称更加清晰地呈现在SVG图形中。
相关问题
vue横向树结构svg
要实现横向树结构的SVG,可以使用d3.js这个强大的JavaScript库。具体步骤如下:
1. 安装d3.js。可以通过npm安装,也可以通过CDN引入。
2. 准备数据。横向树结构的数据应该是一个树形结构,每个节点包含自身的id、名称、父节点id,以及子节点数组。
3. 创建SVG元素。使用d3.js的select和append方法创建SVG元素,并设置宽高。
4. 创建布局。使用d3.js的tree布局,设置方向为从左到右。
5. 绑定数据。使用d3.js的datum和data方法,将数据绑定到SVG元素上。
6. 绘制节点和连线。使用d3.js的append、attr、enter和exit等方法,绘制节点和连线。
7. 设置样式。使用CSS设置节点和连线的样式。
8. 完成。现在你已经成功地绘制出了横向树结构的SVG图形。
下面是一个简单的示例代码:
```javascript
//准备数据
const data = {
id: 1,
name: 'root',
parentId: null,
children: [
{
id: 2,
name: 'child 1',
parentId: 1,
children: []
},
{
id: 3,
name: 'child 2',
parentId: 1,
children: [
{
id: 4,
name: 'grandchild 1',
parentId: 3,
children: []
}
]
}
]
};
//创建SVG元素
const svg = d3.select('#chart')
.append('svg')
.attr('width', 800)
.attr('height', 400);
//创建布局
const treeLayout = d3.tree().size([300, 500]).separation((a, b) => (a.parent == b.parent ? 1 : 2) / a.depth);
//绑定数据
const root = d3.hierarchy(data);
const treeData = treeLayout(root);
//绘制节点
const nodes = svg.selectAll('.node')
.data(treeData.descendants())
.enter()
.append('g')
.attr('class', 'node')
.attr('transform', (d) => `translate(${d.y}, ${d.x})`);
nodes.append('circle')
.attr('r', 10);
nodes.append('text')
.text((d) => d.data.name)
.attr('x', 20);
//绘制连线
const links = svg.selectAll('.link')
.data(treeData.links())
.enter()
.append('path')
.attr('class', 'link')
.attr('d', d3.linkHorizontal()
.x((d) => d.y)
.y((d) => d.x));
//设置样式
svg.selectAll('circle')
.style('fill', '#fff')
.style('stroke', '#333')
.style('stroke-width', '2px');
svg.selectAll('.link')
.style('fill', 'none')
.style('stroke', '#333')
.style('stroke-width', '2px');
```
需要注意的是,上述代码只是一个示例,实际应用中需要根据具体情况进行调整和优化。
有一个多层NODES节点嵌套的json文件,主要是文本数据,NODES嵌套属性NAME和NODE,NODE中又重新嵌套NAME和NODES,想要取 出里面的所有的NODE节点,并且可视化成树状图的形式,就像一个族谱一样,圆形树状图最佳。
你可以使用d3.js来实现这个可视化效果。具体步骤如下:
1. 读取json文件,将数据转换成d3.hierarchy()数据格式。d3.hierarchy()可以将节点嵌套的数据转换成树形结构的数据。
2. 使用d3.tree()方法生成树形布局,设置节点之间的间隔、节点大小等属性。
3. 使用d3.select()选择一个容器,在其内创建svg元素,并设置svg的宽高。
4. 在svg元素内使用d3.tree()生成的布局数据添加节点和连线。
5. 对节点和连线进行样式设置,例如节点填充色、边框色、字体大小等。
下面是一个简单的示例代码:
```javascript
d3.json("data.json").then(function(data) {
var root = d3.hierarchy(data, function(d) { return d.NODES; });
var treeLayout = d3.tree().size([360, 500]);
treeLayout(root);
var svg = d3.select("#tree-container").append("svg")
.attr("width", 800)
.attr("height", 600);
var nodes = svg.selectAll(".node")
.data(root.descendants())
.enter()
.append("g")
.attr("class", "node")
.attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + d.y + ")"; });
nodes.append("circle")
.attr("r", 7)
.style("fill", "#fff")
.style("stroke", "#000");
nodes.append("text")
.attr("dy", ".31em")
.attr("x", function(d) { return d.x < 180 ? 8 : -8; })
.attr("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; })
.attr("transform", function(d) { return d.x < 180 ? null : "rotate(180)"; })
.text(function(d) { return d.data.NAME; });
var links = svg.selectAll(".link")
.data(root.links())
.enter()
.append("path")
.attr("class", "link")
.attr("d", function(d) {
return "M" + project(d.x, d.y)
+ "C" + project(d.x, (d.y + d.parent.y) / 2)
+ " " + project(d.parent.x, (d.y + d.parent.y) / 2)
+ " " + project(d.parent.x, d.parent.y);
});
function project(x, y) {
var angle = (x - 90) / 180 * Math.PI;
var radius = y;
return [radius * Math.cos(angle), radius * Math.sin(angle)];
}
});
```
需要注意的是,上述代码仅实现了简单的树形布局,可能需要根据你的json数据格式进行一些修改。同时,你也可以根据需要对节点和连线的样式进行更加复杂的设置。
阅读全文