Figures Scientifiques (qualité publication)
1219 générateurs matplotlib prêts à l'emploi, numérotés 0-1218, reproduisant
l'esthétique des revues coûteuses : Times New Roman partout, épines fines et
sombres, palettes sourdes-saturées, grilles multi-panneaux denses, annotations
de seuil et métriques, densités marginales, export 300 dpi.
Chaque script est autonome. Il s'exécute sans arguments, génère ses propres
données synthétiques et écrit un PNG dans output/ nommé d'après son numéro.
cd scripts
python fig_threshold_regression.py # -> output/01_threshold_regression.png
Trouver la bonne figure
Ne lisez pas ce fichier en cherchant un nom de graphique ; le catalogue est divisé pour ne charger que ce dont vous avez besoin.
- Lisez
catalog/INDEX.md— 135 groupes, chacun étant une discipline ou une famille de graphiques, avec sa plage de numéros. - Lisez le fichier du groupe correspondant. Chacun liste chaque figure de sa plage avec ce qu'elle dessine et quand l'utiliser.
- Lisez ce script avant de l'adapter.
Lorsque le nom du graphique est déjà connu, ignorez l'index et recherchez dans tous les groupes :
grep -ril "sankey" catalog/
grep -ril "survie\|kaplan" catalog/
Pour voir à quoi ressemble une figure avant de l'exécuter, ouvrez
reference/thumbs/<numéro>_<nom>.jpg — les 1219 y sont, réduits.
reference/curated/ en contient 33 en pleine résolution.
Si rien dans le catalogue ne correspond, commencez par le groupe à usage général
(0-54) : distributions, corrélation, régression, classement, composition et
séries temporelles, sous une forme que toute discipline peut emprunter.
Polices : lisez ceci avant votre première exécution
La police de la maison est Times New Roman. Elle est propriétaire et n'est pas
fournie ; fonts/ contient Tinos (SIL OFL) à la place, qui a des largeurs
d'avance octet-identiques, de sorte qu'une figure est mise en page de la même
manière que la machine ait ou non la vraie police. Confirmez que la pile se
résout avant de vous fier à une sortie :
cd scripts
python check_typography.py --metrics
# vs Tinos identique (Tinos-Regular.ttf)
Si matplotlib retombe jamais sur DejaVu, set_pub_style() lève une exception
plutôt que de dégrader silencieusement — un mauvais type de police est invisible
pour toute vérification basée sur PNG. Détails dans fonts/README.md.
Prérequis
matplotlib>=3.6 et numpy sont nécessaires pour chaque figure ; scipy,
pandas, seaborn, scikit-learn, openpyxl et Pillow par des sous-ensembles
de la bibliothèque et des outils. Le seuil de 3.6 est important : le repli de
police glyphe par glyphe permet à une étiquette chinoise d'emprunter un visage
Song tandis que les chiffres restent en Times.
pip install -r requirements.txt
Le style partagé : scripts/pubstyle.py
Importez ceci dans toute nouvelle figure pour correspondre à l'esthétique :
from pubstyle import (set_pub_style, PALETTES, savefig, style_axes,
panel_title, add_figure_header, header_height,
panel_labels_inches)
set_pub_style() # applique rcParams une fois ; ne les touchez jamais vous-même
fig, axes = ... # construisez votre figure
panel_title(axes[0], "Amplitude de la dérive au fil du temps")
head = header_height(fig, subtitle=True)
fig.tight_layout(rect=[0, 0.03, 1, 1 - head / fig.get_size_inches()[1]])
add_figure_header(fig,
"La fermeture de boucle supprime la dérive non bornée", # la conclusion
subtitle="n = 240 trajectoires, 8 séquences")
panel_labels_inches(fig, axes) # (a) (b) (c) à des décalages en pouces égaux
savefig(fig, "ma_figure.png") # 300 dpi dans output/
Les tailles proviennent de pubstyle.TYPE_SCALE, donc ne passez pas
fontsize= lorsque l'un de ces assistants le fera pour vous. Palettes clés
dans PALETTES : teal_rust, blue_red, greens, earth, div_rdbu,
pastel4, zones, plus les rampes cb_* adaptées aux daltoniens. Réutilisez-les
au lieu des valeurs par défaut de matplotlib — ce sont elles qui rendent les
figures chères.
scripts/figkit.py est la couche de construction complémentaire : encarts
zoom, cartes texte, axes basés sur les pouces, placement d'étiquettes anti-
chevauchement.
Adaptation aux données réelles
Si les données sont un tableau, ne partez pas de ces scripts. Utilisez plutôt la porte d'entrée, qui applique tout le système de conception à un fichier :
cd scripts
python plot_data.py --data vos_donnees.csv --describe # que puis-je dessiner ?
python plot_data.py --data vos_donnees.csv --kind scatter_fit --x a --y b --group g
Quatorze types de graphiques, détection d'encodage et de délimiteur, "1.234"
et "12.5%" convertis en nombres, sélection automatique de police CJK pour
les noms de colonnes chinois, et .xlsx aussi bien que .csv.
Pour adapter l'un des 1219 générateurs, trouvez d'abord où vivent ses données :
python plot_data.py --contract fig_threshold_regression.py
Les scripts ne sont pas uniformes à ce sujet. 19 des 1219 isolent leurs
données dans une fonction gen_data(), 299 les gardent dans une autre
fonction nommée qui doit être lue en premier, 656 les construisent en ligne
dans main(), et 245 n'ont aucune données substituable car la figure est
un modèle — un spectre de Kaimal, un filtre de Kalman, une scène de
microscopie synthétique. Le rapport --contract indique quel cas s'applique
et nomme les constantes à modifier.
Quoi que vous éditiez, conservez le code de traçage et de stylisation. Le stylisme est la partie précieuse ; ne le réécrivez pas avec les valeurs par défaut de matplotlib.
Règles esthétiques (ce qui rend ces figures chères)
- Cachez les épines supérieure et droite ; gardez les épines fines (
0.8) et gris foncé (#333), pas noires. - Times New Roman partout, petit (7-9 pt corps, 6.0 pt minimum), gras uniquement pour le titre de la figure, les lettres de panneau et les titres de panneau.
- Paires de palettes sourdes-saturées (sarcelle/rouille, bleu/rouge) — jamais de RVB primaire.
- Ajoutez des densités marginales ou des histogrammes aux nuages de points dès que l'espace le permet.
- Annotez les statistiques dans une boîte blanche arrondie avec une bordure fine ; mettez le texte de seuil dans la couleur d'accent.
- Grilles multi-panneaux denses avec
tight_layout(h_pad, w_pad); partagez la légende. - Exportez à 300 dpi avec
bbox_inches="tight"(géré parsavefig).
DESIGN_SYSTEM.md contient les nombres appliqués derrière
chaque règle.
Vérification
Ouvrez le PNG dans output/ et comparez-le à la demande. Si un panneau est
trop serré, augmentez figsize ou h_pad/w_pad ; si les couleurs jurent,
passez à une seule entrée PALETTES.
La lecture du PNG ne peut pas vous dire quelle police a été utilisée, car un PNG ne stocke pas de métadonnées de police. Exécutez également l'audit typographique — il rend en PDF et lit les polices que le rendu a intégrées :
cd scripts
python check_typography.py # les erreurs doivent être nulles
python check_figures.py --jobs 8 # exécute tout, audite chaque PNG
python run_all.py --parallel 8 # reconstruit tous les 1219 (environ 15 minutes)
python run_all.py --range 173-192 # juste le bloc de télédétection
python run_all.py --parallel 8 --vector # PDF à côté de chaque PNG, pour soumission
Documents connexes
catalog/INDEX.md— les 135 groupes et leurs plages de numéros.DESIGN_SYSTEM.md— la norme visuelle inter-figures (tailles de toile, palettes, échelle typographique, espacement, cartes de couleurs interdites). À lire avant d'écrire une nouvelle figure ou d'en modifier une existante.WORKFLOW.md— le manuel d'utilisation : choisir un générateur, remplacer par des données réelles, structurer une nouvelle figure avecnew_figure.py, exécuter les contrôles de qualité.SKILL.mdrépond quelle figure ;WORKFLOW.mdrépond comment l'utiliser.scripts/reference.md— l'API complète depubstyle.fonts/README.md— pourquoi une police est fournie ici, laquelle, et sous quelle licence.NUMBER_REGISTRY.md— quelles plages de numéros sont prises. Les nouvelles figures commencent à 1219.