【发布时间】:2017-10-25 21:12:06
【问题描述】:
在使用 d3 enter, update 模式时,我看到一些奇怪的转换行为。我创建了一组 (svg:g) 文本 (svg:text) 项目。当我最初使用.enter.append('g').attr('transform',function(d){...translate...} 创建组时,这些项目相对于 SVG 的顶部。但是,当我在窗口调整大小后更新组时,组是相对于它们最外层的容器的。
我的数据是一组嵌套的对象 (d3.nest)
var myData=[{
key:f,
values:[{
group:f,
text:'foo'
}]
},
{
key:b,
values:[{
group:'b',
text:'bar'
},{
group:'b',
text:'baz'
}]
}
.....
]
我的输入/更新模式是:
// EDIT Some JS to add shapes first
var shapeCont = d3.select('#shapesAtTheTop');
var shapes = shapeCont.selectAll('rect')
.data([50,50]);
shapes.exit().remove();
shapes.enter().append('rect')
.attr('width',function(d){return window.innerWidth*(d/100)})
.attr('x', function(d,i){return i*window.innerWidth*(d/100)})
.attr('y',0)
.attr('height',95);
// END EDIT
// Now add the text
var textgroupLeft = window.width/50, textGrouptop = 100;
function translateGroup(datum, i){
var x = textGroupLeft * i;
var y = textGroupTop;
return 'translate('+x+' '+y+')';
}
var textContainer = d3.select('g.textContainer');
var txtg = textContainer.selectAll('g').data(myData,function(d){return d.key;});
// UPDATE
txtg.attr('transform',translateGroup);
// REMOVE
txtg.exit().remove();
// NEW
txtg.enter().append('g')
.classed('textGroup',true')
.attr('transform',transelateGroup)
var txt = d3.selectAll('g.textGroup').selectAll('text')
.data(function(d){retrun d.values;},
function(dataum){return JSON.stringify(dataum);})
// REMOVE
.....
// UPDATE
.....
// NEW
.....
我的 HTML/SVG 是:
<svg>
<g id="shapesAtTop">
..... add polygons with positions in the first 100px high ....
</g>
<g id="textBelow" class="textContainer">
</g>
</svg>
是切换坐标系吗?如果是,为什么?
【问题讨论】:
-
var textgroupLeft = window.width/50: 你是在某处定义了 window.width 还是需要 window.innerWidth?
-
您在发布的代码中也有一些拼写错误,使用 retrun 和 transelateGroup 而不是 return 和 translateGroup 尽管您的代码运行我想它们在您的实际代码中不存在。
-
抱歉有错别字。我不得不在单独的工作站上重新输入。 Window.innerwidth 就是我的意思。
标签: javascript d3.js svg transform