Menu

Education12 min read

How to Create Figures That Pass Peer Review (First Time)

By Francesco Villasmunta
How to Create Figures That Pass Peer Review (First Time)

Your figures are the first thing reviewers evaluate. Before they read a word of your methods section, they look at the plots. Poor figures signal poor science - even when the data is solid.

This guide covers the four pillars reviewers use to evaluate figures: clarity, integrity, accessibility, and compliance.

The Four Pillars

0.Live Code: Peer-Review-Ready Figure

1.Clarity: Does It Communicate?

2.Integrity: Is It Honest?

3.Accessibility: Can Everyone Read It?

4.Compliance: Does It Meet Specs?

0. Live Code: Peer-Review-Ready Figure

A dose-response curve with Hill equation fit demonstrating every element reviewers look for: error bars (SEM), clear labels with units, EC50 annotation, and clean formatting.

Live Code Editor
Code EditorPython
Loading editor...
Live Preview

Preparing preview

Running once automatically on first load

Learn by Experimenting

This is a safe playground for learning! Try changing:

  • • Colors: Modify color values to see different palettes
  • • Numbers: Adjust sizes, positions, or data ranges
  • • Labels: Update titles, axis names, or legends

Edit the code, run it, then open the full data visualization tool to continue with your own dataset.

1. Clarity: Does Your Figure Communicate?

Axis Labels with Units

Every axis needs a label with units in parentheses: 'Concentration (uM)', not just 'Concentration' or 'x'.

Legible Font Sizes

Text must be readable at the final printed size. Minimum 8pt for annotations, 10-12pt for labels. Test at 50% zoom.

Appropriate Chart Type

Bar chart for categorical comparisons, scatter for correlations, line for time series. Mismatched chart types confuse readers.

Minimal Chart Junk

Remove gridlines, background colors, 3D effects, and decorative elements that do not encode data.

2. Integrity: Is Your Figure Honest?

Show Error Bars

Every data point from replicates must show variability. State clearly: SD, SEM, or 95% CI - and always include n.

Y-Axis Starts at Zero (Usually)

Bar charts must start at zero. Line charts can start elsewhere if justified, but never truncate to exaggerate effects.

No Cherry-Picking

Show all data points, including outliers. If you exclude points, document the criterion used.

Common Rejection Reason

ā€œError bars are missing or not definedā€ is one of the top reasons reviewers flag figures. Always state what your error bars represent in the figure legend.

3. Accessibility: Can Everyone Read It?

Colorblind-Safe Palettes

~8% of males have color vision deficiency. Use blue/orange instead of red/green. Test with Coblis simulator.

Redundant Encoding

Do not rely on color alone. Use different markers (circles vs squares), line styles (solid vs dashed), or patterns.

Sufficient Contrast

Lines and markers must be distinguishable on both screen and grayscale print. Test by printing in B&W.

4. Compliance: Does It Meet Journal Specs?

Resolution: 300 DPI Minimum

Most journals require 300 DPI for raster images. Vector formats (SVG, PDF) are resolution-independent and always preferred.

Color Mode: CMYK for Print

RGB colors can shift during CMYK conversion. Check your reds and greens - they shift most.

File Format: TIFF or PDF

Nature prefers TIFF, Science accepts PDF. Check your target journal's author guidelines.

Dimensions: Single or Double Column

Single column = 89mm, double = 183mm for most journals. Design at final size.

For a quick-reference table of specs across top journals, see the Journal Figure Requirements Cheat Sheet.

Chart gallery

Publication-ready chart templates

Start from these professionally-formatted chart types used in top journals.

Browse all chart types →
Scatter plot of height vs weight colored by gender with regression line
Statistical•matplotlib, seaborn
From the chart gallery•Correlation analysis between metrics

Scatterplot

Displays values for two variables as points on a Cartesian coordinate system.

Sample code / prompt

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import pandas as pd

# Generate sample data
np.random.seed(42)
n_samples = 200
height = np.random.normal(170, 8, n_samples)
weight = height * 0.6 + np.random.normal(0, 8, n_samples) - 50
Bar chart comparing average scores across 5 groups with error bars
Comparison•matplotlib, seaborn
From the chart gallery•Comparing performance across categories

Bar Chart

Compares categorical data using rectangular bars with heights proportional to values.

Sample code / prompt

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# Generate performance scores for 5 treatment groups
np.random.seed(42)
groups = ['Control', 'Treatment A', 'Treatment B', 'Treatment C', 'Treatment D']
n_samples = 30
Box and whisker plot comparing gene expression across 4 genotypes with significance brackets
Distribution•seaborn, matplotlib
From the chart gallery•Comparing experimental groups in scientific research

Box and Whisker Plot

Displays data distribution using quartiles, median, and outliers in a standardized format.

Sample code / prompt

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# Generate gene expression data for 4 genotypes
np.random.seed(42)
genotypes = ['WT', 'KO1', 'KO2', 'Mutant']
n_per_group = 20
Violin plot comparing score distributions across 3 groups with inner box plots
Distribution•seaborn, matplotlib
From the chart gallery•Comparing treatment effects across groups

Violin Plot

Combines box plots with kernel density to show distribution shape across groups.

Sample code / prompt

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from scipy.stats import f_oneway

# Generate exam score data for 3 groups
np.random.seed(42)
control = np.random.normal(72, 12, 50)
treatment_a = np.random.normal(78, 10, 50)
Line graph with error bars showing 95% confidence intervals
Statistical•matplotlib
From the chart gallery•Scientific data presentation

Error Bars

Graphical representations of the variability of data indicating error or uncertainty in measurements.

Sample code / prompt

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# Generate bacterial growth data with replicates
np.random.seed(42)
time_points = np.array([0, 4, 8, 12, 18, 24])
mean_values = np.array([10, 25, 80, 250, 600, 800])

# Generate 5 replicates per time point with noise

Pass Peer Review the First Time

Upload your data and Plotivy generates publication-ready figures that meet journal specs - error bars, proper fonts, and vector export included.

Create Figure
Tags:#peer review#publication figures#scientific visualization#best practices#journal submission

Found this helpful? Share it with your network.

FV
Francesco Villasmunta

Experimental Physicist & Photonics Researcher

Hands-on experience in silicon photonics, semiconductor fabrication (DRIE/ICP-RIE), optical simulation, and data-driven analysis. Built Plotivy to help researchers focus on discoveries instead of data struggles.

More about the author

Visualize your own data

Apply the techniques from this article to your own datasets. Upload CSV, Excel, or paste data directly.

Start Analyzing - Free