如何在 d3.layout.pack 图形中居中根节点圆圈
How to center root node circle in a d3.layout.pack graph?
我正在将这里的d3.layout.pack图形示例重构为可重用的模块。但是,根节点不再位于中心 - 我找不到罪魁祸首。
这是该应用程序的jsfiddle演示:
d3.visio.clustering = function module(){
var width = 700,//default width
height= 500;//default height
var svg;
//takes a DOM container or an array of DOM containers
function exports(_selection){
console.log(_selection);
_selection.each(function(_data){
var r = Math.min(width, height) - 10;
var x = d3.scale.linear().range([0, r]),
y = d3.scale.linear().range([0, r]),
node,
root;
var pack = d3.layout.pack()
.size([r, r])
.value(function(d) { return d.size; });
//if the svg element is already defined, don't define it again
if(!svg){
svg = d3.select(this).append("svg:svg");
}
svg.attr("width", width)
.attr("height", height)
.append("svg:g")
.attr("transform", "translate(" + (width - r) / 2 + "," + (height - r) / 2 + ")");
node = root = _data;
var nodes = pack.nodes(root);
svg.selectAll("circle")
.data(nodes)
.enter().append("svg:circle")
.attr("class", function(d) { return d.children ? "parent" : "child"; })
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", function(d) { return d.r; })
.on("click", function(d) { return zoom(node == d ? root : d); });
svg.selectAll("text")
.data(nodes)
.enter().append("svg:text")
.attr("class", function(d) { return d.children ? "parent" : "child"; })
.attr("x", function(d) { return d.x; })
.attr("y", function(d) { return d.y; })
.attr("dy", ".35em")
.attr("text-anchor", "middle")
.style("opacity", function(d) { return d.r > 20 ? 1 : 0; })
.text(function(d) { return d.name; });
d3.select(window).on("click", function() { zoom(root); });
function zoom(d, i) {
var k = r / d.r / 2;
x.domain([d.x - d.r, d.x + d.r]);
y.domain([d.y - d.r, d.y + d.r]);
var t = svg.transition()
.duration(d3.event.altKey ? 7500 : 750);
t.selectAll("circle")
.attr("cx", function(d) { return x(d.x); })
.attr("cy", function(d) { return y(d.y); })
.attr("r", function(d) { return k * d.r; });
t.selectAll("text")
.attr("x", function(d) { return x(d.x); })
.attr("y", function(d) { return y(d.y); })
.style("opacity", function(d) { return k * d.r > 20 ? 1 : 0; });
node = d;
d3.event.stopPropagation();
}
});
}
//getter and setter for property width
exports.width = function(_x){
if(!arguments.length) return width;
width = parseInt(_x);
return this;//allow method chaining
}
//getter and setter for property height
exports.height = function(_x){
if(!arguments.length) return height;
height = parseInt(_x);
return this;//allow method chaining
}
//getter and setter for property radius = r
exports.radius = function(_x){
if(!arguments.length) return r;
r = parseInt(_x);
return this//allow method chaining
}
return exports;
};
var cluster = d3.visio.clustering()
.width(document.getElementById("vis").offsetWidth)
.height(document.getElementById("vis").offsetHeight);
d3.select('#vis')
.datum(data)
.call(cluster);
你能检查一下有什么问题吗?
代码中的问题是,您正在附加一个正确翻译的g
元素,但您将其他所有内容附加到未翻译的顶级svg
。要使其工作,您只需使用顶级g
重新分配svg
,即
svg = svg.append("g").attr("transform", "translate(" + ... + ")");
在这里完成 jsfiddle。
相关文章:
- Node Red在Admin UI中获取配置节点值
- 将文件从应用程序文件夹复制到JQM/Phonegap应用程序中的根文件夹
- 如何在Marionettejs中渲染根布局
- 在自定义截面树中获取父节点
- jquery在元素中查找文本节点,并使用标记进行连接和包装
- 获取docker容器中运行的节点应用程序的IP地址
- 如何从data.args中获取新建节点的id
- 如何以编程方式在 jsTree 中选择一个节点并打开所有父节点
- 在 JavaScript 中过滤 XML 节点
- 如何在 JStree 3 中显示叶节点的类似文件的图标
- 如何返回jQuery对象中的文本节点
- javascript中的根节点是什么
- 删除 JSON 中具有多个值的根节点
- 如何在 d3.layout.pack 图形中居中根节点圆圈
- jsTree :如何在 jsTree 中获取所选节点的 ID 到根节点
- 使用jquery查找xml中的根节点标记
- 如何在extjs4mvc中将根节点添加到树面板中
- 在JSON中向根节点及其所有子节点附加键值
- ExtJS 4 在树中隐藏根节点的问题
- 如何使用jQuery从视图模型中获取绑定根节点.blockUI上它,而AJAX张贴