Was passiert, ist, dass Chart.js die Größe der Zeichenfläche multipliziert, wenn sie aufgerufen wird, und dann versucht, sie mithilfe von CSS wieder zu verkleinern. Der Zweck besteht darin, Diagramme mit höherer Auflösung für Geräte mit hoher Auflösung bereitzustellen.
Das Problem ist, dass es nicht merkt, dass es dies bereits getan hat. Wenn es als aufeinanderfolgende Zeiten bezeichnet wird, multipliziert es die bereits (verdoppelte oder was auch immer) Größe WIEDER, bis die Dinge anfangen zu brechen. (Was tatsächlich passiert, ist die Überprüfung, ob der Zeichenfläche mehr Pixel hinzugefügt werden sollen, indem das DOM-Attribut für Breite und Höhe geändert wird. Wenn dies der Fall ist, wird es mit einem Faktor multipliziert, normalerweise 2, dann geändert und dann der CSS-Stil geändert Attribut, um die gleiche Größe auf der Seite beizubehalten.)
Wenn Sie es beispielsweise einmal ausführen und Ihre Leinwandbreite und -höhe auf 300 festgelegt sind, werden sie auf 600 festgelegt, und das Stilattribut wird auf 300 geändert. Wenn Sie es jedoch erneut ausführen, wird die Breite und Höhe des DOM angezeigt sind 600 (überprüfen Sie die andere Antwort auf diese Frage, um zu sehen, warum) und setzen Sie sie dann auf 1200 und die CSS-Breite und -Höhe auf 600.
Nicht die eleganteste Lösung, aber ich habe dieses Problem gelöst, während ich die verbesserte Auflösung für Retina-Geräte beibehalten habe, indem ich einfach die Breite und Höhe der Leinwand vor jedem aufeinanderfolgenden Aufruf von Chart.js manuell eingestellt habe
var ctx = document.getElementById("canvas").getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 300;
var myDoughnut = new Chart(ctx).Doughnut(doughnutData);