Те, що відбувається, це Chart.js множує розмір полотна при його виклику, а потім намагається зменшити його за допомогою CSS, метою якого є надання графіків з більш високою роздільною здатністю для пристроїв із високою точністю в дюйм.
Проблема полягає в тому, що він не усвідомлює, що це вже робив, тому, коли його називають послідовними часами, він ЗНО Змножує вже (вдвічі або більше), поки все не почне ламатися. (Що насправді відбувається, це перевірка, чи слід додавати більше пікселів на полотно, змінюючи атрибут DOM на ширину та висоту, якщо потрібно, помножуючи його на якийсь коефіцієнт, зазвичай 2, потім змінюючи це, а потім змінюючи стиль css для збереження однакового розміру на сторінці.)
Наприклад, коли ви запускаєте його один раз, а ширина і висота полотна встановлені на 300, він встановлює їх на 600, потім змінює атрибут стилю на 300 ... але якщо ви запускаєте його знову, він бачить, що ширина і висота DOM дорівнюють 600 (перевірте іншу відповідь на це запитання, щоб зрозуміти чому), а потім встановіть його на 1200, а ширину та висоту css до 600.
Не найелегантніше рішення, але я вирішив цю проблему, зберігаючи підвищену роздільну здатність для пристроїв сітківки, просто встановлюючи ширину та висоту полотна вручну перед кожним наступним викликом Chart.js
var ctx = document.getElementById("canvas").getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 300;
var myDoughnut = new Chart(ctx).Doughnut(doughnutData);