道歉,但我已经大约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
答案 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所说。