我试图使用this方法来获取最接近的y值,对于当前鼠标位置处的x值。D3 scale.invert()不是x的返回日期
我的数据集是这样的:
linedata = [{amount:100,date:'2015-11-2'},
{amount:-1000,date:'2015-11-3'},
{amount:5000,date:'2015-11-4'}
...
]
我有绘制精细的线图,而我只是如何scale.invert()
和工作平分玩。 创建平分功能:
var bisectDate = d3.bisector(function(d) { return d.date; }).left;
然后,再往下,绘制图形之后,还有我把在那里的图形绘制
graph.append("rect")
.attr("class", "overlay")
.attr("width", w)
.attr("height", h)
.on("mouseover", function() { focus.style("display", null); })
.on("mouseout", function() { focus.style("display", "none"); })
.on("mousemove", mousemove);
然后mousemove()
功能区域的矩形定义像这样:
function mousemove() {
var xPosition = xScale.invert(d3.mouse(this)[0]), //<-- give me the date at the x mouse position
closestElement = bisectDate(linedata, xPosition, 1), //<-- use the bisector to search the array for the closest point to the left and find that point given our mouse position
d0 = linedata[closestElement - 1]
d1 = linedata[closestElement],
d = xPosition - d0.date > d1.date - xPosition ? d1 : d0;
focus.attr("transform", "translate(" + xScale(+line_dateFormat.parse(d.date)) + "," + yScale(d.amount) + ")");
focus.select("text").text(d.amount);
};
我遇到的问题是,这条线在mouseover()
功能:
var xPosition = xScale.invert(d3.mouse(this)[0])
不返回日期,它返回一个数字,如矩形的像素宽度。下一行,平分线,不能这个数字比较的日期,所以最终总是为1。
我期待xPosition
是要么日期是这样的:
Sat Jul 19 2014 09:32:43 GMT+1000 (AEST)
Sat Jul 19 2014 07:28:21 GMT+1000 (AEST)
Sat Jul 19 2014 05:24:00 GMT+1000 (AEST)
Sat Jul 19 2014 03:50:43 GMT+1000 (AEST)
Fri Jul 18 2014 22:39:49 GMT+1000 (AEST)
Fri Jul 18 2014 14:53:27 GMT+1000 (AEST)
或像这样:
1446382800000
1446382800000
1446382800000
1446382800000
,但我发现这样的东西:
531.190359375
472.78146093749996
408.8622890625
358.1677734375
333.92257031249994
Obviou狡猾,我做错了,但我不明白为什么的基本原理。任何人都可以向我解释为什么即时获取数字而不是日期?
您从示例中更改了哪些内容?它在那里工作,所以它一定是你改变了的东西。 –
我的数据结构与示例不同。在这个例子中它是一个tsv文件。我以上面提到的形式将变量传递给模板。同样在此示例中,此处声明比例: var x = d3.time.scale() .range([0,width]); var y = d3.scale.linear() .range([height,0]); 以及后来添加的域: x.domain(...); y.domain(...); 而在我的我这一切在一个 变种xScale等= d3.time.scale() \t \t。域(...) \t \t .range([0,W]); VAR yScale = d3.scale.linear() \t \t。域([amount_min,amount_max]) \t \t .range([H,0]) \t \t .nice(); – Sebastian
您能否提供一个完整的示例,以便重现此问题? –