2012-09-26 47 views
2

我是一名d3初學者,我很遺憾承認我在構造兩個數組的交叉乘積時遇到了問題。我實際上正在與立體派合作,做一些非常簡單的事情:爲每種類型製作一些聚合物。立體主義,d3數據加入

我嘗試:

var aggs = [ 
    {title: 'mean', metric: function(d) { return cube.metric("sum(" + d + (value))").divide(cube.metric("sum(" + d + ")")); }}, 
    {title: 'count', metric: function(d) { return cube.metric("sum(" + d + ")").divide(step/1e3); }} 
] 

d3.json(origin + "/1.0/types", function(types) {  
    d3.select("body").insert("div", ".bottom") 
    .attr("class", "group") 
    .selectAll(".typegrp") 
    .data(types) 
    .enter() 
    .append("div") 
    .attr("class", "typegrp") 
    .selectAll("div") 
    .data(aggs) 
    .enter() 
    .append("div") 
    .attr("class","horizon") 
    .call(context.horizon() 
     .title(function(d) { return d.title; }) 
     .metric(function(d) { return d.metric(FOOOO); }) 
    ); 
}); 

我不明白的部分是 「FOOOO」 的一部分。從'內部'上下文('aggs'中的行),我如何訪問'外部'上下文('類型'中的行)?

在此先感謝。

編輯:這裏是一個完整的工作示例,如下面的尼克建議的。

var aggs = [ 
      {title: 'mean', metric: function(d) { return cube.metric("sum(" + d + "(value))").divide(cube.metric("sum(" + d + ")")); }}, 
      {title: 'sum', metric: function(d) { return cube.metric("sum(" + d + "(value))"); }}, 
      {title: 'count', metric: function(d) { return cube.metric("sum(" + d + ")"); }}, 
      {title: 'max', metric: function(d) { return cube.metric("max(" + d + "(value))"); }}, 
      {title: 'min', metric: function(d) { return cube.metric("min(" + d + "(value))"); }} 
     ] 

d3.json(origin + "/1.0/types", function(types) {  
    d3.select("body") 
    .insert("div", ".bottom") 
    .attr("class", "group") 
    .selectAll(".typegrp") 
    .data(types) 
    .enter() 
    .append("div") 
    .attr("class", "typegrp") 
    .each(function(type) { 
     d3.select(this) 
     .selectAll("div.horizon") 
     .data(aggs) 
     .enter().append("div") 
     .attr("class","horizon") 
     .each(function(agg) { 
      d3.select(this) 
      .call(context.horizon() 
       .title(agg.title + " " + type) 
       .metric(agg.metric(type)) 
      ); 
     }); 
    }); 
}); 
+1

「我不明白的部分是」FOOOO「部分。」 - 這是一個非常棒的引用:) – nrabinowitz

回答

2

我沒有使用過立體主義,但我認爲有兩個選項:

  1. 容易的選擇,如果你真的只有兩個彙總指標 - 不要做一個數據連接,只需分別添加它們。

    var typeGroups = d3.select("body").insert("div", ".bottom") 
        .attr("class", "group") 
        .selectAll(".typegrp") 
        .data(types); 
    
    typeGroups.enter() 
        .append("div") 
        .attr("class", "typegrp"); 
    
    typeGroups 
        .append("div") 
        .attr("class","horizon") 
        .call(context.horizon() 
         .title('mean') 
         .metric(function(d) { return cube.metric(...); }) 
        ); 
    
    typeGroups. 
        .append("div") 
        .attr("class","horizon") 
        .call(context.horizon() 
         .title('count') 
         .metric(function(d) { return cube.metric(...); }) 
        ); 
    
  2. 稍硬的選擇 - 加入內.each呼叫AGGS陣列:

    typeGroups.enter() 
        .append("div") 
        .attr("class", "typegrp") 
        .each(function(type) { 
         d3.select(this).selectAll("div.horizon") 
          .data(aggs) 
          .enter().append("div") 
          .attr("class","horizon") 
          .each(function(agg) { 
           d3.select(this) 
            .call(context.horizon() 
             .title(agg.title) 
             .metric(agg.metric(type)) 
            ); 
          }); 
        }); 
    

    這給了你在你打電話context.horizon()的時間訪問到type變量。

+0

太棒了!我試圖做,而不使用each(),因爲邁克似乎[建議](http://bost.ocks.org/mike/join/),我可以做到沒有每個。你的第二個解決方案正是我所摸索的。我會用一個完整的工作示例編輯原文,以防有人想看到它。 –