Я использую реактивную диаграмму для проекта.И отображая две диаграммы: 1) Линейная диаграмма с данными двух серий, она отобразит две линии на одном графике.2) Столбчатая или столбчатая диаграмма.
Теперь, когда я наведу курсор на точку, должна быть включена всплывающая подсказка на обеих линиях на 1-м графике, а также на столбцовом графике.Ось X - это дата и время.Он должен активировать точку на обеих линиях следующим образом:
В react-highchart
я использовал атрибут shared: true
, но он не делает обалинии активны.
tooltip: {
enabled: true,
useHTML: true,
shared: true,
backgroundColor: 'rgba(255,255,255,1)',
borderRadius: 3,
shape: 'rectangle'
}
И есть ли способ сделать всплывающую подсказку другого графика активной?
РЕДАКТИРОВАТЬ
После предложения япроверял synchronized-charts в highcharts, но пример кода был в jQuery, он мне нужен в react-highcharts
.Тем не менее я попытался преобразовать код для реагирования и сделал это:
import ReactHighcharts from 'react-highcharts/ReactHighcharts';
/**
* Override the reset function, we don't need to hide the tooltips and
* crosshairs.
*/
ReactHighcharts.Highcharts.Pointer.prototype.reset = function reset() {
return undefined;
};
ReactHighcharts.Highcharts.Point.prototype.highlight = function highlight(event) {
event = this.series.chart.pointer.normalize(event);
this.onMouseOver(); // Show the hover marker
this.series.chart.tooltip.refresh(this); // Show the tooltip
this.series.chart.xAxis[0].drawCrosshair(event, this); // Show the
crosshair
};
После обратного вызова рендеринга диаграммы:
['mousemove', 'touchmove', 'touchstart'].forEach(eventType => {
const container = document.getElementById('tab__charts');
container.removeEventListener(eventType, this.handleMouseMove);
container.addEventListener(eventType, this.handleMouseMove);
});
Обработка перемещения мыши и syncExtreme:
handleMouseMove(e) {
for (let i = 0; i < ReactHighcharts.Highcharts.charts.length; i += 1) {
const chart = ReactHighcharts.Highcharts.charts[i];
if (chart) {
// Find coordinates within the chart
const event = chart.pointer.normalize(e);
// Get the hovered point
const point = chart.series[0].searchPoint(event, true);
if (point) {
point.highlight(e);
}
}
}
}
syncExtremes(e) {
const thisChart = this.chart;
if (e.trigger !== 'syncExtremes') { // Prevent feedback loop
ReactHighcharts.Highcharts.each(ReactHighcharts.Highcharts.charts, (chart) => {
if (chart !== thisChart) {
if (chart.xAxis[0].setExtremes) { // It is null while updating
chart.xAxis[0].setExtremes(
e.min,
e.max,
undefined,
false,
{ trigger: 'syncExtremes' },
);
}
}
});
}
}
Теперь, когда я наведите курсор мыши на точку, она выдаст ошибку:
Но как-то это сработало для второго графика, если я наведусь на точку второго графикапоказывает подсказку на обоих графиках.Не работает для первого графика.Плюс первый график имеет две серии.Я все ближе к решению.
РЕДАКТИРОВАТЬ 2: Решение Я понял, что вызывает синхронизацию всплывающих подсказок только при наведении курсора на вторую диаграмму.Это произошло из-за ошибки консоли, которая нарушала код (цикл For внутри handleMouseMove()
).Поэтому после помещения этой ошибки в try catch
проблема была устранена.
if (point) {
try {
point.highlight(e);
} catch (err) {
// pass;
}
}
Не лучшим образом, но это работает.Единственная проблема теперь состоит в том, что первый график имеет две строки серии (проверьте изображение выше), и только первый получает активный круг, а не второй.
РЕДАКТИРОВАТЬ 3: Решение для выделения нескольких серий.
После прочтения кода я нашел эту строку, из-за которой выделялась только первая серия:
point = chart.series[0].searchPoint(event, true)
эта строка принимает только первую серию.Плохой кодЭто должно быть:
chart.series.forEach(series => {
const point = series.searchPoint(event, true);
if (point) {
try {
point.highlight(e);
} catch (err) {
// pass;
}
}
});
Единственная проблема теперь заключается в этом try catch, без получения Can not read property category of undefined
.