d3.js缩放/域值的意外行为

时间:2016-01-12 11:44:34

标签: javascript d3.js dns scale

道歉,但我已经大约5个小时了解这个并且无法解决正在发生的事情。我正在玩http://bl.ocks.org/mbostock网站上的一些示例,并尝试将图例添加到堆积条形图。

为此,我正在设置比例和范围:

var z = d3.scale.ordinal()
          .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

加载数据后我正在设置域名:

z.domain(d3.keys(datasorted[0]).filter(function(key) { return key !== "xAxisD"; }));

如果我此时控制日志......

console.log(z.domain().slice().reverse())

......我得到了我所期待的,例如来自数据集的密钥:

  

[" Scenario 1"," Scenario 2"," Scenario 3"]

然后我使用堆栈布局将数据修改为正确的格式:

  var layers = d3.layout.stack()(element.map(function(c) {
    return datasorted.map(function(d) {
    return {x: d.xAxisD, y: d[c]};
    });
  }));

在此之后,我将一些组添加到已创建的SVG中,其样式由作为' z'的一部分生成的颜色填充。规模:

var layer = svg.selectAll(".layer")
    .data(layers)
    .enter()
    .append("g")
        .attr("class", "layer")
        .style("fill", function(d, i) {  return z(i) ; });

现在我控制日志......

console.log(z.domain().slice().reverse())

......我的规模中有其他值:

  

[2,1,0,"场景1","场景2","场景3"]

与数据集中的场景有相同数量的附加值 - 例如它似乎使域名加倍。

我似乎无法在谷歌搜索中说出问题所以请转向StackOverflow寻求帮助。

提前致谢。

编辑 - 添加了数据的控制台日志:

[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
 0: Object
   Strategy 1: 7967144.750000002
   Strategy 2: 1925965.1996200003
   Strategy 3: 198181.8768
   xAxisD: "m01"
   __proto__: Object
 1: Object
 2: Object
 3: Object
etc

2 个答案:

答案 0 :(得分:1)

你的问题在这里:return z(i)

您应该传递方案名称("方案1","方案2" ...)而不是i(0,1,2)

如何获取方案名称?没有工作的jfiddle或看到你的maported数组的内容(或它的映射版本)很难猜测

答案 1 :(得分:0)

是的,谢谢你tato,我试图投票等等,但似乎没有足够的分数来做到这一点......(另外我在StackOverflow上花了大量时间,总是想投票给有用的答案 - 如果可以的话会很好。

tato本质上是正确的,我需要传递值而不是域的索引位置...我实际上使用的域值高于独立于数据集的域值,因此无法与之相关。

解决方案:

为'层添加值'其中包括方案名称(场景1,...)

print(' < '.join((str(1),str(2),str(3))))

使用它来设置域(而不是原始数据集):

var layers = d3.layout.stack()(element.map(function(c) {
    return datasorted.map(function(d) {
    return {x: d.xAxisD, y: d[c], z: c };
    });
}));

然后使用&#39;层中的值&#39;数据集在创建条形颜色和图例时匹配域值:

z.domain(layers.map(function(d, i) { return d[i].z; }));

基本上这是关于确保数据包含对域的适当引用,如tato所说。