Ce qui se passe, c'est que Chart.js multiplie la taille du canevas lorsqu'il est appelé, puis tente de le réduire à l'aide de CSS, le but étant de fournir des graphiques de résolution plus élevée pour les appareils à haute résolution.
Le problème est qu'il ne se rend pas compte qu'il a déjà fait cela, donc lorsqu'il est appelé plusieurs fois, il multiplie à NOUVEAU la taille déjà (doublée ou autre) jusqu'à ce que les choses commencent à se casser. (Ce qui se passe réellement, c'est de vérifier s'il doit ajouter plus de pixels au canevas en modifiant l'attribut DOM pour la largeur et la hauteur, le cas échéant, en le multipliant par un facteur, généralement 2, puis en le modifiant, puis en changeant le style css attribut pour conserver la même taille sur la page.)
Par exemple, lorsque vous l'exécutez une fois et que la largeur et la hauteur de votre canevas sont définies sur 300, il les définit sur 600, puis change l'attribut de style sur 300 ... mais si vous le réexécutez, il voit que la largeur et la hauteur du DOM sont 600 (vérifiez l'autre réponse à cette question pour voir pourquoi), puis définissez-le sur 1200 et la largeur et la hauteur css sur 600.
Ce n'est pas la solution la plus élégante, mais j'ai résolu ce problème tout en conservant la résolution améliorée pour les appareils Retina en définissant simplement la largeur et la hauteur du canevas manuellement avant chaque appel successif à Chart.js
var ctx = document.getElementById("canvas").getContext("2d");
ctx.canvas.width = 300;
ctx.canvas.height = 300;
var myDoughnut = new Chart(ctx).Doughnut(doughnutData);