Можно ли позиционировать метки данных Highcharts в зависимости от значения? - PullRequest
13 голосов
/ 26 сентября 2011

Я использую Highcharts для отображения гистограммы, где 2 бара перекрывают друг друга, а справа - метки данных, отображающие точное значение.

Проблема здесь в том, что когда значение превышает 80%, метка перетекает с диаграммы в рамку, перебирает какой-то другой текст и делает их обоих нечитаемыми.

Вот мои plotOptions:

plotOptions: {
            bar: {
                groupPadding: 0.5,
                pointWidth : 30,
                borderWidth: 0,
                dataLabels: {
                    enabled: true,
                    y:-5,
                    color:"black",
                    style: {
                        fontSize: "12px"
                    },
                    formatter: function(){
                        if(this.y > 80)
                        {
                            this.series.chart.options.plotOptions.bar.dataLabels.x -= 20;
                        }
                        if(this.series.name == "Tests OK")
                            return "Tests OK : <strong>"+Math.round(this.y*10)/10+"%</strong>";
                        else
                            return "<br/>Tests Executed : <strong>"+Math.round(this.y*10)/10+"%</strong>";
                    }
                }
            }
        }

Я думал, что смогу редактировать параметры графика на ходу, используя this.series.chart.options.plotOptions.bar.dataLabels.x -= 20;, но это не работает.

Конечно, я не первый, кто столкнулся с такой проблемой. Есть идеи?

Спасибо

Ответы [ 4 ]

14 голосов
/ 27 сентября 2011

Похоже, что это невозможно сделать из formatter.

Но вы можете установить их после рендеринга (загрузки) графика. Попробуйте что-то вроде этого

$.each(chartObj.series[0].data, function(i, point) {
    if(point.y > 100) {
        point.dataLabel.attr({x:20});
    }
});

в load callback (или, если вам нужно в redraw callback).

См. Пример здесь .

5 голосов
/ 23 августа 2012

Вот чем я закончил.Требуется setTimeout или свойство dataLabel не существует в точке:

formatter: function () {
    var point = this.point;
    window.setTimeout(function () {
        if (point.s < 0) {
            point.dataLabel.attr({
                y: point.plotY + 20
            });
        }
    });
    //this.series.options.dataLabels.y = -6;
    var sty = this.point.s < 0 ? 'color:#d00' : 'color:#090;' //other style has no effect:(
    return '<span style="' + sty + '">' + Math.abs(this.point.s) + '</span>';
}
3 голосов
/ 02 августа 2012

Хотя ответ Bhesh решает проблему с позиционированием по оси X / Y, Highcharts игнорирует любые изменения в свойстве стиля dataLabels ( см. Проблему здесь ). Однако вы можете переопределить стили отдельной точки, передав ее через объект данных:

series: [{ data: [29.9, 106, { y: 135, dataLabels: { style: { fontSize: 20 } } }]

пример из документации Highcharts

Мне удалось получить динамические стили путем итерации по моим данным перед передачей всего объекта в Highcharts для визуализации.

0 голосов
/ 27 сентября 2011

Я пытался сам разобраться с этим ... похоже, что вместо

this.series.chart.options.plotOptions.bar.dataLabels.x -= 20;

не могли бы вы использовать ...

this.series.options.dataLabels.x = -20;

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

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