(这里是 D3 初学者)
我有以下片段:
// myShape (node) group
// NB: the function arg is crucial here! nodes are known by id, not by index!
myShape = myShape.data(nodes, function(d) { return d.nodeId; });
// update existing nodes (reflexive & selected visual states)
myShape.selectAll('circle')
.style('fill', function(d) { return (d === selected_node) ? d3.rgb(colors(d.nodeType)).brighter().toString() : colors(d.nodeType); })
.classed('reflexive', function(d) { return d.reflexive; });
// add new nodes
var g = myShape.enter().append('svg:g');
g.append('svg:circle')
.attr('r', 12)
但我想让它更灵活:我想使用圆形和多边形,而不是只使用圆形。这将在 d 中的属性中选择:
var d = [
{ nodeId: 1, nodeType : 'type1' , shape: 'circle' },
{ nodeId: 2, nodeType : 'type2' , shape: 'triangle' },
];
这意味着,取决于 d.shape。我必须设置“svg:circle”或“svg:polygon”,然后设置半径(对于圆)或点(对于多边形)。我试图像这样设置 svg 形状:
g.append(function (d) {
if (d.shape === 'circle' ) { return 'svg:circle'; }
else { return 'svg:polygon'; } } )
但这不起作用:我得到一个:
Uncaught Error: NotFoundError: DOM Exception 8
好像append
不接受一个函数?如何逐个节点设置 svg 形状?
编辑
我准备了这个jsbin来展示我想要做什么。