javascript - D3.JS yScale 仅返回一个值的“未定义”
问题描述
我第一次使用 D3.js,我用这段代码绘制了一个条形图。
var dataset = [20, 55, 30, 40, 50, 35, 97, 75, 100, 45];
var w = 500;
var h =100;
var xScale = d3.scaleBand()
.domain(d3.range(dataset.length))
.rangeRound([0,w])
.paddingInner(0.05);
var yScale = d3.scaleBand()
.domain(d3.range(d3.max(dataset)))
.rangeRound([0,h]);
var svg = d3.select("#chart")
.append("svg")
.attr("width", w)
.attr("height", h);
svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x", function(d,i) {
return xScale(i);
})
.attr("y",function(d){console.log(yScale(d)); return h - yScale(d);})
.attr("width", xScale.bandwidth())
.attr("fill", function(d) {if(d<50) { return "blue" }
else if (d>=50) { return "red" }; })
.attr("height", function(d){return yScale(d);
});
但我得到了这个结果: 结果
我无法理解为什么我会为一个特定的值得到“未定义”。
解决方案
问题在于 yScale 域,并使用 d3.range 设置域。
d3.range(100) 创建一个包含 100 个元素的数组,其值从 0 到 99。因此,当您尝试获取 yScale(100) 时,“100”不在域中。
对于您的数据,您建议使用线性比例,例如
var yScale = d3.scaleLinear()
.domain([0, d3.max(dataset)])
.rangeRound([0,h]);
或者如果需要使用 d3.range,将元素数量设置为 1 + 最大值,例如:
var yScale = d3.scaleRange()
.domain(d3.range(d3.max(dataset) + 1))
.rangeRound([0,h]);
推荐阅读
- xslt - 如何将具有自迭代嵌套复杂元素的xml转换为平面结构
- r - 在 plotly 中将文本添加到 3D 绘图
- java - “ResultSet 未正确定位”调用 .next() 但仍然无法正常工作,请指教?
- javascript - 如何通过jQuery重定向到html中附加的href?
- python - 具有公平发散色图的不对称色条
- python - Dask DataFrame 计算多列分组中的平均值
- java - 如何使用 Java 和 Hibernate 将空数组列表添加到 PSQL 数据库?
- excel - 将多行工作簿复制到一个主工作簿中
- python - 与使用 doc2vec 模型的文档相比,如何计算一个或几个单词的相似度?
- javascript - 请求解决时钟指针每 2 小时跳动 1 小时的问题。希望它通过钟面平稳运行