이 글에서는 Highchart에서 지원하지 않는 마우스 drag로 point를 선택하는 방법을 알아봅시다.
Highchart의 기본 기능에는 chart의 background를 drag 하는 기능이 없습니다.
이를 구현하려면 drag를 지원하는 다른 기능을 변형하여 사용하여야 하는데
Zoom 의 기능과 selection event 가 우리가 원하는 multi selection을 기능을 구현하는데 가장 적합합니다.
우선 ZoomType을 'xy'로 설정합니다. 이를 통해 x,y 축 영역을 다 활용하여 drag 를 적용할 수 있습니다.
또한 chart event의 selection 이벤트를 정의 합니다.
구현하면 다음과 같습니다.
this.chart = Highcharts.chart({
chart: {
renderTo: 'chart-line',
type: 'line',
},
events: {
selection: (e: any) => this.selectPointsByDrag(e)
},
zoomType: 'xy',
series: [
{ data: [10, 5, 0, -5, -10, -15, -10, -10, -5, 0, 5] },
]
});
이제 함수를 구현해 봅시다. 구현 방식은 다음과 같습니다.
selecPointsByDrag(e: any) {
let group: any[] = [];
for(let series of e.target.series) {
let list = [];
for(let point of series.points) {
if (point.x >= e.xAxis[0].min && point.x <= e.xAxis[0].max &&
point.y >= e.yAxis[0].min && point.y <= e.yAxis[0].max) {
// console.log(point.options)
list.push([point.options?.name ? point.options.name : point.options.x, point.options.y]);
}
}
group.push(list);
}
/*
* 여기에 select 한 이후에 처리할 코드가 들어가야 함
*/
return false;
}
만일 return false; 항목을 제거하고 실행하면 selection이 실행되자마자 곧바로 zoom이 실행되는 것을 볼 수 있습니다.
즉, return false; 는 zoom 기능을 동작하지 않도록 막아주는 중요한 역할을 합니다.
Highchart는 기본에 충실한 차트입니다. 이 말은 차트가 지원하는 기본 기능은 매우 안정적으로 동작한다는 의미이기도 하지만, 많은 기능이 구현되어 있지 않고 커스텀하기에 쉽지 않다는 의미이기도 합니다.
하지만, 여러 커뮤니티를 통해 많은 개발자들이 구현한 내용이 있으므로 이를 잘 활용하면 확장된 좋은 차트를 구현할 수 있을 것입니다.