skills/scientific-visualization/references/publication_guidelines.md
Reviewed 2026-07-23. These are general scientific-communication principles, not publisher requirements. Date-sensitive rules belong in journal_requirements.md. Source IDs resolve in sources.md.
Keep three layers separate:
Do not overwrite raw images or tabular data. Keep native-resolution images. Upsampling changes pixel count, not information; PLOS, Science, Nature, Cell Press, Elsevier, and IEEE explicitly warn against treating it as improved quality [PLOS-FIG] [SCIENCE-REVISED] [NATURE-FINAL] [CELL-FIG] [ELSEVIER-SIZE] [IEEE-SIZE].
For experimental/observational images:
The bundled exporter can write a provenance manifest, but it cannot confirm that supplied provenance is complete.
errorbar="sd", "se", "pi", "ci", tuples such as ("ci", 95), or a callable; bootstrap results vary unless seed is set [SEABORN-ERROR].bad colormap color.SymLogNorm/a symmetric log axis with a disclosed linear region; for unequal ranges around a meaningful center, consider TwoSlopeNorm [MPL-NORM].Normalize, LogNorm, CenteredNorm, SymLogNorm, TwoSlopeNorm, and BoundaryNorm encode different assumptions [MPL-NORM].Prefer aligned panels or normalized/common-unit displays. Dual y-axes can make unrelated series appear correlated because each range can be tuned independently. If unavoidable:
Match the palette to data:
Use hue consistently across a manuscript. Avoid rainbow maps for ordered data unless there is a documented scientific reason and the map has been evaluated for perceptual artifacts. Paul Tol explains why ordinary rainbow schemes create false transitions and fail for some color-vision conditions [TOL].
Color is not a sufficient encoding:
See color_palettes.md and run scripts/palette_audit.py.
WCAG 2.2 is a web-content standard, not a journal-print specification. It provides useful targets for figures delivered on the web [WCAG22]:
For web/interactive figures also provide:
Passing a palette ratio audit does not prove WCAG conformance; applicability depends on rendered context and alternatives.
layout="constrained" handles nested grids and colorbars; calling tight_layout() disables constrained layout [MPL-LAYOUT].bbox_inches="tight" can alter physical page dimensions, so do not use it when exact page width is required [MPL-SAVE].PDF/SVG/EPS are useful for text and line art, but a vector container may include rasterized artists. DPI still controls those raster elements [MPL-SAVE]. Dense scatter plots can be selectively rasterized to control file size while preserving vector text/axes.
For Matplotlib:
import matplotlib as mpl
mpl.rcParams["pdf.fonttype"] = 42
mpl.rcParams["ps.fonttype"] = 42
mpl.rcParams["svg.fonttype"] = "none"
PDF/PS Type 42 embeds TrueType fonts. svg.fonttype="none" leaves text as text and therefore depends on font availability; svg.fonttype="path" trades editability/searchability for appearance portability [MPL-STYLE]. Inspect the delivered file rather than assuming font behavior.
Required pixel width is:
pixels = final width (inches) × target pixels per inch
Embedded DPI metadata alone does not add detail. TIFF/PNG are lossless choices; JPEG can be accepted by some publishers for photographs but is a poor choice for line art or text because it is lossy. Preserve original bit depth and color profile when scientifically important.
Transparency can reveal an unintended background or change apparent contrast. Matplotlib's transparent=True makes axes patches transparent and, unless explicitly overridden, the figure patch too [MPL-SAVE]. Prefer an explicit opaque background for submission unless the destination requires transparency.
write_html() preserves interaction and is self-contained by default; that embeds Plotly.js and creates a large file. include_plotlyjs and full_html=False change portability and embedding behavior [PLOTLY-HTML].write_image() uses Kaleido and supports PNG, JPEG, WebP, SVG, and PDF. Width/height are logical pixels; scale changes physical output pixel count, not a journal DPI declaration [PLOTLY-STATIC].