Подтвердить что ты не робот

Разместить текст в центре круговой диаграммы - Highcharts

Я хотел бы разместить название в центре диаграммы пирога/пончика в HighCharts.

Я не вижу ничего в параметрах диаграммы, которые бы прямо включали это, поэтому я думаю, что для этого требуется использовать рендеринг SVG Highcharts - chart.renderer.text('My Text', x, y).

У меня есть это настроение, но я не могу заставить текст центрироваться внутри пирога. Проценты, по-видимому, не принимаются для значений x и y. Есть ли программный способ, чтобы он был центрирован внутри сюжета, и чтобы сохранить размер контейнера?

Обновление: Установка x и y на 50% отлично работает, чтобы центрировать круг (используя renderer.circle(x, y, radius)), но не центрировать текст (используя renderer.text(text, x, y)).

См. результат здесь: http://jsfiddle.net/supertrue/e2qpa/

4b9b3361

Ответ 1

Вам нужно учитывать расположение диаграммы, поэтому, если вы используете атрибуты "left" и "top", вы можете добавить половину ширины графика и вычесть половину ширины ограничивающего прямоугольника текста. Это даст точный центр:

text = chart.renderer.text("My Text").add();
textBBox = text.getBBox();
x = chart.plotLeft + (chart.plotWidth  * 0.5) - (textBBox.width  * 0.5);
y = chart.plotTop  + (chart.plotHeight * 0.5) - (textBBox.height * 0.5);
text.attr({x: x, y: y});

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

Исправление:

y = chart.plotTop  + (chart.plotHeight * 0.5) + (textBBox.height * 0.25);

Итак, моя оригинальная мысль, и это казалось прекрасным, заключалось в том, что текст будет выровнен по левому верхнему углу, однако это делается в левом нижнем углу. Таким образом, вместо того, чтобы вычесть половину высоты, нам действительно нужно добавить его. Что меня смущает, и что-то я еще не понимаю, так это то, что для получения центра вы добавляете только 25% высоты, а не 50%. Примечание. Это не работает на IE 7 или 8.

ОСНОВНОЕ ОБНОВЛЕНИЕ

http://jsfiddle.net/NVX3S/2/

< - Центрированный текст, который работает во всех браузерах

Что делает это новое обновление, так это добавляет новый элемент, используя jquery после завершения графика. Это работает во всех браузерах, которые я тестировал (включая IE7, 8, 9, Firefox и Chrome).

var textX = chart.plotLeft + (chart.plotWidth  * 0.5);
var textY = chart.plotTop  + (chart.plotHeight * 0.5);

// The width and height need to be calculated properly, so I made it a span.
var span = '<span id="pieChartInfoText" style="position:absolute; text-align:center;">';
span += '<span style="font-size: 32px">Upper</span><br>';
span += '<span style="font-size: 16px">Lower</span>';
span += '</span>';

$("#addText").append(span);
span = $('#pieChartInfoText');
span.css('left', textX + (span.width() * -0.5));
span.css('top', textY + (span.height() * -0.5));

Ответ 2

Используйте этот код для заголовка центральной диаграммы по вертикали:

title: {
    verticalAlign: 'middle',
    floating: true
}

Пример

Donut chart with title in the center

Изменить

Начиная с версии 2.1 Свойство плавания можно опустить, поскольку документация утверждает, что это подразумевается наличием свойства verticalAlign

Когда задано значение, заголовок ведет себя как плавающий.

Ответ 3

Лучшее решение - полагаться на центр серии, а не на plotHeight или plotWidth.

var chart = new Highcharts.Chart({
    chart: {
        renderTo: 'container',
        type: 'pie'
    },
    plotOptions: {
        pie: {
            //innerSize: '60%'
        }
    },
    title: {
        text: ''
    },
    series: [{
        data: [
            ['Firefox', 2262],
            ['IE7', 3800],
            ['IE6', 1000],
            ['Chrome', 1986]
            ]}]
},

function(chart) { // on complete
    var textX = chart.plotLeft + (chart.series[0].center[0]);
    var textY = chart.plotTop  + (chart.series[0].center[1]);

    var span = '<span id="pieChartInfoText" style="position:absolute; text-align:center;">';
    span += '<span style="font-size: 32px">Upper</span><br>';
    span += '<span style="font-size: 16px">Lower</span>';
    span += '</span>';

    $("#addText").append(span);
    span = $('#pieChartInfoText');
    span.css('left', textX + (span.width() * -0.5));
    span.css('top', textY + (span.height() * -0.5));
});

Рабочая демонстрация: http://jsfiddle.net/4dL9S/

Ответ 4

Во-первых, вы можете проверить html в своей скрипке. У вас была ширина на вашем контейнере 500 вместо 500px.

<div id="container" style="height: 400px; width: 500px"></div>​

Во-вторых, эта скрипка немного быстро и грязно, но я думаю, что она выполняет то, что вы хотели?

http://jsfiddle.net/e2qpa/3/

Ответ 5

        var newChart = new Highcharts.Chart(options);

            //Set No data text
            var textX = newChart.plotLeft + (newChart.plotWidth * 0.5);
            var textY = newChart.plotTop + (newChart.plotHeight * 0.3);
            var textWidth = 500;
            textX = textX - (textWidth / 2);

            newChart.renderer.label('<div style="width: ' + textWidth + 'px; text-align: center"><span>Dati non disponibili per questa selezione</span></div>', textX, textY, null, null, null, true)
            .css({
                fontSize: '16px',
            }).add();