From sciagent-skills
Guides PNAS figure preparation: 300-1000 PPI resolution checks, TIFF/EPS/PDF formats, RGB-only color, Arial/Helvetica fonts, italic uppercase labels. Python examples with Pillow/Matplotlib.
npx claudepluginhub jaechang-hits/sciagent-skills --plugin sciagent-skillsThis skill uses the workspace's default tool permissions.
This guide provides the complete specifications for preparing figures for submission to **PNAS** (Proceedings of the National Academy of Sciences). PNAS is notable for its **strict RGB-only policy** (CMYK submissions are returned), **italicized uppercase panel labels**, and **automated image screening software**.
Guides Science (AAAS) journal figure preparation: checks resolution (150-300+ DPI) with Pillow, sizes Matplotlib plots for journal layouts, ensures PDF/EPS/TIFF formats, RGB color, fonts, and manipulation disclosure.
Critiques academic figures for format, colorblind safety, legibility, overplotting, category count, resolution, and vector/raster suitability before paper submission.
Produces publication-ready 2D graphics with proper DPI, color profiles, typography, and export formats for academic journals, print, web, and presentations.
Share bugs, ideas, or general feedback.
This guide provides the complete specifications for preparing figures for submission to PNAS (Proceedings of the National Academy of Sciences). PNAS is notable for its strict RGB-only policy (CMYK submissions are returned), italicized uppercase panel labels, and automated image screening software.
Official reference: https://www.pnas.org/author-center/submitting-your-manuscript
| Image Type | Minimum Resolution | Notes |
|---|---|---|
| Halftones (color/grayscale photos) | 300 PPI | At publication size |
| Combination artwork (MS Office) | 600-900 DPI | Mixed text and images |
| Line art (bitmap text/thin lines) | 1,000 PPI | At publication size |
| LaTeX figures | — | High-quality PDF or EPS |
from PIL import Image
def check_pnas_resolution(image_path, image_type='halftone'):
"""Check if image meets PNAS resolution requirements.
Args:
image_type: 'halftone' (300), 'combination' (600), or 'lineart' (1000)
"""
min_ppi = {'halftone': 300, 'combination': 600, 'lineart': 1000}
required = min_ppi.get(image_type, 300)
img = Image.open(image_path)
dpi = img.info.get('dpi', (72, 72))
print(f"Type: {image_type} | Required: {required} PPI | Actual: {dpi[0]} PPI")
if dpi[0] >= required:
print("PASS")
else:
print(f"FAIL: Need {required} PPI minimum")
return dpi[0] >= required
| Format | Accepted |
|---|---|
| TIFF | Yes (preferred for raster) |
| EPS | Yes (fonts must be embedded) |
| Yes (fonts must be embedded) | |
| PPT | Yes |
| 3D images | PRC or U3D with 2D representation (TIFF/EPS/PDF) |
IMPORTANT: Provide images at final publication size, not full-page size.
| Layout | Width |
|---|---|
| 1 column | 8.7 cm (3.43 in) |
| 1.5 columns | 11.4 cm (4.5 in / 27 picas) |
| 2 columns | 17.8 cm (7.0 in / 42.125 picas) |
| Maximum height | 22.5 cm (9 in / 54 picas) |
import matplotlib.pyplot as plt
PNAS_WIDTHS = {
'single': 8.7 / 2.54, # 3.43 inches
'middle': 11.4 / 2.54, # 4.49 inches
'double': 17.8 / 2.54, # 7.01 inches
}
PNAS_MAX_HEIGHT = 22.5 / 2.54 # 8.86 inches
def create_pnas_figure(layout='single', aspect_ratio=0.75):
"""Create a Matplotlib figure sized for PNAS."""
width = PNAS_WIDTHS[layout]
height = min(width * aspect_ratio, PNAS_MAX_HEIGHT)
fig, ax = plt.subplots(figsize=(width, height))
fig.set_dpi(300)
return fig, ax
from PIL import Image
def validate_pnas_color_mode(image_path):
"""PNAS strictly requires RGB. CMYK will be rejected."""
img = Image.open(image_path)
if img.mode == 'CMYK':
print("REJECTED: PNAS does not accept CMYK images")
print("Action: Convert to RGB before submission")
return False
elif img.mode in ('RGB', 'RGBA'):
print("PASS: Image is in RGB mode")
return True
else:
print(f"WARNING: Unexpected mode '{img.mode}'; convert to RGB")
return False
def convert_to_rgb(image_path, output_path):
"""Convert any image to RGB for PNAS submission."""
img = Image.open(image_path)
if img.mode != 'RGB':
img = img.convert('RGB')
print(f"Converted from {img.mode} to RGB")
img.save(output_path)
| Element | Specification |
|---|---|
| Approved fonts | Arial, Helvetica, Times, Symbol, Mathematical Pi, European Pi |
| Font size | 6-8 pt at final publication size (minimum 2 mm when printed) |
| Consistency | Same font for all figures in manuscript |
| Text type | Vector text preferred (scales cleanly) |
| Embedding | All fonts must be embedded in EPS and PDF files |
import matplotlib.pyplot as plt
def set_pnas_fonts():
"""Configure Matplotlib for PNAS figure fonts."""
plt.rcParams.update({
'font.family': 'sans-serif',
'font.sans-serif': ['Arial', 'Helvetica'],
'font.size': 7,
'axes.labelsize': 7,
'axes.titlesize': 7,
'xtick.labelsize': 6,
'ytick.labelsize': 6,
'legend.fontsize': 6,
})
def add_pnas_panel_labels(fig, axes):
"""Add PNAS-style italicized uppercase panel labels."""
import string
if not hasattr(axes, '__iter__'):
axes = [axes]
for i, ax in enumerate(axes):
label = string.ascii_uppercase[i]
ax.text(-0.1, 1.1, label,
transform=ax.transAxes,
fontsize=8,
fontstyle='italic',
fontweight='bold',
va='top',
ha='right',
fontfamily='Arial')
PNAS uses screening software to detect:
from PIL import Image
import os
def validate_pnas_figure(image_path, image_type='halftone', layout='single'):
"""Full validation of a figure against PNAS requirements."""
img = Image.open(image_path)
issues = []
# 1. Resolution check
min_ppi = {'halftone': 300, 'combination': 600, 'lineart': 1000}
required = min_ppi.get(image_type, 300)
dpi = img.info.get('dpi', (72, 72))
if dpi[0] < required:
issues.append(f"Resolution {dpi[0]} PPI below {required} PPI for {image_type}")
# 2. STRICT RGB check
if img.mode == 'CMYK':
issues.append("REJECTED: CMYK not accepted. Must convert to RGB")
elif img.mode not in ('RGB', 'RGBA'):
issues.append(f"Color mode '{img.mode}' not standard; use RGB")
# 3. Dimension check at publication size
widths_cm = {'single': 8.7, 'middle': 11.4, 'double': 17.8}
max_height_cm = 22.5
if layout in widths_cm and dpi[0] > 0:
actual_w_cm = (img.size[0] / dpi[0]) * 2.54
actual_h_cm = (img.size[1] / dpi[1]) * 2.54
target_w = widths_cm[layout]
if actual_h_cm > max_height_cm:
issues.append(f"Height {actual_h_cm:.1f} cm exceeds max {max_height_cm} cm")
print(f"Print size: {actual_w_cm:.1f} x {actual_h_cm:.1f} cm (target width: {target_w} cm)")
# 4. Format check
fmt = img.format
accepted = ['TIFF', 'EPS', 'PDF', 'PNG', 'JPEG']
if fmt and fmt.upper() not in accepted:
issues.append(f"Format '{fmt}' not in preferred list (TIFF, EPS, PDF)")
# Report
print(f"=== PNAS Figure Validation ===")
print(f"Dimensions: {img.size[0]} x {img.size[1]} px")
print(f"DPI: {dpi[0]} x {dpi[1]}")
print(f"Color mode: {img.mode}")
if issues:
print(f"\nISSUES FOUND ({len(issues)}):")
for issue in issues:
print(f" - {issue}")
else:
print("\nAll checks PASSED")
return len(issues) == 0
PNAS enforces one of the strictest color mode policies in scientific publishing. CMYK submissions are returned without review. Authors must submit all figures in RGB color mode and tag images with their originating ICC profile to ensure accurate RGB-to-CMYK conversion by the journal's production team.
PNAS uses PPI (pixels per inch) rather than DPI and defines three tiers: 300 PPI for halftones (photographs), 600-900 DPI for combination artwork (mixed text and images from MS Office), and 1,000 PPI for line art (bitmap text and thin lines). Images must meet these thresholds at final publication size.
PNAS employs screening software that automatically detects signs of inappropriate image manipulation including cloning/pasting artifacts, suspicious contrast adjustments, and inconsistent background pixelation. This automated screening supplements editorial review and can flag issues that manual inspection might miss.
What color mode is your image?
├── CMYK → REJECTED (convert to RGB before submission)
├── RGB → Accepted
│ └── ICC profile tagged? → Recommended for accurate print conversion
└── Grayscale → Convert to RGB
What type of image?
├── Halftone (photo/micrograph) → 300 PPI minimum
├── Combination (MS Office mixed) → 600-900 DPI
├── Line art (bitmap text/lines) → 1,000 PPI
└── LaTeX figure → High-quality PDF or EPS
What submission stage?
├── Initial → Single PDF with all content (format-neutral)
└── Production → Separate high-resolution figure uploads
| Scenario | Format | Resolution | Color Mode |
|---|---|---|---|
| Micrograph | TIFF | 300 PPI | RGB (ICC tagged) |
| PowerPoint chart | PPT or TIFF | 600-900 DPI | RGB |
| Schematic diagram | EPS or PDF | Vector or 1,000 PPI | RGB |
| Gel/blot image | TIFF | 300 PPI | RGB |
| 3D molecular model | PRC/U3D + TIFF | 300 PPI (2D fallback) | RGB |
fontstyle='italic' in matplotlib or the italic setting in Illustrator for panel labelsBefore submitting figures to PNAS, verify: