band-scale 에서 해당하는 x좌표의 data 를 가져오는 법
간략하게 설명하면, 현재 x좌표를 band 크기로 나눠서 index 를 구하고, 그 index 로 해당 data 를 가져온다. 그래서 그 좌표를 가지고 focus 를 해당 위치에 보여지게 한다.(cx
)
아래 코드에서는 x 좌표만 가지고 작업을 했다. 실제로는 y좌표 에 대한 처리도 필요하다. 자세한 코드는 ref. 2 를 참고하면 된다.
var width = 450;
var height = 450;
var data = [{date: '2020-10-10', value: 10}, {date: '2020-10-11', value: 12}];
var margin = {top: 10, right: 30, bottom: 30, left: 60}
var svg = d3.select("#my_chart")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
const xScale = d3.scaleBand()
.domain(data.map(d => d.date))
.range([0, width])
var focus = svg
.append('g')
.append('circle')
.style("fill", "none")
.attr("stroke", "black")
.attr('r', 8.5)
.style("opacity", 0)
// Create a rect on top of the svg area: this rectangle recovers mouse position
svg
.append('rect')
.style("fill", "none")
.style("pointer-events", "all")
.attr('width', width)
.attr('height', height)
.on('mousemove', () => {
// get the index of Band-scale
var eachBand = xScale.step();
var index = Math.round((d3.mouse(this)[0] / eachBand));
var selectedData = data[index];
focus.transition()
.duration('100')
.attr("r", 7)
.attr('cx', xScale(selectedData.date))
.attr('display', null)
})
.on('mousemove', mousemove)
.on('mouseout', mouseout);
댓글 없음:
댓글 쓰기