Nature-grade Figure Composer – Zusammenstellung von Abbildungen auf Nature-Niveau
Eine Abbildung ist nicht nur eine „Anzeige von Ergebnissen", sondern ein visuelles Beweismittel für eine wissenschaftliche Behauptung. Dieses Skill formt verstreute Analyseergebnisse in eine Geschichte um – „1 Abbildung = 1 Behauptung“ – und erstellt daraus Dateien, die den technischen Spezifikationen von Nature-Journalen entsprechen.
<SKILL_DIR> ist das Verzeichnis, in dem sich diese SKILL.md befindet. Erforderlich: Python 3.9+, matplotlib, numpy,
pandas, Pillow, PyMuPDF (pip install pymupdf), scipy (für 95%-KI).
Mitgelieferte Ressourcen
| Pfad | Inhalt | Zeitpunkt zum Lesen |
|---|---|---|
references/guidelines.md | Benutzerspezifische Zeichenrichtlinien (7 Prinzipien), Nature-Technikspezifikationen, finale Checkliste | Vor der Planung lesen, bei QA erneut lesen |
references/storyboard.md | Zusammenfassung von Ergebnissen → Abbildung, Typen für Abbildung 1, Layout-Typen, Entwurfsschritte für den „Automatik“-Modus | Schritt 3 |
references/charts.md | Behauptungstyp → Diagrammtyp, Unsicherheit/Achsen, Darstellung von Karten, Codebeispiele für nfig | Schritt 3 (Typauswahl), 5 |
references/captions-tables.md | Schreibweisen und Beispiele für Captions, Tabellen und Supplementary | Schritt 7 |
scripts/inventory.py | Inventarisierung der Ergebnisdateien + nummeriertes Kontaktblatt | Schritt 1 |
scripts/nfig.py | Stil, feste Farbbedeutung, Panel-Label, Zeichenhilfen, automatische QA | Schritt 4–6 |
scripts/assemble.py | Kombination vorhandener PDF/SVG/PNG als Vektorgrafiken zu mehreren Panels | Wenn Paneele nicht neu gezeichnet werden können |
scripts/check_figure.py | Spezifikationsprüfung der fertigen Datei + Farbsimulationsbild | Schritt 6 |
scripts/make_table.py | CSV → booktabs LaTeX / Markdown-Tabelle | Schritt 7 |
assets/figure_plan_template.md | Vorlage für den Abbildungsplan | Schritt 3 |
assets/style_template.py | Vorlage für gemeinsame Konventionen (Anzeigenamen, Farbbereiche, Achsenbeschriftungen) für alle Abbildungen | Schritt 4 |
assets/layout_example.json | Layoutbeispiel für assemble.py | Bei Verwendung von assemble |
Arbeitsablauf
Schritt 1 — Inventarisierung der Ergebnisse (schnell vor der Frage)
python <SKILL_DIR>/scripts/inventory.py <project_root> --sheet paper_figures/_inventory --out paper_figures/_inventory/inventory.md
- Lies die
contact_sheet_*.pngunterpaper_figures/_inventory/um zu verstehen, was jedes Ergebnis zeigt. Nutze die Spalten „made by / read by“ im Bericht, um von der Abbildung zum Skript und zu den Rohdaten zu gelangen (notwendig für die Neuerstellung). - Lies Manuskripte, READMEs oder Notizen, um die Forschungsfrage, die vorgeschlagene Methode und die Behauptungen zu verstehen.
- Füge zu jedem Ergebnis einen einzeiligen Befund hinzu (z.B.
#6 benchmark.csv → vorgeschlagene Methode erreicht auf allen 3 Datensätzen die höchste Genauigkeit, +6 Prozentpunkte). Dies dient als Grundlage für die Auswahl in Schritt 2 und die Planung in Schritt 3. - Falls keine Ergebnisse gefunden werden, frage in Schritt 2 gemeinsam nach dem Speicherort.
Schritt 2 — Befragung (nach dem Start des Skills obligatorisch)
Die Entscheidung über die Zusammenstellung liegt beim Benutzer. Frage daher vor dem Zeichnen nach. Frage jedoch keine Punkte erneut, die bereits in der Startnachricht geklärt wurden. Verwende ggf. AskUserQuestion, ansonsten gib nummerierte Fragen als Text aus und warte auf Antwort. Erstelle die Auswahlmöglichkeiten aus der Inventarisierung in Schritt 1 konkret (mit Dateinummer und Befund).
- Objekt (Pflicht) „Welche Ergebnisse sollen in einer Abbildung zusammengefasst werden?“
- Automatik: Aus allen Ergebnissen wird die gesamte Figuren-Konfiguration (Fig. 1–N + SI) entworfen (empfohlen)
- Ein oder zwei aus der Inventarisierung erstellte Kandidatengruppen (z.B. „Leistungsvergleich: #1 accuracy_bar, #6 benchmark.csv“)
- Freitext (Other) mit Angabe wie „#1, #4, #6 in einer Abbildung“ möglich
- Behauptung „Was soll mit dieser Abbildung am wichtigsten vermittelt werden?“ – 1–2 geschätzte Behauptungen + Automatik
- Veröffentlichungsgröße – 2-spaltig 183 mm (empfohlen) / 1-spaltig 89 mm / 1,5-spaltig 120–136 mm / Automatik
- Ausgabe (Mehrfachauswahl) – Abbildung (PDF+SVG+PNG) / Caption (Englisch) / Tabelle / SI-Kandidatenliste
Behandlung der Antworten:
- Ist das Objekt (F1) in der Startnachricht bereits angegeben, können die Standardwerte für F2–F4 verwendet werden (Behauptung geschätzt, 183 mm, Abbildung + Caption). Frage nur nach, wenn die Entscheidung unklar ist.
- Bei „Automatik“ oder nicht angegebenen Punkten entscheidet Claude, welche Ergebnisse verwendet, wie sie angeordnet und wie sie zusammengefasst werden. Folge den „Entwurfsschritten für den Automatik-Modus“ in
references/storyboard.md. - Wird gesagt „Mach weiter ohne zu fragen“, behandle alle Punkte als Automatik.
- Text in der Abbildung und Caption sind standardmäßig Englisch (da die Veröffentlichung auf Englisch erfolgt). Die Unterhaltung erfolgt in der Sprache des Benutzers.
Schritt 3 — Abbildungsplan (Storyboard)
Lies vor dem Schreiben von Code references/storyboard.md und erstelle paper_figures/figure_plan.md im Format von assets/figure_plan_template.md. Enthalten sein müssen:
- Gesamter Ablauf des Manuskripts (Was → Wie → Warum → Leistung → Auswirkung) und die Rolle jeder Abbildung
- Für jede Abbildung: Ein-Satz-Behauptung (wird direkt zum Titel-Satz der Caption), Panel-Tabelle (Label/Inhalt/Diagrammtyp (aus
references/charts.md§1 auswählen)/Datenquelle/Hero- oder Support-Status), Mosaik und Maße, Rolle der Farben - Ergebnisse, die aus dem Haupttext ausgeschlossen werden (SI) und der Grund dafür. Verstecke keine Grenzen oder Fehlschläge, sondern platziere sie im Grenz-Panel des Haupttextes oder in SI.
- Fehlende Informationen (n, Definition der Fehlerbalken, Tests, Einheiten) als
[AUTHOR TODO]auflisten
Zeige den Plan im Chat in einer kurzen Tabelle. Im Automatik-Modus oder wenn die Anordnung den Vorgaben des Benutzers entspricht, fahre ohne Bestätigung mit dem Zeichnen fort und füge hinzu: „Der Plan kann später geändert werden.“ Halte nur an, wenn die angegebenen Ergebnisse die Behauptung nicht stützen oder die Vorgaben widersprüchlich sind, und berate dich dann.
Schritt 4 — Gemeinsamen Stil festlegen
- Kopiere
nfig.pynachpaper_figures/src/(damit die Abbildungsskripte auch ohne das Skill erneut ausgeführt werden können). - Lege für das gesamte Manuskript in einer einzigen Datei
paper_figures/figure_style.jsonfest: Methode/Bedingung → Farbe/Marker/Linientyp. Wenn die Bedeutung der Farben zwischen den Abbildungen wechselt, muss der Leser jedes Mal die Legende neu lesen. Verwende daher diese Datei für alle Abbildungen.
import style # paper_figures/src/style.py (Pfad unabhängig vom Ausführungsort)
pal = nfig.Palette.load_or_build(style.PALETTE,
proposed=["Ours"], highlight=["SOTA-X"],
baselines=["Base A", "Base B"], references=["Oracle"])
- proposed = Akzentfarbe (gedämpftes Zinnoberrot), highlight = nur die stärkste Vergleichsmethode in Blau, andere Vergleichsmethoden = Graustufen + Marker/Linientyp, reference (theoretischer Wert, Obergrenze, Zufallsniveau) = schwarze gestrichelte Linie.
- Bestehende Zuordnungen bleiben unverändert, neue Namen werden hinzugefügt. Verwende für andere Kategorien als Methoden (z.B. Datensätze) nicht dieselben Farben, sondern unterscheide durch Position, Panel-Aufteilung und Marker.
- Fasse „Anzeigekonventionen“, die für alle Abbildungen gelten, an einem Ort in
paper_figures/src/style.py(Kopie vonassets/style_template.py) zusammen und importiere sie in jedes Abbildungsskript: Name aus den Daten → Anzeigename (z.B."PISurr (ours)"→"PISurr"), Farbbereiche für Karten gleicher Größe (z.B.TEMP_LIM = (300, 345),ERR_LIM = (0, 6)), Achsenbeschriftungen mit Einheiten. Wenn dies für jede Abbildung einzeln geschrieben wird, weichen sie voneinander ab.
Schritt 5 — Zeichnung
Grundsätzlich mit nfig aus den Rohdaten neu zeichnen. Das Zusammenfügen vorhandener PNGs führt zu uneinheitlichen Schriftarten, Linienstärken und Farben, und durch die Verkleinerung werden Buchstaben schnell kleiner als 5 pt. Wähle den Diagrammtyp aus references/charts.md.
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent)) # Funktioniert von jedem Ausführungsort
import nfig
nfig.use_style() # Arial 7/6 pt, 0,5 pt Achsen, TrueType 42
fig, axd = nfig.figure("double", 120, mosaic="aab;cde") # Zeichne in der endgültigen Veröffentlichungsgröße
# ... jede Panel (Rezepte aus charts.md) ...
nfig.shared_legend(fig, pal.handles(["Ours", "SOTA-X", "Base A"])) # Eine Legende für die gesamte Abbildung
nfig.label_panels(fig, axd) # Zuletzt aufrufen: a, b, c… 8 pt fett, ausgerichtet nach Zeilen/Spalten
nfig.save(fig, "paper_figures/fig2") # .pdf/.svg/.png + Bericht der automatischen QA
label_panels legt das Layout endgültig (fixiert) fest. Füge daher Legenden, Anmerkungen und Farbbalken immer davor hinzu.
- 1 Abbildung = 1 Skript (
paper_figures/src/fig2.py). Stelle sicher, dass das Laden der Daten bis zum Speichern reproduzierbar ist. - Zeichne in der endgültigen Größe; verkleinere später nicht. Verwende
bbox_inches="tight"nicht, da sich die Breite ändert. - Platziere das Hero-Panel am größten und entweder oben links oder in der obersten Reihe. Gleiche Diagrammtypen in Größe, Achsenbereich und Skalierung angleichen.
- Für Abbildungen mit unterschiedlichen Panel-Typen pro Zeile (z.B. Band mit Schema / Spalte mit Bildern/Karten / Diagramme) verwende nicht ein einziges Mosaik, sondern
nfig.figure("double", 120, rows=[("a", 0.8), ("bcdef", 1), ("g", 1)]), um die Panels zeilenweise anzuordnen. Bei einem einzigen Gitter wird der Rand für die Skalenbeschriftungen einer Spalte auch auf andere Zeilen derselben Spalte angewendet, was Bilder oder Karten quetscht. Bei gleichartigen Zeilen bleibt ein einziges Mosaik erhalten (die Spaltenenden sind ausgerichtet). - Für Felder wie Temperatur- oder Fehlerkarten verwende
nfig.field(Farbbereich aus den gemeinsamen Werten in style.py) +nfig.colorbar, für gleiche Größen eine einzige Farbbalken. Fotos/Mikroskopiebilder mitnfig.image_panel. - Panels, die nicht neu gezeichnet werden können (Übersichtsdiagramme aus externen Tools, Mikroskopiebilder, nicht mehr vorhandene Daten):
- Bei wenigen solcher Panels: Mit
nfig.image_panel(ax, path)einbetten (wird Raster). - Sollen sie als Vektorgrafik zusammengefügt werden, verwende
scripts/assemble.py, um mit nfig gezeichnete Panel-PDFs mit externen PDFs zu kombinieren (sieheassets/layout_example.json; Pfade relativ zur JSON). Zeichne die nfig-Panels in denselben Maßen (mm) wie die Zielzelle und halte den Skalierungsfaktor ≈1. Passe die Zellenverhältnisse und Höhen an, bis die Meldungen „text below 5 pt“, „below 300 dpi“ und „cell mostly empty“ verschwinden. - Teile dem Benutzer mit, warum eine Neuerstellung nicht möglich war und dass eine Nachbesserung mit den Rohdaten erfolgen kann.
- Bei wenigen solcher Panels: Mit
- Integrität der Daten: Werte nicht verändern, keine günstigen Teile selektieren, Balken von Null zeichnen, Achsen nicht stauchen, um Unterschiede zu übertreiben. Bilder nur mit einheitlichen Anpassungen und Zuschnitt bearbeiten (keine Teilbearbeitung, Compositing oder KI-Bildbearbeitung zulässig).
Schritt 6 — QA und Korrekturschleife (mindestens 2 Durchgänge)
- Automatische Prüfung: Zusätzlich zum Bericht von
nfig.saveausführen:python <SKILL_DIR>/scripts/check_figure.py paper_figures/fig2.pdf. ERROR muss immer beseitigt werden; WARN darf nur bei Absicht bestehen bleiben, dann mit Begründung. - Sichtprüfung: Lies
paper_figures/qa/fig2_preview.png(in endgültiger Größe) undfig2_access.png(Protanopie/Deuteranopie, Graustufen) per Read und überprüfe die finale Checkliste ausreferences/guidelines.md. Insbesondere: Ist die Behauptung in 3 Sekunden verständlich? Ist das Hero am auffälligsten? Ist das Lesen von oben links nach unten rechts möglich? Überlappungen/Überstände von Text/Linien, fehlende Ausrichtung? Sinnlose Leerräume oder zu enge Anordnung? Sind die Unterscheidungen auch bei Farbenblindheit oder in Graustufen erkennbar? - Korrigieren und neu generieren, dann erneut prüfen. Frage dich abschließend aus der Perspektive eines Gutachters: „Reichen diese Abbildung und Caption für die Behauptung aus?“
Schritt 7 — Caption, Tabelle und Lieferung
- Schreibe die Caption im Format von
references/captions-tables.mdinpaper_figures/captions.md(fett gedruckter Titelsatz = Behauptung → dann der Reihe nach jede Panel → Definition von Symbolen, Farben, Abkürzungen → n, Fehlerbalken, Tests). - Für genaue Zahlenvergleiche: Tabelle mit
scripts/make_table.py(booktabs, keine vertikalen Linien, nur beste Werte fett). Lange Daten im Format „eine Zeile pro Seed“ können mit--groupbyund--statdirekt zu Mittelwert ± s.d. und n aggregiert werden. - Benachrichtigung des Benutzers: Liste der erstellten Dateien, Behauptungen und Panel-Konfiguration jeder Abbildung, an SI verschobene Ergebnisse mit Begründung,
[AUTHOR TODO](unbestätigte statistische Informationen usw.), verbleibende WARN mit Begründung.
Standard-Ausgabeplatzierung (Standard)
Um eine Vermischung mit vorhandenen Dateien des Benutzers (z.B. figures/) und Überschreiben zu vermeiden, werden alle Ausgaben unter paper_figures/ zusammengefasst. Falls der Benutzer einen anderen Ort angibt, folge diesem.
paper_figures/
├── figure_plan.md figure_style.json captions.md
├── src/ nfig.py, fig1.py, fig2.py, ...
├── fig1.pdf .svg .png, fig2.*, ...
├── tables/ table1.tex, table1.md
├── qa/ *_preview.png, *_access.png
└── _inventory/ inventory.md, contact_sheet_*.png
Bei Unsicherheit
- Entscheide, was gezeigt wird, danach, ob es als Beweis für die Behauptung dient. Ergebnisse, die keine Beweise liefern, wandern – egal wie aufwendig sie waren – in die SI.
- Bei numerischen Verbesserungen immer ein konkretes Beispiel dafür geben, was sie tatsächlich bedeuten.
- Zeige nicht nur die besten Ergebnisse, sondern auch Anwendungsbedingungen, Grenzen und Fehlschläge – das erhöht die Glaubwürdigkeit der Behauptung.
- Bei Unsicherheit wähle die einfachere Variante: Weniger Farben, weniger Text (Erklärung in die Caption), Legenden teilen.