Apa yang terjadi adalah Chart.js mengalikan ukuran kanvas ketika dipanggil kemudian mencoba untuk menurunkannya kembali menggunakan CSS, tujuannya adalah untuk menyediakan grafik resolusi yang lebih tinggi untuk perangkat dpi tinggi.
Masalahnya adalah ia tidak menyadari bahwa ia telah melakukan ini, jadi ketika dipanggil berkali-kali, ia mengalikan ukuran yang sudah (dua kali lipat atau apa pun) LAGI sampai hal-hal mulai rusak. (Apa yang sebenarnya terjadi adalah memeriksa apakah itu harus menambahkan lebih banyak piksel ke kanvas dengan mengubah atribut DOM untuk lebar dan tinggi, jika seharusnya, mengalikannya dengan beberapa faktor, biasanya 2, lalu mengubahnya, dan kemudian mengubah gaya css atribut untuk mempertahankan ukuran yang sama di halaman.)
Misalnya, ketika Anda menjalankannya sekali dan lebar dan tinggi kanvas Anda disetel ke 300, itu menetapkannya ke 600, lalu mengubah atribut gaya menjadi 300 ... tetapi jika Anda menjalankannya lagi, itu melihat bahwa lebar dan tinggi DOM adalah 600 (periksa jawaban lain untuk pertanyaan ini untuk mengetahui alasannya) dan kemudian setel ke 1200 dan lebar dan tinggi css menjadi 600.
Bukan solusi yang paling elegan, tetapi saya memecahkan masalah ini sambil mempertahankan resolusi yang ditingkatkan untuk perangkat retina hanya dengan mengatur lebar dan tinggi kanvas secara manual sebelum setiap panggilan berturut-turut ke Chart.js
var ctx = document.getElementById("canvas").getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 300;
var myDoughnut = new Chart(ctx).Doughnut(doughnutData);