d3.js缩放/域值的意外行为
Unexpected behaviour of d3.js Scale / Domain Values
很抱歉,但我已经花了大约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())
我得到了我所期望的,例如来自数据集的密钥:
["情景1"、"情景2"、"场景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
您的问题就在这里:返回z(i)
您应该传递场景名称("场景1"、"场景2"…),而不是i(0,1,2)
如何获取场景名称?如果没有工作的jfiddle或看到mapsorted数组(或其映射版本)的内容,就很难猜测
好的,谢谢你,我试着投票等,但似乎没有足够的分数。。。(顺便说一句,我在StackOverflow上花了大量时间,总是想投票选出有用的答案——如果可以的话,那就太好了)。
tato基本上是正确的,我需要传递值,而不是域的索引位置。。。我有效地处理了一个独立于数据集的域值,所以它与无关
解决方案:
为包含场景名称的"层"添加一个值(场景1,…)
var layers = d3.layout.stack()(element.map(function(c) {
return datasorted.map(function(d) {
return {x: d.xAxisD, y: d[c], z: c };
});
}));
使用此设置域(而不是原始数据集):
z.domain(layers.map(function(d, i) { return d[i].z; }));
然后在创建条形图颜色和图例时,使用"图层"数据集的值来匹配域值:
var layer = svg.selectAll(".layer")
.data(layers)
.enter()
.append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(d[i].z) ; });
legend.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", function(d, i) { return z(d); });
正如tato所说,基本上这是为了确保数据包含对域的适当引用。
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- "未捕获的语法错误:意外的标记"角度JS
- 在意外断电时恢复JS计时器
- DynamoDB和Node Js:意外的令牌h
- 获取意外的令牌ILLEGAL JS错误
- 从Babel 5.8.35升级到6.0.0将不会编译带有SyntaxError和意外标记的app.js
- HTML 无法识别我要求它运行的 javascript 文件,语法错误:意外的令牌“<”(匿名函数)script.js:
- 在 JS 中短路空数组会产生意外结果:“[] ||真 == []'
- Chrome vs JS:未捕获的语法错误:意外的令牌)
- Underscore.js:具有_.object函数的意外行为
- 清除输入字段值-STCombobox时出现意外的JS行为
- 提高网络速度并连接到node.js服务器时出现意外行为
- js文件的第1行出现意外的输入结束错误
- Uglify JS错误:意外字符''连接时,请缩小select2
- AngularJS angular.js:12520 SyntaxError:意外的令牌ILLEGAL附属窗口
- 如何删除列表项angular??angular.js:12416语法错误:意外的令牌u
- Node.js 中意外的 vm.runInThisContext 控制流
- 节点.js未定义:1 [语法错误:输入意外结束]
- 在文件中执行 IIFE 时出现意外输出.js