使用D3.js从单个数据点生成多个DOM元素
Generating multiple DOM elements from a single data point with D3.js
假设我有这样的数据:
[{from: 3, to: 5}, {from: 1, to: 2}]
我想生成以下SVG:
<svg width="100" height="100">
<g transform="translate(0,0)">
<rect x="0" width="5" height="5"></rect>
<rect x="10" width="5" height="5"></rect>
<rect x="20" width="5" height="5"></rect>
</g>
<g transform="translate(0,30)">
<rect x="0" width="5" height="5"></rect>
<rect x="10" width="5" height="5"></rect>
</g>
</svg>
基本上,对于每个数据点,我都必须生成to - from + 1
矩形。我就是这样开始的:
var width = 100;
var x = d3.scale.ordinal()
.domain(d3.range(10))
.rangeRoundBands([0, width]);
var svg = d3.select('svg').append('svg')
.attr('width', width)
.attr('height', 100);
var row = svg.selectAll('g')
.data(data)
.enter().append('g')
.attr('transform', function(d, i) { return 'translate(0,' + i * 30 + ')';});
现在,如何使用链语法为每个数据点生成多个rect?
我知道我可以这样做:
var rects = row.selectAll('rect')
.data(function(d) { return d3.range(d.to - d.from + 1);})
但我希望避免创建无用的数组。
您可以在append()
函数中迭代,并在那里动态创建rect:
var data = [{from: 3, to: 5}, {from: 1, to: 2}, {from: 4, to: 9}];
var width = 100;
var x = d3.scale.ordinal()
.domain(d3.range(10))
.rangeRoundBands([0, width]);
var svg = d3.select('div').append('svg')
.attr('width', width)
.attr('height', 100);
var row = svg.selectAll('g')
.data(data)
.enter().append(function(d) {
var rects = document.createElementNS('http://www.w3.org/2000/svg', 'g');
for (var i = d.from; i <= d.to; i++) {
var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
rect.setAttribute('width', 5);
rect.setAttribute('height', 5);
rect.setAttribute('x', (i - d.from) * 10);
rects.appendChild(rect);
}
return rects;
})
.attr('transform', function(d, i) {
return 'translate(0,' + i * 30 + ')';
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div></div>
相关文章:
- 如何在DOM元素上按类型构建此函数
- DOM元素和angular元素之间的主要区别是什么
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- 使用jquery创建dom元素会导致ie9出现拒绝访问错误
- 如何在使用Ractive.extend()时引用DOM元素
- 在d3中向DOM元素添加了图像,但现在它赢得了't过渡
- 如何'剪切'DOM元素并将其显示在其他位置
- 转换<a>使用jQuery将文本字符串转换为dom元素
- d3在数据更新时错误地附加了dom元素
- 访问VueJS中的DOM元素
- 在Meteor中如何查找DOM元素(渲染后)
- IE9-添加和删除DOM元素会破坏父keydown事件
- 未捕获错误:元素缓存中id为x的DOM元素与DOM中的元素不同
- 在 ng-if 编译后访问指令中的 DOM 元素
- spin.js/angular spinner:如何将spin定位到DOM元素中(包括plunker演示)
- 如何在dom元素中插入输入标记数据插件
- Mobile Safari、jQuery以及绑定到未来的DOM元素
- 从字符串创建dom元素时添加多个类
- 如何根据客户端的屏幕大小使用javascript更改DOM元素
- 为onClick-hander插入临时DOM元素