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:
development
Bulk RNA-seq DE with R/Bioconductor DESeq2. Negative binomial GLM, empirical Bayes shrinkage, Wald/LRT tests, multi-factor designs, Salmon tximeta import, apeglm LFC shrinkage, MA/volcano/heatmap viz. R gold standard. Use pydeseq2-differential-expression for Python; use edgeR for TMM normalization.
tools
Guide to quality filtering raw VCF files before computing summary stats (Ts/Tv ratio, variant counts, AF distributions). Covers detecting raw VCFs via FILTER column and QUAL inspection, QUAL-based filtering with bcftools, Ts/Tv interpretation, and when NOT to filter. Read before any variant-level QC task. See bcftools-variant-manipulation for advanced filters, gatk-variant-calling for caller config, samtools-bam-processing for upstream alignment QC.
tools
Annotate and filter VCF variants with SnpEff and SnpSift. SnpEff predicts functional effects (HIGH/MODERATE/LOW/MODIFIER), genes, transcripts, AA changes, HGVS; SnpSift filters and adds ClinVar/dbSNP. Java CLI with Python subprocess integration. Use ANNOVAR for multi-database annotation; Ensembl VEP for REST API; SnpEff for fast CLI with pre-built genomes.
tools
GWAS and population genetics tool. Processes PLINK (.bed/.bim/.fam), VCF, and BGEN; runs QC (MAF, HWE, missingness), IBD estimation, PCA, and linear/logistic regression GWAS. Outputs Manhattan-ready summary stats. Use regenie or SAIGE for biobanks (>100k samples) needing mixed models.