4

次のような単純なグラフが必要です。

財務グラフ

私が持っているデータは、2 つのプロパティを持つトランザクションの単純なリストです。

  • タイムスタンプ

d3.layout.histogram().bins() を試しましたが、トランザクションのカウントのみをサポートしているようです。

それを探しているのは私だけではないはずですよね?

4

2 に答える 2

8

わかりましたので、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

これが誰かに役立つことを願っています!

于 2013-10-17T18:20:34.177 に答える