如何使用d3.js对已装箱的时间序列求和?
我想要一个简单的图形,如: 我拥有的数据是一个简单的事务列表,其中包含两个属性:如何使用d3.js对已装箱的时间序列求和?,d3.js,D3.js,我想要一个简单的图形,如: 我拥有的数据是一个简单的事务列表,其中包含两个属性: 时间戳 数量 我尝试了d3.layout.histogram().bins(),但它似乎只支持计算事务 我一定不是唯一一个在寻找它的人,是吗?直方图代码不支持这一点,但你可以自己轻松地进行分类。假设你有一个日期和每个交易的计数,你可以像这样按天分类 var bins = {}; transactions.forEach(function(t) { var key = t.date.toDateStri
- 时间戳
- 数量
我一定不是唯一一个在寻找它的人,是吗?直方图代码不支持这一点,但你可以自己轻松地进行分类。假设你有一个日期和每个交易的计数,你可以像这样按天分类
var bins = {};
transactions.forEach(function(t) {
var key = t.date.toDateString();
bins[key] = bins[key] || 0;
bins[key] += t.amount;
});
如果需要,可以将日期字符串解析回日期;这里使用
.toDateString()
的要点是,时间部分被截断,所有东西都按天分类。如果你想按另一个时间间隔进行装箱,你可以使用相同的技术提取日期的不同部分。好的,所以IRC的人帮我指出并指向nest
,这很有效(这是CoffeeScript):
这里的诀窍是d3.time.day,它获取时间戳,并告诉您时间戳属于哪一天(晚上12点)。此函数和其他函数,如d3.time.week
等。。我能很好地理解时间序列
另一个技巧是nest().rollup()
函数,它在按key()
分组后,对给定天的所有事件求和
我最不想做的就是在没有交易的日子里插入空值。这是代码的最后一部分:
# Interpolate empty vals
nested_data.sort((a, b) -> d3.descending(a.date, b.date))
ex = d3.extent(nested_data, (d) -> d.date)
each_day = d3.time.days(ex[0], ex[1])
# Build a hashmap with the days we have
data_hash = {}
angular.forEach(data, (d) ->
data_hash[d.date] = d.values
)
# Build a new array for each day, including those where we didn't have transactions
new_data = []
angular.forEach(each_day, (d) ->
val = 0
if data_hash[d]
val = data_hash[d]
new_data.push({date: d, values: val})
)
final_data = new_data
希望这对别人有帮助 是的,这其实是一个快速的方法。我可能会在这里使用d3.time.day
而不是toDateString()。。所以我可以通过使用d3.time.week来轻松地切换到不同的箱子大小。
# Interpolate empty vals
nested_data.sort((a, b) -> d3.descending(a.date, b.date))
ex = d3.extent(nested_data, (d) -> d.date)
each_day = d3.time.days(ex[0], ex[1])
# Build a hashmap with the days we have
data_hash = {}
angular.forEach(data, (d) ->
data_hash[d.date] = d.values
)
# Build a new array for each day, including those where we didn't have transactions
new_data = []
angular.forEach(each_day, (d) ->
val = 0
if data_hash[d]
val = data_hash[d]
new_data.push({date: d, values: val})
)
final_data = new_data