Як додати текст всередині діаграми пампушок за допомогою Chart.js?


Відповіді:


36

Ви повинні змінити код, наприклад: chart.Doughnut.defaults

labelFontFamily : "Arial",
labelFontStyle : "normal",
labelFontSize : 24,
labelFontColor : "#666"

а потім у функції drawPieSegments

ctx.fillText(data[0].value + "%", width/2 - 20, width/2, 200);

Перегляньте це посилання: https://github.com/nnnick/Chart.js/pull/35

ось скрипка http://jsfiddle.net/mayankcpdixit/6xV78/, яка реалізує те саме.


2
Хтось ще не може знайти цю функцію drawPieSegments?
Юліан

2
Варто згадати, що це не працює з v2. Використовуйте включений код jsfiddle для зручності
Елвін Кеслер,

1
Як додати% у новий рядок? це підтримується?
користувач7334203

1
Все-таки це рішення?
ACB

@ ArunC.B - прокрутка вниз
ashleedawg

176

Жодна з інших відповідей не змінює розмір тексту на основі кількості тексту та розміру пампушки. Ось невеликий скрипт, за допомогою якого можна динамічно розмістити будь-яку кількість тексту в середині, і він автоматично змінить його розмір.

Приклад: http://jsfiddle.net/kdvuxbtj/

Пончик з динамічним текстом посередині

Знадобиться будь-яка кількість тексту у розмірі пампушки, ідеального для пампушки. Щоб не торкатися країв, ви можете встановити бічну прокладку як відсоток від діаметра внутрішньої частини кола. Якщо ви не встановите його, значення за замовчуванням буде 20. Ви також використовуєте колір, шрифт та текст. Про все інше дбає плагін.

Код плагіна почнеться з базового розміру шрифту 30 пікселів. Звідти він перевірить ширину тексту та порівняє його з радіусом кола та змінить розмір на основі співвідношення кола / ширини тексту.

Він має мінімальний розмір шрифту за замовчуванням 20 пікселів. Якщо текст перевищує межі при мінімальному розмірі шрифту, він оберне текст. Висота рядка за замовчуванням при обтіканні тексту становить 25 пікселів, але ви можете змінити його. Якщо встановити за замовчуванням мінімальний розмір шрифту як false, текст стане нескінченно дрібним і не буде обертатися.

Він також має максимальний розмір шрифту за замовчуванням 75 пікселів на випадок, якщо тексту недостатньо і буквене позначення буде занадто великим.

Це код плагіна

Chart.pluginService.register({
  beforeDraw: function(chart) {
    if (chart.config.options.elements.center) {
      // Get ctx from string
      var ctx = chart.chart.ctx;

      // Get options from the center object in options
      var centerConfig = chart.config.options.elements.center;
      var fontStyle = centerConfig.fontStyle || 'Arial';
      var txt = centerConfig.text;
      var color = centerConfig.color || '#000';
      var maxFontSize = centerConfig.maxFontSize || 75;
      var sidePadding = centerConfig.sidePadding || 20;
      var sidePaddingCalculated = (sidePadding / 100) * (chart.innerRadius * 2)
      // Start with a base font of 30px
      ctx.font = "30px " + fontStyle;

      // Get the width of the string and also the width of the element minus 10 to give it 5px side padding
      var stringWidth = ctx.measureText(txt).width;
      var elementWidth = (chart.innerRadius * 2) - sidePaddingCalculated;

      // Find out how much the font can grow in width.
      var widthRatio = elementWidth / stringWidth;
      var newFontSize = Math.floor(30 * widthRatio);
      var elementHeight = (chart.innerRadius * 2);

      // Pick a new font size so it will not be larger than the height of label.
      var fontSizeToUse = Math.min(newFontSize, elementHeight, maxFontSize);
      var minFontSize = centerConfig.minFontSize;
      var lineHeight = centerConfig.lineHeight || 25;
      var wrapText = false;

      if (minFontSize === undefined) {
        minFontSize = 20;
      }

      if (minFontSize && fontSizeToUse < minFontSize) {
        fontSizeToUse = minFontSize;
        wrapText = true;
      }

      // Set font settings to draw it correctly.
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      var centerX = ((chart.chartArea.left + chart.chartArea.right) / 2);
      var centerY = ((chart.chartArea.top + chart.chartArea.bottom) / 2);
      ctx.font = fontSizeToUse + "px " + fontStyle;
      ctx.fillStyle = color;

      if (!wrapText) {
        ctx.fillText(txt, centerX, centerY);
        return;
      }

      var words = txt.split(' ');
      var line = '';
      var lines = [];

      // Break words up into multiple lines if necessary
      for (var n = 0; n < words.length; n++) {
        var testLine = line + words[n] + ' ';
        var metrics = ctx.measureText(testLine);
        var testWidth = metrics.width;
        if (testWidth > elementWidth && n > 0) {
          lines.push(line);
          line = words[n] + ' ';
        } else {
          line = testLine;
        }
      }

      // Move the center up depending on line height and number of lines
      centerY -= (lines.length / 2) * lineHeight;

      for (var n = 0; n < lines.length; n++) {
        ctx.fillText(lines[n], centerX, centerY);
        centerY += lineHeight;
      }
      //Draw text in center
      ctx.fillText(line, centerX, centerY);
    }
  }
});

І ви використовуєте наступні параметри в об’єкті діаграми

options: {
  elements: {
    center: {
      text: 'Red is 2/3 the total numbers',
      color: '#FF6384', // Default is #000000
      fontStyle: 'Arial', // Default is Arial
      sidePadding: 20, // Default is 20 (as a percentage)
      minFontSize: 20, // Default is 20 (in px), set to false and text will not wrap.
      lineHeight: 25 // Default is 25 (in px), used for when text wraps
    }
  }
}

Кредит на @Jenna Sloan за допомогу в математиці , використовуваної в цьому розчині.


5
Чудово працює! Більшість інших варіантів порушується, коли легенда знаходиться праворуч або ліворуч.
louisav

2
Чудове рішення!
JustLooking

3
Я оновив вашу скрипку та додав максимальний розмір шрифту: jsfiddle.net/nkzyx50o/3059
Фелікс Генен

4
Можна розділити текст на кілька рядків? У моєму тексті 6 слів, і він переповнюється між межами вирізу
Кванда

2
Дякую, це працює і для мене, але як додати багаторядковий текст?
Ашутош

54

Тут очищений та комбінований приклад вищезазначених рішень - адаптивний (спробуйте змінити розмір вікна), підтримує самовирівнювання анімації, підтримує підказки

https://jsfiddle.net/cmyker/u6rr5moq/

Chart.types.Doughnut.extend({
    name: "DoughnutTextInside",
    showTooltip: function() {
        this.chart.ctx.save();
        Chart.types.Doughnut.prototype.showTooltip.apply(this, arguments);
        this.chart.ctx.restore();
    },
    draw: function() {
        Chart.types.Doughnut.prototype.draw.apply(this, arguments);

        var width = this.chart.width,
            height = this.chart.height;

        var fontSize = (height / 114).toFixed(2);
        this.chart.ctx.font = fontSize + "em Verdana";
        this.chart.ctx.textBaseline = "middle";

        var text = "82%",
            textX = Math.round((width - this.chart.ctx.measureText(text).width) / 2),
            textY = height / 2;

        this.chart.ctx.fillText(text, textX, textY);
    }
});

var data = [{
    value: 30,
    color: "#F7464A"
}, {
    value: 50,
    color: "#E2EAE9"
}, {
    value: 100,
    color: "#D4CCC5"
}, {
    value: 40,
    color: "#949FB1"
}, {
    value: 120,
    color: "#4D5360"
}];

var DoughnutTextInsideChart = new Chart($('#myChart')[0].getContext('2d')).DoughnutTextInside(data, {
    responsive: true
});
<html>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
<body>
    <canvas id="myChart"></canvas>
</body>
</html>

ОНОВЛЕННЯ 17.06.16:

Та сама функціональність, але для chart.js версії 2:

https://jsfiddle.net/cmyker/ooxdL2vj/

var data = {
  labels: [
    "Red",
    "Blue",
    "Yellow"
  ],
  datasets: [
    {
      data: [300, 50, 100],
      backgroundColor: [
        "#FF6384",
        "#36A2EB",
        "#FFCE56"
      ],
      hoverBackgroundColor: [
        "#FF6384",
        "#36A2EB",
        "#FFCE56"
      ]
    }]
};

Chart.pluginService.register({
  beforeDraw: function(chart) {
    var width = chart.chart.width,
        height = chart.chart.height,
        ctx = chart.chart.ctx;

    ctx.restore();
    var fontSize = (height / 114).toFixed(2);
    ctx.font = fontSize + "em sans-serif";
    ctx.textBaseline = "middle";

    var text = "75%",
        textX = Math.round((width - ctx.measureText(text).width) / 2),
        textY = height / 2;

    ctx.fillText(text, textX, textY);
    ctx.save();
  }
});

var chart = new Chart(document.getElementById('myChart'), {
  type: 'doughnut',
  data: data,
  options: {
  	responsive: true,
    legend: {
      display: false
    }
  }
});
<script src="//cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.6/Chart.bundle.js"></script>
<canvas id="myChart"></canvas>


3
Я отримую Uncaught TypeError: Cannot read property 'extend' of undefinedякісь ідеї?
Макс Роуз-Коллінз

2
Також ви можете змінити колір тексту за допомогою ctx.fillStyle = 'чорний';
Адріан Лопес

це продовжує писати текст знову і знову, якщо діаграма оновлюється, надаючи нові параметри даних
techie_28

Ви придумали рішення для цього?
Cmyker

@Cmyker може допомогти рішення CSS / HTML, але воно не експортує текст в центрі, коли діаграма експортується у форматі PNG. .
techie_28

38

Я б уникав модифікації коду chart.js для цього, оскільки це досить просто за допомогою звичайних CSS та HTML. Ось моє рішення:

HTML:

<canvas id="productChart1" width="170"></canvas>
<div class="donut-inner">
    <h5>47 / 60 st</h5>
    <span>(30 / 25 st)</span>
</div>

CSS:

.donut-inner {
   margin-top: -100px;
   margin-bottom: 100px;
}
.donut-inner h5 {
   margin-bottom: 5px;
   margin-top: 0;
}
.donut-inner span {
   font-size: 12px;
}

Вихід виглядає приблизно так:

введіть тут опис зображення


4
Чому ні? Просто додайте запити @ media до своїх класів.
Маттіас,

2
Це не працює для мене, я використовую адаптивний спосіб, тому я не можу використовувати фіксовані значення. :(
Massa

2
@Massa Ви пробували використовувати медіа-запити для різних резолюцій? Або модифікація css, про який я писав, використовувати% замість px?
Маттіас

2
@Mattias це було приємне рішення, але центральний текст не експортується, коли діаграма завантажується у форматі PNG.
techie_28

1
Дійсний пункт @ techie_28, не врахував цього, оскільки в питанні взагалі не йшлося про експорт.
Маттіас,

20

Це також працює в моєму кінці ...

<div style="width: 100px; height: 100px; float: left; position: relative;">
    <div
        style="width: 100%; height: 40px; position: absolute; top: 50%; left: 0; margin-top: -20px; line-height:19px; text-align: center; z-index: 999999999999999">
        99%<Br />
        Total
    </div>
    <canvas id="chart-area" width="100" height="100" />
</div>

введіть тут опис зображення


4
Я скористався вашим рішенням, оскільки воно було найшвидшим, і воно виконує свою роботу. Дякую!
MDT

@Amrik Singh це дійсно хороше рішення, але центральний текст не буде експортований, якщо діаграму завантажити у вигляді зображення PNG.
techie_28

Гарне рішення, воно не потребує великих клопотів.
Шашанк

ти мій чувак! Я не можу знайти рішення в angularjs і ніколи не роблю так. Дивовижний.
Номі Алі

1
прекрасний, швидкий і чистий фікс
Khaleel

11

База на відповіді @ rap-2-h, Тут код для використання тексту на діаграмі пампушок на Chart.js для використання на інформаційній панелі, як. Він має динамічний розмір шрифту для адаптивного варіанту.

HTML:

<div>text
<canvas id="chart-area" width="300" height="300" style="border:1px solid"/><div>

Сценарій:

var doughnutData = [
            {
                value: 100,
                color:"#F7464A",
                highlight: "#FF5A5E",
                label: "Red"
            },
            {
                value: 50,
                color: "#CCCCCC",
                highlight: "#5AD3D1",
                label: "Green"
            }
        ];

$(document).ready(function(){
  var ctx = $('#chart-area').get(0).getContext("2d");

  var myDoughnut = new Chart(ctx).Doughnut(doughnutData,{
     animation:true,
     responsive: true,
     showTooltips: false,
     percentageInnerCutout : 70,
     segmentShowStroke : false,
     onAnimationComplete: function() {

     var canvasWidthvar = $('#chart-area').width();
     var canvasHeight = $('#chart-area').height();
     //this constant base on canvasHeight / 2.8em
     var constant = 114;
     var fontsize = (canvasHeight/constant).toFixed(2);
     ctx.font=fontsize +"em Verdana";
     ctx.textBaseline="middle"; 
     var total = 0;
     $.each(doughnutData,function() {
       total += parseInt(this.value,10);
   });
  var tpercentage = ((doughnutData[0].value/total)*100).toFixed(2)+"%";
  var textWidth = ctx.measureText(tpercentage).width;

   var txtPosx = Math.round((canvasWidthvar - textWidth)/2);
    ctx.fillText(tpercentage, txtPosx, canvasHeight/2);
  }
 });
});

Ось зразок коду. Спробуйте змінити розмір вікна. http://jsbin.com/wapono/13/edit


1
Це має бути прийнятою відповіддю у випадку необхідності реагування (мій випадок).
Грег Бласс

2
Якщо у вас є підказки, текст зникає при наведенні.
Юліан

Помилка "jQuery.Deferred виняток: діаграма не визначена"
Kiquenet

11

Ви можете використовувати css із відносним / абсолютним позиціонуванням, якщо ви хочете, щоб він реагував. Плюс він легко впорається з багаторядковим.

https://jsfiddle.net/mgyp0jkk/

<div class="relative">
  <canvas id="myChart"></canvas>      
  <div class="absolute-center text-center">
    <p>Some text</p>
    <p>Some text</p>
  </div>
</div>

гарне рішення :)
Манза

Супер Робота, брате, ти мені
вдячив

8

Це засновано на оновленні Cmyker для Chart.js 2. (розміщено як іншу відповідь, оскільки я поки що не можу коментувати)

У мене виникла проблема з вирівнюванням тексту в Chrome, коли легенда відображається, оскільки висота діаграми не включає це, тому він неправильно вирівняний посередині. Виправлено, врахувавши це при обчисленні fontSize та textY.

Я розрахував відсоток усередині методу, а не встановлене значення, оскільки на сторінці їх кілька. Припущення полягають у тому, що ваша діаграма має лише 2 значення (інакше який відсоток? І що перше - це те, для якого ви хочете показати відсоток. У мене теж купа інших діаграм, тому я перевіряю тип = пончик. Я використовую лише пампушки, щоб показати відсотки, тому це працює для мене.

Колір тексту здається трохи вдареним і пропускається, залежно від того, в якому порядку працюють речі тощо, тому при зменшенні розміру я зіткнувся з проблемою того, що текст змінить колір (між чорним і основним кольором в одному випадку, а вторинним кольором і білим в іншому), тому Я "зберігаю" будь-який існуючий стиль заливки, малюю текст (кольором первинних даних), а потім відновлюю старий стиль заливки. (Збереження старого стилю заливки не здається необхідним, але ви ніколи не знаєте.)

https://jsfiddle.net/g733tj8h/

Chart.pluginService.register({
  beforeDraw: function(chart) {
    var width = chart.chart.width,
        height = chart.chart.height,
        ctx = chart.chart.ctx,
        type = chart.config.type;

    if (type == 'doughnut')
    {
      var percent = Math.round((chart.config.data.datasets[0].data[0] * 100) /
                    (chart.config.data.datasets[0].data[0] +
                    chart.config.data.datasets[0].data[1]));
      var oldFill = ctx.fillStyle;
      var fontSize = ((height - chart.chartArea.top) / 100).toFixed(2);

      ctx.restore();
      ctx.font = fontSize + "em sans-serif";
      ctx.textBaseline = "middle"

      var text = percent + "%",
          textX = Math.round((width - ctx.measureText(text).width) / 2),
          textY = (height + chart.chartArea.top) / 2;

      ctx.fillStyle = chart.config.data.datasets[0].backgroundColor[0];
      ctx.fillText(text, textX, textY);
      ctx.fillStyle = oldFill;
      ctx.save();
    }
  }
});


7

Ви також можете вставити код mayankcpdixit в onAnimationCompleteопцію:

// ...
var myDoughnutChart = new Chart(ctx).Doughnut(data, {
    onAnimationComplete: function() {
        ctx.fillText(data[0].value + "%", 100 - 20, 100, 200);
    }
});

Текст відображатиметься після анімації


6
Добре, але текст зникає при наведенні
rnaud

1
Правильно, текст зникає при наведенні курсору ... :( Було б чудово, якби текст не зник, будь-яка ідея, як це зробити? Дякую
MDT

@MDT @maud може бути за допомогою saveметоду
techie_28

7

Я створюю демонстраційну версію з 7 jQueryUI Slider та ChartJs (з динамічним текстом всередині)

Chart.types.Doughnut.extend({
        name: "DoughnutTextInside",
        showTooltip: function() {
            this.chart.ctx.save();
            Chart.types.Doughnut.prototype.showTooltip.apply(this, arguments);
            this.chart.ctx.restore();
        },
        draw: function() {
            Chart.types.Doughnut.prototype.draw.apply(this, arguments);

            var width = this.chart.width,
                height = this.chart.height;

            var fontSize = (height / 140).toFixed(2);
            this.chart.ctx.font = fontSize + "em Verdana";
            this.chart.ctx.textBaseline = "middle";

            var red = $( "#red" ).slider( "value" ),
            green = $( "#green" ).slider( "value" ),
            blue = $( "#blue" ).slider( "value" ),
            yellow = $( "#yellow" ).slider( "value" ),
            sienna = $( "#sienna" ).slider( "value" ),
            gold = $( "#gold" ).slider( "value" ),
            violet = $( "#violet" ).slider( "value" );
            var text = (red+green+blue+yellow+sienna+gold+violet) + " minutes";
            var textX = Math.round((width - this.chart.ctx.measureText(text).width) / 2);
            var textY = height / 2;
            this.chart.ctx.fillStyle = '#000000';
            this.chart.ctx.fillText(text, textX, textY);
        }
    });


var ctx = $("#myChart").get(0).getContext("2d");
var myDoughnutChart = new Chart(ctx).DoughnutTextInside(data, {
    responsive: false
});

ДЕМО В JSFIDDLE

введіть тут опис зображення


3

Відповідь @ rap-2-h та @Ztuons Ch не дозволяє showTooltipsопції бути активною, але що ви можете зробити, це створити і накласти другуcanvas об'єкт за тим, що відображає діаграму.

Важливою частиною є стиль, необхідний у div і для самого об'єкта полотна, щоб вони відображалися один на одного.

var data = [
    {value : 100, color : 'rgba(226,151,093,1)', highlight : 'rgba(226,151,093,0.75)', label : "Sector 1"},
    {value : 100, color : 'rgba(214,113,088,1)', highlight : 'rgba(214,113,088,0.75)', label : "Sector 2"},
    {value : 100, color : 'rgba(202,097,096,1)', highlight : 'rgba(202,097,096,0.75)', label : "Sector 3"}
]

var options = { showTooltips : true };
     
var total = 0;
for (i = 0; i < data.length; i++) {
     total = total + data[i].value;
}

var chartCtx = $("#canvas").get(0).getContext("2d");
var chart = new Chart(chartCtx).Doughnut(data, options);

var textCtx = $("#text").get(0).getContext("2d");
textCtx.textAlign = "center";
textCtx.textBaseline = "middle";
textCtx.font = "30px sans-serif";
textCtx.fillText(total, 150, 150);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
<html>
<body>
<div style="position: relative; width:300px; height:300px;">
    <canvas id="text" 
            style="z-index: 1; 
                   position: absolute;
                   left: 0px; 
                   top: 0px;" 
            height="300" 
            width="300"></canvas>
    <canvas id="canvas" 
            style="z-index: 2; 
                   position: absolute;
                   left: 0px; 
                   top: 0px;" 
            height="300" 
            width="300"></canvas>
</div>
</body>
</html>

Ось jsfiddle: https://jsfiddle.net/68vxqyak/1/


1

@Cmyker, відмінне рішення для chart.js v2

Одне невелике вдосконалення: Має сенс перевірити наявність відповідного ідентифікатора полотна, див. Змінений фрагмент нижче. В іншому випадку текст (тобто 75%) також відображається посередині інших типів діаграм на сторінці.

  Chart.pluginService.register({
    beforeDraw: function(chart) {
      if (chart.canvas.id === 'doghnutChart') {
        let width = chart.chart.width,
            height = chart.chart.outerRadius * 2,
            ctx = chart.chart.ctx;

        rewardImg.width = 40;
        rewardImg.height = 40;
        let imageX = Math.round((width - rewardImg.width) / 2),
            imageY = (height - rewardImg.height ) / 2;

        ctx.drawImage(rewardImg, imageX, imageY, 40, 40);
        ctx.save();
      }
    }
  });

Оскільки легенда (див .: http://www.chartjs.org/docs/latest/configuration/legend.html ) збільшує висоту діаграми, значення висоти слід отримувати за радіусом.


0

Перш за все, похвала щодо вибору Chart.js! Я використовую його в одному зі своїх поточних проектів, і мені це дуже подобається - він чудово виконує свою роботу.

Хоча мітки / підказки ще не є частиною бібліотеки, можливо, ви захочете поглянути на ці три запити на витягування:

І, як згадував Cracker0dks , Chart.js використовує canvasдля рендерингу, тому ви можете просто реалізувати власні підказки, взаємодіючи з ним безпосередньо.

Сподіваюся, це допомагає.


0

Рішення Alesana працює для мене загалом дуже добре, але, як і інші, я хотів мати можливість вказати, де відбуваються розриви рядків. Я зробив кілька простих модифікацій для обтікання рядків символами '\ n', якщо текст уже обертається. Більш повне рішення призведе до переносу, якщо в тексті є символи '\ n', але на даний момент я не встигаю змусити це працювати з розміром шрифту. Зміна також трохи краще центрується горизонтально при обгортанні (уникає проміжків). Код нижче (поки що я не можу залишати коментарі).

Було б круто, якби хтось поставив цей плагін на GitHub ...

Chart.pluginService.register({
  beforeDraw: function(chart) {
    if (chart.config.options.elements.center) {
      // Get ctx from string
      var ctx = chart.chart.ctx;

      // Get options from the center object in options
      var centerConfig = chart.config.options.elements.center;
      var fontStyle = centerConfig.fontStyle || 'Arial';
      var txt = centerConfig.text;
      var color = centerConfig.color || '#000';
      var maxFontSize = centerConfig.maxFontSize || 75;
      var sidePadding = centerConfig.sidePadding || 20;
      var sidePaddingCalculated = (sidePadding / 100) * (chart.innerRadius * 2)
      // Start with a base font of 30px
      ctx.font = "30px " + fontStyle;

      // Get the width of the string and also the width of the element minus 10 to give it 5px side padding
      var stringWidth = ctx.measureText(txt).width;
      var elementWidth = (chart.innerRadius * 2) - sidePaddingCalculated;

      // Find out how much the font can grow in width.
      var widthRatio = elementWidth / stringWidth;
      var newFontSize = Math.floor(30 * widthRatio);
      var elementHeight = (chart.innerRadius * 2);

      // Pick a new font size so it will not be larger than the height of label.
      var fontSizeToUse = Math.min(newFontSize, elementHeight, maxFontSize);
      var minFontSize = centerConfig.minFontSize;
      var lineHeight = centerConfig.lineHeight || 25;
      var wrapText = false;

      if (minFontSize === undefined) {
        minFontSize = 20;
      }

      if (minFontSize && fontSizeToUse < minFontSize) {
        fontSizeToUse = minFontSize;
        wrapText = true;
      }

      // Set font settings to draw it correctly.
      ctx.textAlign = 'center';
      ctx.textBaseline = 'middle';
      var centerX = ((chart.chartArea.left + chart.chartArea.right) / 2);
      var centerY = ((chart.chartArea.top + chart.chartArea.bottom) / 2);
      ctx.font = fontSizeToUse + "px " + fontStyle;
      ctx.fillStyle = color;

      if (!wrapText) {
        ctx.fillText(txt, centerX, centerY);
        return;
      }

      var lines = [];
      var chunks = txt.split('\n');
      for (var m = 0; m < chunks.length; m++) {
        var words = chunks[m].split(' ');
        var line;

        // Break words up into multiple lines if necessary
        for (var n = 0; n < words.length; n++) {
          var testLine = (n == 0) ? words[n] : line + ' ' + words[n];
          var metrics = ctx.measureText(testLine);
          var testWidth = metrics.width;
          if (testWidth > elementWidth && n > 0) {
            lines.push(line);
            line = words[n];
          } else {
            line = testLine;
          }
        }
        lines.push(line);
      }

      // Move the center up depending on line height and number of lines
      centerY -= ((lines.length-1) / 2) * lineHeight;

      // All but last line
      for (var n = 0; n < lines.length; n++) {
        ctx.fillText(lines[n], centerX, centerY);
        centerY += lineHeight;
      }
    }
  }
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.