我似乎无法弄清楚如何在重新排列排名数据时更新条形标签;基本上标签名称将保持不变,但其顺序会改变。d3.js排序数据后更新条形图标签
本来我有:
// University Names
labelsContainer = chart.append('g')
.attr('transform', 'translate(' + (uniLabel - barLabelPadding) + ',' + (gridLabelHeight + topMargin) + ')')
.selectAll('text')
.data(sortedData)
.enter()
.append('text')
.attr('x', xoffset)
.attr('y', yText)
.attr('stroke', 'none')
.attr('fill', 'black')
.attr("dy", ".35em") // vertical-align: middle
.attr('text-anchor', 'end')
.text(barLabel);
我不同的数据,我还是叫sortedData排序。图更新的矩形和休息成功...保存标签
在一个新的功能,我想(我有只有一个矩形条列):
// update University Names (this overwrites, however... I want to select the existing label instead of appending text on top of the original text)
labelsContainer = chart.append('g')
.attr('transform', 'translate(' + (uniLabel - barLabelPadding) + ',' + (gridLabelHeight + topMargin) + ')')
.selectAll('text')
.data(sortedData)
.enter() // using transition ... or selecting the group ... does not allow the new text to appear!
.append('text')
.attr('x', xoffset)
.attr('y', yText)
.attr('stroke', 'none')
.attr('fill', 'black')
.attr("dy", ".35em") // vertical-align: middle
.attr('text-anchor', 'end')
.text(barLabel);
这里的问题是这只是在现有的标签上添加新的(正确的)标签,而不是替换它们。
使用transition()我能够更新图形的其余部分,但不能更新标签。
任何想法如何解决?乐意为您提供更多信息/语境如果需要的话......
更新12/24:的jsfiddle:http://jsfiddle.net/myhrvold/BVB2d/
的jsfiddle显示过渡,但标签被覆盖:http://jsfiddle.net/myhrvold/BVB2d/embedded/result/
我知道,通过追加,我在覆盖;但在试图更换时,没有任何反应,原始文本仍然存在,所以这里的想法是,我表明我至少生成了正确的新标签并将它们放在正确的位置......只是我是而不是用我的原始标签替换它们...
你可以把你的代码放到jsfiddle来显示数据 –
你在'.selectAll('text')'前调用'chart.append('g')',它选择新容器中的'text'节点。试试'chart.select('g')'来选择'g'。虽然:你可能需要添加更多的类,以使其在图表内唯一可识别。 'g.univerity的标签,container'。 –
您必须在尝试更新标签时使用d3的“更新”选项。请参阅此[链接](http://bost.ocks.org/mike/join/)以获取详细的连接记录。您也可以在调用['.data()'](https://github.com/mbostock/d3/wiki/Selections#wiki-data)方法时指定'key'函数访问器。如果您需要更多帮助,请粘贴小提琴。 – jacquard