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

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
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.png&w=1920&q=75)
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
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)
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 noisePass 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.
Found this helpful? Share it with your network.
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 authorVisualize your own data
Apply the techniques from this article to your own datasets. Upload CSV, Excel, or paste data directly.