Как добавить отдельную подсказку в стиле аннотации для маркера Highcharts? - PullRequest
0 голосов
/ 15 января 2019

Необходимо добавить отдельную подсказку для маркера точки.

Я использую перекрестие для отображения всплывающей подсказки в Highcharts. Также для некоторых точек данных серии я добавляю маркер (в желтом кружке). Я хочу знать, возможно ли иметь настраиваемую всплывающую подсказку при наведении конкретно на точке маркера, но я также хотел бы сохранить нормальное поведение всплывающей подсказки с перекрестием в той же точке (т. Е. При наведении курсора за пределы области желтого маркера для тех же данных точка, всплывающая подсказка должна учитывать форматер всплывающей подсказки и при наведении курсора точно на подсказку маркера должен отображаться другой текст, связанный с маркером). Возможно ли достичь?

[Мое намерение состоит в том, чтобы создать перемещаемый маркер аннотации, но в то же время сохранить поведение всплывающей подсказки по умолчанию для той же точки]

Пожалуйста, смотрите изображения ниже, чтобы получить представление об ожидаемом поведении. Пожалуйста, игнорируйте данные серии, так как они генерируются динамически и отличаются при каждом обновлении страницы. Чего я хочу добиться, так это иметь всплывающую подсказку с перекрестием для точки данных '05 -Jan-2019 ', а также отображать другую выглядящую или настраиваемую подсказку, когда пользователь специально наводит курсор на желтый маркер для той же точки данных.

Любые предложения, касающиеся альтернативных способов достижения этого, также приветствуются.

Вот как я добавляю маркер в данные моей серии:

function formatSeriesData(allSeries, annotations, categories) {
    for (let i = 0; i <= allSeries.length; i++) {

        let serie = allSeries[i];
        if (serie && !serie['color']) {
            serie = {
                ...serie,
                color: defaultColors[i]
            }
            allSeries[i] = serie;
        }

        //add annotations - if present
        if (serie && annotations && annotations.length) {
            const applicableAnnotations = _.filter(annotations, {
                name: serie.name
            });
            const annotationDates = _.map(applicableAnnotations, 'date'); //get all annotation dates
            let modifiedDataArray = [];
            let dataArray = serie.data; //get all series data
            for (let j = 0; j < dataArray.length; j++) {
                let dateForValue = categories[j]; //get the date corresponding to the value
                let annotation = _.find(applicableAnnotations, {
                    date: dateForValue
                });; //pick the annotation object
                let ptObj = {
                    dimension: "",
                    y: dataArray[j]
                };
                if (annotation && annotation.annotation) {
                    ptObj["marker"] = {
                        enabled: true,
                        radius: 6,
                        fillColor: '#FDBE2C',
                        symbol: 'circle'
                    };
                }
                modifiedDataArray.push(ptObj);
            }
            serie = {
                ...serie,
                data: modifiedDataArray
            }
            allSeries[i] = serie;
        }
    }
    console.log("allSeries ", allSeries);
    return allSeries;
}

enter image description here

enter image description here

1 Ответ

0 голосов
/ 15 января 2019

Для достижения желаемого результата вы можете создать диаграмму из двух серий - line с отключенными enableMouseTracking и scatter с подсказкой по умолчанию и событиями мыши для управления отображением перекрестия:

Highcharts.chart('container', {
    series: [{
        data: [1, 2, 3, 4],
        enableMouseTracking: false
    }, {
        color: 'yellow',
        events: {
            mouseOver: function() {
                this.xAxis.update({
                    crosshair: {
                        width: 0,
                        label: {
                            enabled: false
                        }
                    }
                });
            },
            mouseOut: function() {
                this.xAxis.update({
                    crosshair: {
                        width: 1,
                        label: {
                            enabled: true
                        }
                    }
                });
            }
        },
        marker: {
            radius: 8,
            symbol: 'circle'
        },
        stickyTracking: false,
        data: [{
            x: 2,
            y: 3
        }]
    }],
    xAxis: {
        crosshair: {
            label: {
                enabled: true
            },
            snap: false
        }
    }
});

Демонстрация в реальном времени: http://jsfiddle.net/BlackLabel/k83u0spd/

Справочник по API:

https://api.highcharts.com/class-reference/Highcharts.Axis#update

https://api.highcharts.com/highcharts/series.line.enableMouseTracking

https://api.highcharts.com/highcharts/series.line.stickyTracking

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...