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