To, co się dzieje, to Chart.js mnoży rozmiar płótna, gdy jest wywoływany, a następnie próbuje zmniejszyć go z powrotem za pomocą CSS, aby zapewnić wykresy o wyższej rozdzielczości dla urządzeń o wysokiej rozdzielczości.
Problem polega na tym, że nie zdaje sobie sprawy, że już to zrobił, więc gdy wywołuje się kolejne czasy, mnoży już (podwojony lub cokolwiek) rozmiar PONOWNIE, aż wszystko zacznie się psuć. (To, co faktycznie się dzieje, to sprawdzenie, czy powinno dodać więcej pikseli do płótna, zmieniając atrybut DOM dla szerokości i wysokości, jeśli powinien, mnożąc go przez jakiś współczynnik, zwykle 2, następnie zmieniając to, a następnie zmieniając styl css atrybut, aby zachować ten sam rozmiar na stronie.)
Na przykład, jeśli uruchomisz go raz, a szerokość i wysokość obszaru roboczego są ustawione na 300, ustawia je na 600, a następnie zmienia atrybut stylu na 300 ... ale jeśli uruchomisz go ponownie, zobaczy, że szerokość i wysokość DOM wynosi 600 (sprawdź inną odpowiedź na to pytanie, aby zobaczyć, dlaczego), a następnie ustawia ją na 1200, a szerokość i wysokość css na 600.
Nie jest to najbardziej eleganckie rozwiązanie, ale rozwiązałem ten problem, zachowując zwiększoną rozdzielczość dla urządzeń siatkówkowych, po prostu ustawiając szerokość i wysokość płótna ręcznie przed każdym kolejnym wywołaniem Chart.js
var ctx = document.getElementById("canvas").getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 300;
var myDoughnut = new Chart(ctx).Doughnut(doughnutData);