درس 1 — Cadrer

Pourquoi l'infographie ne se génère pas d'un bloc

7 دقائق قراءة

هذا المحتوى غير مترجم بعد. تُعرض النسخة الأصلية.

Pourquoi l'infographie ne se génère pas d'un bloc

Une infographie publiée avec un chiffre faux coûte plus cher qu'une infographie en retard : rectificatif, perte de crédibilité, parfois un problème réglementaire quand il s'agit d'un bilan carbone ou financier. Or les modèles d'image savent désormais écrire du texte lisible. La question n'est donc plus « est-ce joli ? » mais « est-ce que je peux le prouver juste, le corriger et le décliner sans tout refaire ? ».

L'expérience du 2026-10-15

Le même prompt, avec le CSV collé tel quel, envoyé à deux modèles. Vous pouvez le rejouer : python -m infographie.naif gemini-3.1-flash-image (une image, environ 0,07 $).

Le prompt « naïf »
Crée une infographie professionnelle en français, format portrait, pour le bilan énergétique 2026
de Rivage Logistique, à partir de ces données CSV. Titre, consommation totale 2025 et 2026,
variation en pourcentage, un graphique en barres par site avec les valeurs, la part solaire de chaque site.
site,ville,conso_2025_mwh,conso_2026_mwh,part_solaire_pct
Entrepôt Nord,Lille,1840,1512,22
...
gemini-3.1-flash-imagegemini-3-pro-image
Infographie entière générée par gemini-3.1-flash-image : coquille « CONSOMMTION », titre de graphique en anglaisInfographie entière générée par gemini-3-pro-image : chiffres exacts sur ce tirage, variation arrondie à −17 %

Relecture ligne à ligne :

Défaut constatéFlash ImagePro Image
Coquille ou langue mélangée« CONSOMMTION (MWh) BY SITE »aucune sur ce tirage
Format des nombres« -16.8% », « 8360 MWh » (anglais)« 8 360 MWh » correct, mais « -17 % » arrondi sans consigne
Totaux 8 360 et 6 954justesjustes
Échelle des barresaxe présent ; jauges solaires sans échelle, badge « PART MAXIMALE » qui recouvre une barreaucun axe : impossible de vérifier les longueurs
Correction d'un seul chiffrerégénérer toute l'imagerégénérer toute l'image

Le modèle Pro a eu raison sur ce tirage. Cela ne change pas la décision : vous ne pouvez pas le prouver sans relire chaque pixel, et le prochain tirage, ou le format story, sera une autre image avec d'autres risques. Quatre formats égalent quatre générations indépendantes, donc quatre relectures intégrales.

Votre directrice de la communication montre le rendu Pro ci-dessus : « Tous les chiffres sont justes, pourquoi ne pas l'utiliser directement ? » Quel argument tranche ?

Le partage des rôles

La méthode tient en une règle : ce qui porte une information vérifiable sort du code ; ce qui porte une ambiance sort du modèle.

flowchart TB
  subgraph CODE["Le code (déterministe, testé)"]
    A["Chiffres calculés depuis le CSV"]
    B["Texte final, format français"]
    C["Grille, typographie, couleurs"]
    D["Graphique de données"]
  end
  subgraph IA["Les modèles (créatifs, contrôlés)"]
    E["Gemini texte : angle, titres avec variables"]
    F["Gemini image : fonds, illustration, icônes"]
  end
  E -->|"gabarits validés"| B
  F -->|"détourés, mis en cache"| G["Composition en calques"]
  A --> G
  B --> G
  C --> G
  D --> G
  G --> H["Contrôle automatique"] --> I["PNG, SVG, PDF x 4 formats"]
ÉlémentQui le produitPourquoi
Chiffres, unités, pourcentagescodedoit être exact et testable
Titre, sous-titremodèle texte, avec des variables {variation} remplies par le codele modèle trouve l'angle, il n'écrit aucun chiffre
Graphiquecodela longueur d'une barre est une donnée
Fond, illustration, icônesmodèle d'imageaucune information, seulement du style
Mise en pagecodereproductible sur 4 formats
Contrôlecodeune machine relit tout, à chaque export

Installer le projet

cd files
make setup     # .venv, dépendances, .env copié depuis .env.example
make test      # sans clé ni réseau

L'arborescence du dépôt :

files/
  Makefile  README.md  requirements.txt  .env.example  pytest.ini
  donnees/energie_entrepots_2026.csv
  polices/Inter-Regular.ttf  Inter-Bold.ttf  OFL.txt
  src/infographie/  config.py donnees.py structure.py visuels.py
                    scene.py mise_en_page.py controles.py export.py __main__.py naif.py
  tests/  ci/github-actions.yml

La police est livrée avec le code (Inter, licence SIL OFL). Ce n'est pas un détail : le contrôle de débordement mesure le texte avec cette police précise. Une police système différente sur le poste d'un collègue donnerait d'autres largeurs.

Ce qui casse en production

SymptômeCauseParade
Un chiffre faux publié dans une image généréele modèle a recopié ou arrondi de lui-mêmeaucun chiffre dans un prompt d'image ; le texte est posé par le code
La story dit « −17 % », l'affiche « −16,8 % »deux générations indépendantesune seule source de faits, recomposée par format
Le juridique demande de corriger un libellé la veille de la publicationle texte est figé dans les pixelstexte dans un calque à part, régénéré en secondes
Un lecteur d'écran ne lit rieninfographie = une image sans texte alternatiftexte alternatif produit avec les mêmes faits, SVG et PDF à texte réel

Règle de décision

  • Générer d'un bloc : maquette d'intention pour un brief, moodboard, visuel sans aucune donnée. Jamais pour publication.
  • Composer en calques : dès qu'un chiffre, un nom propre ou une mention légale apparaît, ou dès qu'il faut plus d'un format.
  • À surveiller : la tentation de « juste corriger le chiffre » dans l'image générée par retouche. C'est une infographie dont plus personne ne connaît la source.

Un chef de produit veut une affiche pour un salon, sans aucun chiffre : un slogan de 5 mots et une illustration. Quelle approche retenez-vous ?

Exercice

Rejouez l'expérience avec python -m infographie.naif (une image), puis listez au moins trois vérifications qu'un relecteur humain devrait faire sur le résultat pour le publier. Pour chacune, indiquez quel module du projet la rend inutile.

Voir la solution
Vérification humaineRendue inutile par
Chaque chiffre correspond au CSVdonnees.py : les faits sont calculés et testés (test_faits_calcules)
Format français (espace insécable, virgule, signe moins)fr_nombre et fr_pct, testés
Longueur des barres proportionnelle aux valeursgraphique() calcule chaque longueur depuis la donnée
Aucune coquille, aucune langue mélangéele texte n'est jamais dessiné par le modèle
Texte lisible sur le fondcontroles.py mesure le contraste sur les pixels
Les quatre formats disent la même choseune seule Structure et un seul Faits pour tous les formats

Résultat obtenu

Exécuté le 2026-10-15 sur le dépôt de files/ :

$ make test
.......................                                                  [100%]
23 passed in 6.49s

Je sais faire

  • Expliquer pourquoi un rendu juste n'est pas une preuve de justesse
  • Répartir chaque élément d'une infographie entre code et modèle
  • Installer le projet et lancer les tests sans clé
التالي