Skip to content
Development
Skill

/pnas-figure-guide

PNAS figure preparation: resolution (300-1000 PPI), formats (TIFF/EPS/PDF), strict RGB-only color, Arial/Helvetica fonts, italicized uppercase panel labels, automated image screening.

From plugin
sciagent-skills
364200 skills
Install
$ npx -y skills add jaechang-hits/SciAgent-Skills --skill pnas-figure-guide --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/pnas-figure-guide

Context preview

The summary Claude sees to decide when to auto-load this skill.

PNAS figure preparation: resolution (300-1000 PPI), formats (TIFF/EPS/PDF), strict RGB-only color, Arial/Helvetica fonts, italicized uppercase panel labels, automated image screening.

SKILL.md

pnas-figure-guide.SKILL.md
name: pnas-figure-guide
description: "PNAS figure preparation: resolution (300-1000 PPI), formats (TIFF/EPS/PDF), strict RGB-only color, Arial/Helvetica fonts, italicized uppercase panel labels, automated image screening."
license: CC-BY-4.0
compatibility: Python 3.10+, Pillow, Matplotlib
metadata:
  authors: HITS
  version: "1.0"

PNAS Figure Preparation Guide

Overview

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

---

Resolution Requirements

| 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

---

File Format

| Format | Accepted | |---|---| | **TIFF** | Yes (preferred for raster) | | **EPS** | Yes (fonts must be embedded) | | **PDF** | Yes (fonts must be embedded) | | **PPT** | Yes | | **3D images** | PRC or U3D with 2D representation (TIFF/EPS/PDF) |

Submission Stages

  • **Initial submission**: Format-neutral — single PDF containing full manuscript, figures, and SI. High-resolution files not required.
  • **Production phase**: Separate high-resolution figure uploads required.

---

Figure Size and Dimensions

**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

---

Color Mode

CRITICAL: RGB Only

  • **Submit in RGB color mode ONLY**
  • **CMYK submissions will be returned for correction**
  • Tag RGB images with originating ICC profile for accurate RGB-to-CMYK conversion
  • PNAS manages print conversion using calibrated profiles
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)

---

Font Requirements

| 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 |

Panel Labels (PNAS-Specific Convention)

  • **Italicized uppercase letters**: *A*, *B*, *C*, *D*, ...
  • This is a distinctive PNAS convention — different from most other journals
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')

---

Labeling Conventions

  • Panel labels: **Italicized uppercase** (*A*, *B*, *C*)
  • All text, numbers, letters, symbols: **6-12 pt (2-6 mm)** after reduction
  • Text
Read more
Ships withsciagent-skills

Turn your AI coding agent into a life sciences expert — 199 bioinformatics skills for Claude Code covering RNA-seq, single-cell analysis, genomics, proteomics, drug discovery, and more. Boosted BixBench from 65% to 92%. Open source.

Get the whole plugin

Other skills on sciagent-skills.