Un diagramme circulaire en 3D qui se construit tout seul, gratuitement
Télécharger le templateUn projet After Effects où tout se règle sur un seul calque. Six curseurs pour les six parts, un pour la construction, trois pour la forme de l’anneau. Les pourcentages se recalculent sur le total, les barres prennent la couleur de leur part, et les étiquettes restent face à la caméra quoi que vous fassiez de celle-ci.
Un camembert en 3D, c’est un objet pénible à fabriquer à la main. Chaque part est un arc dont l’angle dépend des autres, les pourcentages doivent suivre, et le jour où le client change un chiffre il faut tout reprendre. J’ai donc monté le mien une fois pour toutes, avec des expressions qui font le calcul.
Le résultat tient en un geste : vous tapez vos six valeurs, vous posez deux clés sur un curseur, et le graphique se construit.
Zip de 1,5 Mo : le projet After Effects, le rendu d’exemple et un lisez-moi en français et en anglais. Gratuit pour vos projets personnels et commerciaux.
Tout est sur un seul calque
Ouvrez la composition Pie Chart et sélectionnez le calque Pie Controls. Vous n’aurez pas besoin d’en toucher un autre.
- Slice 1 à Slice 6 : la valeur de chaque part, dans l’unité que vous voulez. Les pourcentages sont calculés sur le total, vous n’avez donc pas à tomber sur 100. Une part à 0 disparaît, avec son étiquette.
- Grow : de 0 à 100, la construction. C’est le seul curseur à animer.
- Hole Size : le trou central, en pourcentage du rayon. 0 donne un camembert plein, 95 un anneau fin.
- Pie Radius : le rayon extérieur.
- Bevel Depth : la profondeur du biseau, partagée par l’anneau et les barres.
Pour les couleurs, c’est le contour de chaque calque Pie Slice. Les barres de gauche vont chercher la leur toutes seules.
Les pourcentages se calculent sur le total
C’est le cœur du template, et c’est ce qui évite de ressaisir les chiffres deux fois. Chaque étiquette fait la somme des six curseurs, puis se divise par elle. Tapez 12, 9, 4, 4, 4, 2 : le template affiche 34 %, 26 %, 11 %, 11 %, 11 % et 6 %, sans que vous ayez à convertir quoi que ce soit.
Bar Label 1 · Texte source
// Live percentage for this bar
const N = 6; // number of slices
const ctrl = thisComp.layer("Pie Controls");
const idx = parseInt(thisLayer.name.replace("Bar Label ", ""), 10);
let total = 0, own = 0;
for (let k = 1; k <= N; k++) {
const v = Math.max(0, ctrl.effect("Slice " + k)("Slider").value);
total += v;
if (k === idx) own = v;
}
total > 0 ? Math.round(own / total * 100) + "%" : "";L’étiquette lit son propre numéro dans le nom du calque. C’est pour ça que les calques s’appellent Bar Label 1 à Bar Label 6 : si vous les renommez, l’expression ne sait plus de quelle part elle parle.
L’anneau est un seul trait, pas une forme pleine
Le truc qui fait gagner le plus de temps : chaque part n’est pas un secteur à remplir, c’est un cercle vide, détouré par un contour épais. Le rayon du cercle est la ligne médiane de l’anneau, et l’épaisseur du contour fait le reste. Changer Hole Size revient alors à changer une épaisseur, pas à redessiner une forme.
Pie Slice 1 · Épaisseur du contour
// Ring thickness minus bevel on both edges, so the bevel stays inside the slice
const ctrl = thisComp.layer("Pie Controls");
const R = Math.max(0, ctrl.effect("Pie Radius")("Slider").value);
const h = R * clamp(ctrl.effect("Hole Size")("Slider").value, 0, 95) / 100;
const b = Math.max(0, ctrl.effect("Bevel Depth")("Slider").value);
Math.max(0, (R - h) - 2 * b);Le biseau est retiré des deux côtés, sinon il déborderait de la part et viendrait mordre sur sa voisine. C’est le genre de détail qu’on ne voit pas tant qu’on ne pousse pas Bevel Depth.
Les étiquettes restent lisibles
Dès qu’on met une caméra en mouvement autour d’un graphique 3D, le texte part de travers. Chaque étiquette regarde donc la direction de visée de la caméra, et pas la caméra elle-même : elle reste bien à plat, sans roulis, même quand la caméra s’incline.
Label 1 · Orientation
// Face the camera's view direction with no roll, so text stays horizontal
const cam = thisComp.activeCamera;
const dir = cam.toWorldVec([0, 0, 1]);
const p = transform.position;
lookAt(p, add(p, dir));Elles apparaissent aussi au bon moment, sur les quinze derniers pour cent de la construction, et une part vide n’affiche rien du tout.
Label 1 · Opacité
// Fade in as the pie finishes growing; hide empty slices
const ctrl = thisComp.layer("Pie Controls");
const idx = parseInt(thisLayer.name.replace("Label ", ""), 10);
const own = ctrl.effect("Slice " + idx)("Slider").value;
const grow = ctrl.effect("Grow")("Slider").value;
own > 0 ? linear(grow, 85, 100, 0, 100) : 0;Ce qu’il ne fait pas
Il lui faut After Effects 2027. C’est la version où il est fait, et After Effects refuse d’ouvrir un projet enregistré dans une version plus récente que la sienne.
Six parts, pas plus. Au-delà, un camembert devient de toute façon illisible et un histogramme fera mieux le travail. Les expressions tournent sur le moteur JavaScript : si votre projet est resté en Legacy ExtendScript, basculez-le dans Fichier, Paramètres du projet, Expressions.
Il n’y a pas non plus de légende ni de titre : je préfère les poser à la main, ils dépendent trop de la maquette. Le template s’occupe de ce qui est pénible, le calcul et la construction.
Si vous l’utilisez sur un projet, ça me fait plaisir de le savoir. Et si vous trouvez un cas où il se trompe, dites-le moi en commentaire, je le corrigerai.
Commentaires