skills/scientific-writing/cell-figure-guide/SKILL.md
Cell (Cell Press) figure preparation: resolution (300-1000 DPI), formats (TIFF/PDF), RGB color, Avenir/Arial fonts, uppercase panel labels, strict image manipulation policies.
npx skillsauth add jaechang-hits/sciagent-skills cell-figure-guideInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This guide provides the complete specifications for preparing figures for submission to Cell and other Cell Press journals (e.g., Cell Stem Cell, Cell Reports, Molecular Cell). Cell Press has strict figure requirements and a rigorous image integrity policy.
Official reference: https://www.cell.com/information-for-authors/figure-guidelines
| Image Type | Minimum Resolution | Notes | |---|---|---| | Color / Grayscale photographs | 300 DPI | At desired print size | | Black-and-white images | 500 DPI | At desired print size | | Line art (graphs, diagrams) | 1,000 DPI | At desired print size |
IMPORTANT: All resolution measurements are at the desired print size, not at full-page size.
from PIL import Image
def check_cell_resolution(image_path, image_type='color'):
"""Check if image meets Cell journal resolution requirements.
Args:
image_path: Path to the image file
image_type: 'color' (300 DPI), 'bw' (500 DPI), or 'lineart' (1000 DPI)
"""
min_dpi = {'color': 300, 'bw': 500, 'lineart': 1000}
required = min_dpi.get(image_type, 300)
img = Image.open(image_path)
dpi = img.info.get('dpi', (72, 72))
print(f"Image type: {image_type}")
print(f"Required DPI: {required}")
print(f"Actual DPI: {dpi[0]} x {dpi[1]}")
if dpi[0] >= required:
print("PASS: Resolution meets Cell requirements")
else:
print(f"FAIL: Need at least {required} DPI, got {dpi[0]}")
return dpi[0] >= required
| Format | Best For | Notes | |---|---|---| | TIFF | Bitmap, grayscale, color images | Use LZW compression to reduce size | | PDF | Any figure type | Universally accepted | | EPS | Vector images (graphs, diagrams) | Preserves scalability |
| Layout | Width | |---|---| | 1 column | 85 mm (3.35 in) | | 1.5 columns | 114 mm (4.49 in) | | Full width | 174 mm (6.85 in) |
| Layout | Width | |---|---| | 1 column | 55 mm (2.17 in) | | 2 columns | 114 mm (4.49 in) | | Full width | 174 mm (6.85 in) |
| Layout | Width | |---|---| | 1 column | 112 mm (4.41 in) | | Full width | 172 mm (6.77 in) |
All figures must fit on a single 8.5" x 11" page.
import matplotlib.pyplot as plt
# Cell Press figure widths in inches
CELL_WIDTHS = {
'2col_single': 85 / 25.4, # 3.35 in
'2col_1.5': 114 / 25.4, # 4.49 in
'2col_full': 174 / 25.4, # 6.85 in
'3col_single': 55 / 25.4, # 2.17 in
'3col_double': 114 / 25.4, # 4.49 in
'3col_full': 174 / 25.4, # 6.85 in
}
def create_cell_figure(layout='2col_single', aspect_ratio=0.75):
"""Create a Matplotlib figure sized for Cell Press journals."""
width = CELL_WIDTHS[layout]
height = width * aspect_ratio
fig, ax = plt.subplots(figsize=(width, height))
fig.set_dpi(300)
return fig, ax
from PIL import Image
def convert_to_rgb_for_cell(image_path, output_path):
"""Convert image to RGB for Cell Press submission."""
img = Image.open(image_path)
if img.mode == 'CMYK':
img = img.convert('RGB')
print("Converted from CMYK to RGB")
elif img.mode != 'RGB':
img = img.convert('RGB')
print(f"Converted from {img.mode} to RGB")
img.save(output_path)
return output_path
| Element | Font | Size | |---|---|---| | Primary font | Avenir (preferred), Arial, Helvetica | — | | Figure text | — | ~7 pt at print size | | Panel labels | — | Bold, capital letters |
import matplotlib.pyplot as plt
def set_cell_fonts():
"""Configure Matplotlib for Cell Press figure fonts."""
plt.rcParams.update({
'font.family': 'sans-serif',
'font.sans-serif': ['Avenir', 'Arial', 'Helvetica'],
'font.size': 7,
'axes.labelsize': 7,
'axes.titlesize': 7,
'xtick.labelsize': 6,
'ytick.labelsize': 6,
'legend.fontsize': 6,
})
import matplotlib.pyplot as plt
import string
def add_cell_panel_labels(fig, axes):
"""Add Cell-style uppercase bold panel labels."""
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,
fontweight='bold',
va='top',
ha='right',
fontfamily='Arial')
from PIL import Image
import os
def validate_cell_figure(image_path, image_type='color', layout='2col_single'):
"""Full validation of a figure against Cell Press requirements."""
img = Image.open(image_path)
issues = []
# 1. Resolution check
min_dpi = {'color': 300, 'bw': 500, 'lineart': 1000}
required_dpi = min_dpi.get(image_type, 300)
dpi = img.info.get('dpi', (72, 72))
if dpi[0] < required_dpi:
issues.append(f"Resolution {dpi[0]} DPI below minimum {required_dpi} DPI for {image_type}")
# 2. Color mode check
if img.mode != 'RGB':
issues.append(f"Color mode is {img.mode}; Cell requires RGB submission")
# 3. File size check
size_mb = os.path.getsize(image_path) / (1024 * 1024)
if size_mb > 20:
issues.append(f"File size {size_mb:.1f} MB exceeds 20 MB limit")
# 4. Dimension check (width in mm)
widths_mm = {
'2col_single': 85, '2col_1.5': 114, '2col_full': 174,
'3col_single': 55, '3col_double': 114, '3col_full': 174,
}
if layout in widths_mm and dpi[0] > 0:
max_width_mm = widths_mm[layout]
actual_width_mm = (img.size[0] / dpi[0]) * 25.4
print(f"Width at current DPI: {actual_width_mm:.1f} mm (target: {max_width_mm} mm)")
# Report
print(f"=== Cell Figure Validation: {os.path.basename(image_path)} ===")
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}")
print(f"File size: {size_mb:.1f} MB")
if issues:
print(f"\nISSUES FOUND ({len(issues)}):")
for issue in issues:
print(f" - {issue}")
else:
print("\nAll checks PASSED")
return len(issues) == 0
Cell Press uses a three-tier resolution system: 300 DPI for color/grayscale photographs, 500 DPI for black-and-white images, and 1,000 DPI for line art. All measurements are at the desired print size, not at arbitrary large dimensions. This tiered approach ensures each image type reproduces at appropriate quality.
Cell Press journals use different column layouts depending on the journal. Two-column journals (Cell, Molecular Cell) use 85/114/174 mm widths. Three-column journals use 55/114/174 mm. Other journals (Chem, Joule) use 112/172 mm. Sizing figures to the correct column width prevents unwanted rescaling.
Cell Press enforces one of the strictest image integrity policies in biomedical publishing. The use of Photoshop clone/heal tools on scientific images is explicitly prohibited. Any single-channel color alterations must be disclosed in both the figure legend and Methods section.
What type of image are you preparing?
├── Color or grayscale photograph → 300 DPI minimum
│ ├── Micrograph → TIFF (LZW compression)
│ └── Clinical image → TIFF or PDF
├── Black-and-white image → 500 DPI minimum
│ └── High-contrast micrograph → TIFF
├── Line art (graph, diagram) → 1,000 DPI minimum
│ ├── Vector source → Export as PDF or EPS
│ └── Raster source → Export TIFF at 1,000 DPI
└── Which journal layout?
├── Cell, Molecular Cell → 2-column (85/114/174 mm)
├── Cell Reports → 3-column (55/114/174 mm)
└── Chem, Joule, Matter → Single/full (112/172 mm)
| Scenario | Format | Resolution | Width | |---|---|---|---| | Fluorescence micrograph | TIFF (LZW) | 300 DPI | Journal-specific column | | Western blot | TIFF | 500 DPI | Single column (85 mm) | | Bar chart or scatter plot | PDF or EPS | 1,000 DPI (if rasterized) | Varies by data density | | Gel electrophoresis | TIFF | 500 DPI | Full width if multi-lane | | Pathway diagram | PDF or EPS | Vector | Full width (174 mm) |
Before submitting figures to Cell, verify:
tools
Fast short-read DNA aligner for WGS/WES/ChIP-seq. 2× faster BWA-MEM successor; outputs SAM/BAM with read group headers for GATK. Primary plus supplementary records for chimeric reads. Use STAR for RNA-seq splice-aware alignment; Bowtie2 is a comparable alternative.
tools
smina molecular docking CLI. AutoDock Vina fork with customizable scoring functions, native SDF/MOL2/PDB ligand input, autoboxing, local energy minimization, and per-atom score breakdowns. Pipeline: receptor PDBQT prep -> ligand prep (RDKit/OpenBabel) -> dock via autobox or explicit grid -> rescore/minimize with custom scoring -> rank poses by affinity. Choose smina over Vina when you need custom scoring terms (--custom_scoring), local optimization of an existing pose (--local_only), per-atom contributions (--atom_term_data), or SDF/MOL2 ligands without manual PDBQT conversion. For unknown binding sites use diffdock-blind-docking; for the Python-bindings/Vinardo workflow use autodock-vina-docking.
development
mdtraj molecular dynamics trajectory analysis (Python). Reads DCD/XTC/TRR/NetCDF/H5/PDB topologies and trajectories; computes RMSD vs time, radius of gyration, per-residue RMSF, residue-residue contact frequency maps, phi/psi torsions for Ramachandran plots (general + Gly/Pro), and 8-state DSSP secondary structure. Modules: trajectory I/O, geometry (distances/angles/dihedrals), structural analysis (RMSD/Rg/RMSF/SASA), contacts, hydrogen bonds, secondary structure (DSSP), NMR observables. For broader atom-selection grammar use mdanalysis-trajectory; for running MD simulations use OpenMM/GROMACS.
development
Programmatic PubMed access via NCBI E-utilities REST API. Covers Boolean/MeSH queries, field-tagged search, endpoints (ESearch, EFetch, ESummary, EPost, ELink), history server for batches, citation matching, systematic review strategies. Use for biomedical literature search or automated pipelines.