D3.js NVD3在多组图表中重用值

D3.js NVD3在多组图表中重用值,d3.js,nvd3.js,D3.js,Nvd3.js,有没有办法告诉NVD3/D3对第一个数据集使用的后续数据集使用相同的X值?看看下面的例子 var testdata = [ { "key" : "Quantity" , "bar": true, "values" : [ [ 1136005200000 , 1271000.0] , [ 1138683600000 , 1271000.0] , [ 1141102800000 , 1271000.0] , .... }, { "key" : "Price

有没有办法告诉NVD3/D3对第一个数据集使用的后续数据集使用相同的X值?看看下面的例子

var testdata = [
  {
    "key" : "Quantity" ,
    "bar": true,
    "values" : [ [ 1136005200000 , 1271000.0] , [ 1138683600000 , 1271000.0] , [ 1141102800000 , 1271000.0] , ....
  },
  {
    "key" : "Price" ,
    "values" : [ [ 1136005200000 , 71.89] ,     [ 1138683600000 , 75.51] ,     [ 1141102800000 , 68.49] , [....
  }
请注意,第一个坐标(我称之为x值)在第二个数据集中每次都是如何重复的。如果它对每个数据集使用相同的X值,为什么不重用它呢?这简直是浪费。特别是对于大量数据和许多数据集/组。或者也许有什么我看不到或不明白的。任何帮助都将不胜感激

示例数据片段取自

一般来说,您的问题的答案是否定的。D3的主要假设之一是数据定义了显示的内容。也就是说,数据是自包含的。如果要引用其他数据位,则违反此假设

也就是说,您可以有如下数据结构:

var testdata = {
  "time" : [ 1136005200000, 1138683600000, ... ],
  "values" : [{
    "key": "Quantity",
    "values": [ 1271000.0, 1271000.0, ... ]
  }, {
  ...
  }]
};
然后,您将能够定义这样的线生成器

var line = d3.svg.line()
             .x(function(d,i) { return xScale(testdata.time[i]); })
             .y(function(d) { return yScale(d); });
d3.selectAll("path").data(testdata.values)
  .enter().append("path")
  .attr("d", function(d) { return line(d.values); });
你会像这样使用它

var line = d3.svg.line()
             .x(function(d,i) { return xScale(testdata.time[i]); })
             .y(function(d) { return yScale(d); });
d3.selectAll("path").data(testdata.values)
  .enter().append("path")
  .attr("d", function(d) { return line(d.values); });
这样可以避免重复定义x值。缺点是您需要显式地索引到
testdata.time
,这使得代码更难维护,更不容易理解