次のような単純なグラフが必要です。
私が持っているデータは、2 つのプロパティを持つトランザクションの単純なリストです。
- タイムスタンプ
- 額
d3.layout.histogram().bins() を試しましたが、トランザクションのカウントのみをサポートしているようです。
それを探しているのは私だけではないはずですよね?
次のような単純なグラフが必要です。
私が持っているデータは、2 つのプロパティを持つトランザクションの単純なリストです。
d3.layout.histogram().bins() を試しましたが、トランザクションのカウントのみをサポートしているようです。
それを探しているのは私だけではないはずですよね?
わかりましたので、IRC の人々が私を助けてくれましたnest
。
nested_data = d3.nest()
.key((d) -> d3.time.day(d.timestamp))
.rollup((a) -> d3.sum(a, (d) -> d.amount))
.entries(incoming_data) # An array of {timestamp: ..., amount: ...} objects
# Optional
nested_data.map (d) ->
d.date = new Date(d.key)
ここでのトリックd3.time.day
は、タイムスタンプを取得し、タイムスタンプが属する日 (夜の午前 12 時) を通知することです。この関数と などの他の関数は、d3.time.week
時系列を非常にうまくビン化できます。
もう 1 つのトリックは、によってグループ化された後、指定された のすべてのイベントを合計するnest().rollup()
関数です。key()
day
私が最後に望んでいたのは、取引がなかった日に空の値を補間することでした。これはコードの最後の部分です:
# 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
これが誰かに役立つことを願っています!