Présentations, boards investisseurs et rapports produit demandent encore des graphiques PNG nets compatibles PowerPoint, Notion et CMS. Le vrai sujet n’est pas « peut-on exporter ? », mais quelle pile porte la vérité des pixels, de l’alpha et de l’intention couleur. Ce guide propose une matrice décisionnelle 2026 pour Matplotlib et Plotly, des paramètres d’export exécutables (dpi, figsize, transparent, MPLBACKEND, write_image / Kaleido, pont Pillow), une lecture sRGB alignée design, et un chemin batch sur Mac mini M4 distant avec garde-fous d’acceptation réutilisables en shell ou LaunchAgent.
Sur cette page
① Matrice : Matplotlib vs Plotly pour la livraison PNG
Choisissez la bibliothèque selon votre modèle de gouvernance. Matplotlib convient aux équipes qui veulent un style déterministe, relu dans le code Python. Plotly s’intègre aux dashboards déjà modélisés en Figure et permet des instantanés PNG identiques au JSON métier sans dupliquer tous les jetons visuels.
| Critère | Matplotlib | Plotly |
|---|---|---|
| Serveur / batch sans écran | Très bon — MPLBACKEND=Agg ou matplotlib.use("Agg") avant import pyplot |
Très bon — extra pip kaleido ; fig.write_image("out.png") |
| Modèle de taille | figsize (pouces) × dpi sur savefig ⇒ pixels approximatifs ; bbox_inches="tight" peut rogner les marges slides |
width / height en px + scale (Retina) |
| Transparence | transparent=True, facecolor / edgecolor ; contrôler franges anticrénelage sur fond sombre |
Fond transparent via paper_bgcolor / plot_bgcolor rgba(0,0,0,0) ; valider sur plaques #000 / #FFF |
| Statique vs interactif | Statique d’abord ; proche logique « print » | Même Figure pour Dash et PNG ; attention état caméra / hover si capture scriptée |
| Risque typique | Polices manquantes, graisses de secours, légendes rognées par bbox serrée | Dérive de version Kaleido, traces lourdes rasterisées |
② Paramètres d’export exécutables (copier-coller)
Ces extraits ciblent macOS ou Linux worker ; sur un nœud Mac M4 loué, exécutez-les sous le même utilisateur que votre agent (launchd) pour garder les caches de polices stables.
Matplotlib — backend Agg, dpi, transparence
figsize[0] * dpi sans recadrage agressif — remesurez avec sips -g pixelWidth ou Pillow après export.
# Shell : backend non interactif pour jobs batch
export MPLBACKEND=Agg
# Python
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 5.625), layout="constrained") # toile ~16:9 en pouces
ax.plot([0, 1], [0, 1])
fig.savefig(
"out/matplotlib_chart.png",
dpi=300,
transparent=True,
facecolor="none",
edgecolor="none",
bbox_inches="tight",
pad_inches=0.05,
)
dpi: 144–300 pour decks ; 300+ si le texte doit survivre à une réduction PDF.figsize: traiter les pouces comme contrat — une paire figsize+dpi documentée par ligne directrice marque.transparent+facecolor="none": évite le voile blanc derrière les légendes.- Backend alternatif :
mplcairosi le rendu sous-pixel du texte est critique ; valider toujours sur les lecteurs cibles.
Plotly — Kaleido et write_image
L’API figure utilise write_image pour le raster ; il n’y a pas de write_png dédié sur l’objet Figure — passez format="png" (ou un nom de fichier .png) pour forcer PNG. Équivalent bas niveau : plotly.io.to_image(fig, format="png", engine="kaleido") puis écriture bytes si votre orchestrateur impose un nom de fichier précis.
import plotly.graph_objects as go
fig = go.Figure(data=go.Scatter(x=[0, 1], y=[0, 1]))
fig.update_layout(
template="plotly_white",
paper_bgcolor="rgba(0,0,0,0)",
plot_bgcolor="rgba(0,0,0,0)",
)
fig.write_image(
"out/plotly_chart.png",
format="png",
width=1920,
height=1080,
scale=2, # 1920×1080 logiques → fichier souvent 3840×2160 px selon moteur
engine="kaleido",
)
width/height: cadres explicites pour gabarits slides (1920×1080, 3840×2160, etc.).scale:1pour assets web 1x ;2Retina si l’aval attend le double raster.engine="kaleido": figerkaleidoetplotlydans un lockfile — les upgrades ont déjà modifié les bornes raster.
Pillow — « write_png » côté composite final
Après fusion logos / tampons sur une sortie Matplotlib, utilisez Image.save(..., format="PNG", compress_level=6) après validation RGBA alpha droit. Pas besoin d’appeler directement PngImagePlugin : img.save("out.png") avec mode RGBA explicite suffit le plus souvent.
③ sRGB, ICC et alignement livraison
Ni Matplotlib ni Plotly n’embarquent automatiquement un « contrat ICC design » : il faut le définir en pipeline. Pour web et decks, standardisez le discours sur sRGB entre data science et ops design, puis vérifiez comme pour les exports Figma : plaques de prévisualisation, politique de profil, manifestes. Approfondissez avec la checklist PNG sRGB / Display P3 et l’article métadonnées ICC & recompression sans perte ; voici le minimum dataviz.
| Contrôle | Action | Acceptation |
|---|---|---|
| Intention couleur documentée | README « livraison sRGB » vs « P3 interne seulement » | Ticket aligné sur les paramètres PNG design par lot |
| Fonds neutres | Placer le PNG sur #FFFFFF et #0B0B0B (Safari + Chrome) | Pas de surprise gamma ; grilles et textes dans Δ convenu avec les jetons hex |
| Graphiques transparents | Zoom 400 % aux coins de légende | Pas de frange grise ; bords alpha cohérents avec la référence vectorielle si applicable |
| ICC optionnel | Si la marque impose l’embed, appliquer la politique exiftool / sips après QA pixels |
Tag profil conforme règle org sans décaler les pixels |
④ Mac M4 distant : chemins batch et checklist d’acceptation
Déportez les longues rafales de graphiques sur un hôte Apple Silicon dédié pour éviter sommeil portable, jitter VPN et dérive de polices locales. Réutilisez la même discipline que pour les PNG marketing :
~/png_jobs/viz_export/inbox/— dépôt brut des rendus.~/png_jobs/viz_export/work/— composition optionnelle / filigrane.~/png_jobs/viz_export/out/AAAA-MM-JJ/— assets promus + manifeste.~/png_jobs/viz_export/log/export.jsonl— une ligne JSON par fichier : outil, version,dpiouscale, sha256.
Pour très grands canevas ou cadres 4K, croisez avec le guide export 4K PNG batch sur Mac M4 distant. Pour portes QA automatisées (dimensions, plafonds d’octets, retry), voyez les motifs OpenClaw QA PNG par lot même en restant d’abord en shell pur.
| # | Garde-fou | Outil |
|---|---|---|
| 1 | Largeur / hauteur = spec (±0 px) | sips -g pixelWidth -g pixelHeight ou Pillow Image.open(...).size |
| 2 | Octets dans min / max (détecter rendus vides) | stat -f%z (BSD) ou seuils watcher |
| 3 | Pas de downscale accidentel (dérive dpi / scale) | Manifeste : comparer dpi ou scale au lockfile |
| 4 | Netteté du texte (spot) | Aperçu à 100 % + gabarit slide cible |
| 5 | Reproductibilité | Même commit + polices figées ⇒ sha256 identique si possible |
⑤ Synthèse
Les chemins Agg + savefig et Kaleido + write_image livrent d’excellents PNG lorsque vous figez backend et versions et exprimez la taille soit en pouces × dpi, soit en pixels × scale, sans mélanger les deux de façon ambiguë. Associez toujours une petite plaque QA sRGB, des contrôles alpha sur transparence, et un arbre out/ daté sur un Mac M4 distant pour que les remises dataviz héritent de la même rigueur que les pipelines PNG design.
Suite : louer un Mac M4 distant pour batch graphiques
Parcourez la page d’accueil MacPng pour le contexte produit, puis les offres location et achat et la page tarifs & nœuds : aucune connexion n’est requise pour comparer les forfaits. Après choix du nœud, suivez l’aide SSH / VNC, copiez l’arborescence ci-dessus et planifiez Matplotlib ou Plotly la nuit pendant que le portable reste fermé. D’autres matrices livraison design sont listées dans le blog.
Exécuter exports Matplotlib / Plotly sur Mac distant
Gardez les jobs Kaleido et Agg sur un hôte stable, polices et versions figées, et ne promouvez que des PNG signés dans le manifeste — idéal pour decks nocturnes, rapports réglementés et instantanés dashboard haut volume.