我試圖使用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
您能否提供一個完整的示例,以便重現此問題? –