有没有办法根据不同的数据向我的力导向图中添加不同的形状?
Is there a way to add different shapes depending on different data to my force-directed graph?
我确定这里的另一个问题已经涵盖了这个问题,但是,在我的代码上尝试了许多不同的示例之后,我似乎无法让它工作。
我试图根据节点的名称使我的力导向图上的节点具有不同的形状,例如,如果节点名为 'Switch',它应该显示为正方形。
我已经根据数据制定了更改节点颜色的设置,并且想要类似的形状,但无法使用 d3.v4 使其工作。
有什么帮助吗?
var color = d3.scaleOrdinal(d3.schemeCategory10);
var shape = d3.symbolTypes;
var node = g.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(graph.nodes)
.enter().append("circle")
.attr("r", 15)
.attr("fill", function(d) { return color(d.group); })
.attr("d", d3.symbol()
.type(function (d) { return shape(d.name);}))
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
非常感谢
王菲
您不能使用:
var shape = d3.symbolTypes;
....
shape(d.name);
因为 d3.symbolTypes
在 d3 v4 中没有定义(它在 v3 的某些版本中),在 v4 中使用 d3.symbols
这是一个数组而不是函数。
但是,与颜色一样,您可以为形状创建序数标度:
var color = d3.scaleOrdinal(d3.schemeCategory20);
var shape = d3.scaleOrdinal(d3.symbols);
现在您所要做的就是附加该形状:
.append('path')
.attr("d", d3.symbol().type( function(d) { return shape(d[property]);} ) );
由于您添加了圆圈,现在添加了路径,因此您需要更改 .append('circle')
,并且由于圆圈具有 cx
cy
个元素,因此您需要更改为设置位置的变换。
这是一个bl.ock which should show this in practice, based on MBostock's force directed graph (here)
请记住 d3.symbols
数组中只有七个形状。
编辑:
如果您想根据 属性 指定为每个节点显示哪些形状(而不是让序数比例设置形状),您可以向包含名称的数据添加 属性形状(例如:d3.symbolCross
),或创建一个函数,它接收一个数据值并输出一个符号的名称。但是序数量表是最简单的。
我确定这里的另一个问题已经涵盖了这个问题,但是,在我的代码上尝试了许多不同的示例之后,我似乎无法让它工作。
我试图根据节点的名称使我的力导向图上的节点具有不同的形状,例如,如果节点名为 'Switch',它应该显示为正方形。
我已经根据数据制定了更改节点颜色的设置,并且想要类似的形状,但无法使用 d3.v4 使其工作。
有什么帮助吗?
var color = d3.scaleOrdinal(d3.schemeCategory10);
var shape = d3.symbolTypes;
var node = g.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(graph.nodes)
.enter().append("circle")
.attr("r", 15)
.attr("fill", function(d) { return color(d.group); })
.attr("d", d3.symbol()
.type(function (d) { return shape(d.name);}))
.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended));
非常感谢
王菲
您不能使用:
var shape = d3.symbolTypes;
....
shape(d.name);
因为 d3.symbolTypes
在 d3 v4 中没有定义(它在 v3 的某些版本中),在 v4 中使用 d3.symbols
这是一个数组而不是函数。
但是,与颜色一样,您可以为形状创建序数标度:
var color = d3.scaleOrdinal(d3.schemeCategory20);
var shape = d3.scaleOrdinal(d3.symbols);
现在您所要做的就是附加该形状:
.append('path')
.attr("d", d3.symbol().type( function(d) { return shape(d[property]);} ) );
由于您添加了圆圈,现在添加了路径,因此您需要更改 .append('circle')
,并且由于圆圈具有 cx
cy
个元素,因此您需要更改为设置位置的变换。
这是一个bl.ock which should show this in practice, based on MBostock's force directed graph (here)
请记住 d3.symbols
数组中只有七个形状。
编辑:
如果您想根据 属性 指定为每个节点显示哪些形状(而不是让序数比例设置形状),您可以向包含名称的数据添加 属性形状(例如:d3.symbolCross
),或创建一个函数,它接收一个数据值并输出一个符号的名称。但是序数量表是最简单的。