我正在尝试随着基础数据的更改更新带有转换的堆叠条形图。它每次都调用相同的“渲染”函数,并且在不涉及转换时运行良好。但是,我想为值的变化设置动画,从当前状态过渡到下一个状态。
我已经在一定程度上解决了这个问题,但感觉我的解决方案很笨拙——希望有更好的方法来处理堆积条形图。
我的方法是执行以下操作:
- 加载数据
- 加载初始条件(转换要求)
- 加载最终条件(在转换内)
- 将当前数据复制到另一个数组中:prevData
- 间隔后重新加载数据
使用上述方法,如果 prevData 有值,则使用这些值来设置初始条件。我的问题是查找和设置初始条件感觉非常笨拙:
if (prevData.length > 0) {
//get the parent key so we know who's data we are now updating
var devKey = d3.select(this.parentNode).datum().key;
//find the data associated with its PREVIOUS value
var seriesData = seriesPrevData.find(function (s) { return (s.key == devKey); })
if (seriesData != null) {
//now find the date we are currently looking at
var day = seriesData.find(function (element) { return (element.data.Date.getTime() == d.data.Date.getTime()); });
if (day != null) {
//now set the value appropriately
//console.debug("prev height:" + devKey + ":" + day[1]);
return (y(day[0]) - y(day[1]));
}
}
}
我所做的只是找到正确的键数组(由 d3.stack() 创建),然后尝试找到适当的先前数据条目(如果存在)。但是,搜索父节点和搜索数组以找到所需的键和适当的数据元素感觉非常冗长。
所以,我的问题是,有没有更好的方法来做到这一点?还是其中的一部分?
- 查找与此元素关联的先前绑定的数据值或在函数内更改之前的当前值。
- 找到正在更新的当前密钥的更好方法,而不是使用: d3.select(this.parentNode)... ?我尝试过传递键值,但似乎没有正确。我取得的最好成绩是将一个关键函数传递给父级,并以上述方式查找它。
很抱歉这篇长文,我花了一整天的时间来制定我的解决方案,因为我真正需要的只是一个项目的先前值而感到沮丧。必须做所有这些“体操”来获得我需要的东西似乎非常“不” D3.js 喜欢:-)
谢谢