Menu

Problem-Solving11 min read

Journal Rejection Due to Figure Quality: A Practical Fix Guide

By Francesco Villasmunta
Journal Rejection Due to Figure Quality: A Practical Fix Guide

"Figures do not meet journal requirements." If you have received this rejection, here is exactly how to fix every issue - with before/after code and a pre-submission checklist.

Fix Guide

0.Live Code: Before vs After Fix

1.Why Figures Get Rejected

2.The DPI Fix

3.The Font Fix

4.The Sizing Fix

5.Pre-Submission Checklist

0. Live Code: Before vs After Fix

Left panel shows common rejection triggers. Right panel shows the fixed version. Edit the code to practice the fixes yourself.

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. Why Figures Get Rejected

Low Resolution (< 300 DPI)

42%

Figures exported from PowerPoint or screenshots at screen resolution.

Wrong File Format

23%

JPEG compression artifacts on line art. Journals want TIFF or EPS.

Font Issues

18%

Non-embedded fonts, decorative typefaces, or text too small after scaling.

Wrong Dimensions

17%

Figures not sized to column width. Stretched or squished during layout.

2. The DPI Fix

Python / Matplotlib

# Always set DPI at save time, not at figure creation
fig.savefig("figure1.tiff", dpi=600, bbox_inches="tight")

# For PDFs (vector), DPI applies only to rasterized elements
fig.savefig("figure1.pdf", dpi=300, bbox_inches="tight")

Critical

Never upscale a low-DPI image. Re-generate the figure from code at the target DPI. If your source is a screenshot, there is no fix - you must recreate from data.

3. The Font Fix

Set globally before any plotting

import matplotlib
matplotlib.rcParams.update({
    "font.family": "Arial",     # or Helvetica
    "font.size": 8,             # base size (6-8 pt after scaling)
    "pdf.fonttype": 42,         # embed fonts as TrueType in PDFs
    "ps.fonttype": 42,
})

Use Arial or Helvetica (accepted everywhere)

Set pdf.fonttype = 42 to embed fonts

Keep labels 7-10 pt at final print size

Use Comic Sans, Papyrus, or decorative fonts

Rely on system fonts that may not embed

Use different fonts across panels

4. The Sizing Fix

Set figure size to exact journal specs

# Nature single column = 89 mm = 3.504 inches
# Nature double column = 183 mm = 7.205 inches
fig, ax = plt.subplots(figsize=(3.504, 2.8))  # width, height in inches

# Verify actual output dimensions
print(f"Figure size: {fig.get_size_inches()} inches")
print(f"At 300 DPI: {fig.get_size_inches()[0]*300:.0f} x {fig.get_size_inches()[1]*300:.0f} px")

5. Pre-Submission Checklist

1.

Resolution is 300+ DPI (600 for line art)

2.

Format is TIFF (LZW) or EPS/PDF vector

3.

Fonts are Arial/Helvetica, embedded, 7-10 pt at final size

4.

Figure sized to journal column width (not scaled by layout)

5.

Panel labels (a, b, c) are consistent size and position

6.

Color palette is colorblind-safe (test with colorblindness simulator)

7.

Axes have units and clear labels

8.

No decorative elements (3D effects, gradients, clip art)

9.

White or transparent background (no gray fill)

10.

Error bars have a legend explaining what they represent (SD, SEM, CI)

Chart gallery

Publication-Ready Templates

Start from a figure that already meets journal requirements.

Browse all chart types →
Bar chart comparing average scores across 5 groups with error bars
Comparisonmatplotlib, seaborn
From the chart galleryComparing 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
Scatter plot of height vs weight colored by gender with regression line
Statisticalmatplotlib, seaborn
From the chart galleryCorrelation 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
Multi-line graph showing temperature trends for 3 cities over a year
Time Seriesmatplotlib, seaborn
From the chart galleryStock price tracking over time

Line Graph

Displays data points connected by straight line segments to show trends over time.

Sample code / prompt

import matplotlib.pyplot as plt
import numpy as np

# Generate temperature data for 3 major US cities over 12 months
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
nyc = [30, 32, 40, 52, 65, 75, 82, 81, 74, 63, 50, 38]
miami = [65, 66, 70, 76, 82, 87, 90, 90, 87, 80, 72, 66]
chicago = [25, 27, 35, 48, 62, 72, 80, 79, 71, 60, 45, 32]

# Create figure with enhanced styling
Line graph with error bars showing 95% confidence intervals
Statisticalmatplotlib
From the chart galleryScientific 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
Correlation heatmap with diverging color scale and coefficient annotations
Statisticalseaborn, matplotlib
From the chart galleryCorrelation analysis between variables

Heatmap

Represents data values as colors in a two-dimensional matrix format.

Sample code / prompt

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

# Create correlation matrix for financial metrics
metrics = ['Revenue', 'Profit', 'Expenses', 'ROI', 'Customers', 'AOV', 'Marketing', 'Employees']
correlation_data = np.array([
    [1.00, 0.85, -0.45, 0.72, 0.88, 0.65, 0.72, 0.55],
    [0.85, 1.00, -0.78, 0.92, 0.75, 0.58, 0.63, 0.48],
Box and whisker plot comparing gene expression across 4 genotypes with significance brackets
Distributionseaborn, matplotlib
From the chart galleryComparing 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

Fix Your Figures in 30 Seconds

Upload your data and tell Plotivy the target journal. It generates DPI-correct, properly sized figures with the right fonts.

Fix Now
Tags:#journal submission#figure quality#dpi#publication figures#peer review#rejection fix

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