PaperPlotR is an R package for publication-ready scientific figures built on top of ggplot2. It does not replace ggplot2; it standardizes the parts of a figure workflow that are often repeated across papers and reports:
- plot themes
- panel and figure sizing
- color palettes and semantic color mappings
- multi-panel composition
- export presets
- lightweight comparison-plot helpers
Installation
Install the development version from GitHub:
install.packages("remotes")
remotes::install_github("Qgzeng-Bio/Paperplotr")
library(PaperPlotR)Or install from the package source directory during local development:
install.packages("devtools")
devtools::install(".")
library(PaperPlotR)Core Workflow
The intended workflow has five steps:
- Build a single plot in
ggplot2 - Apply
theme_lab()for consistent styling - Apply
scale_*_lab()orscale_*_groupmap()for consistent color use - Combine panels with
layout_lab() - Export with
save_lab()orsave_lab_plot()
The package focuses on standardization rather than automatic plotting.
Quick Start
library(PaperPlotR)
library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg, colour = factor(cyl))) +
geom_point(size = 2.2) +
scale_color_lab(palette = "main") +
theme_lab()
save_lab(
plot = p,
filename = "figures/scatter.png",
spec = "4.9x4.9",
journal = "nature"
)Main Interfaces
Themes
Use theme_lab() to apply a compact scientific theme:
p + theme_lab(base_size = 7, line_width = 0.35)Figure Sizing
Inspect the built-in figure specification helpers:
available_fig_specs()
panel_size("4.9x2")
get_fig_size_cm("4.9x2", ncol = 3, nrow = 1)
journal_preset("cell")
recommend_panel_spec(n_panels = 4)For dense multi-panel figures, recommend_panel_spec() provides a starting point and can flag cases where splitting a figure is likely to be clearer.
You can also register custom figure and export presets at runtime:
register_fig_spec(
name = "6x4",
panel_w_cm = 6,
panel_h_cm = 4,
layout_hint = "Wide single-panel figures"
)
register_journal_preset(
name = "journal_x",
figure_width_cm = 16.5,
base_size_pt = 8
)
register_output_preset(
name = "journal_x_half",
journal = "journal_x",
width_cm = 8.2,
height_cm = 6
)Palettes and Semantic Colors
Use scale_*_lab() for palette-driven color assignment:
ggplot(mtcars, aes(factor(cyl), mpg, fill = factor(cyl))) +
geom_boxplot() +
scale_fill_lab(palette = "prism_light") +
theme_lab()Use scale_*_groupmap() when category names should retain stable colors across plots:
df <- data.frame(
condition = c("Control", "Treatment", "WT"),
value = c(0.95, 1.32, 1.10)
)
ggplot(df, aes(condition, value, fill = condition)) +
geom_col(width = 0.75) +
scale_fill_groupmap(dictionary = "default") +
theme_lab()The built-in default semantic dictionary is intentionally generic. Register your own palettes and semantic dictionaries for project-specific groups:
register_palette(
name = "my_discrete",
values = c("#1B3A57", "#2E6F95", "#58A4B0")
)
register_group_dictionary(
name = "study_groups",
values = c(Control = "#4D4D4D", Treatment = "#D55E00", Rescue = "#009E73")
)Layout and Export
Combine panels with layout_lab():
combo <- layout_lab(p1, p2, p3, ncol = 3, guides = "collect")Export by canonical panel specification with save_lab():
save_lab(
plot = combo,
filename = "figures/combo.png",
spec = "4.9x2",
ncol = 3,
journal = "cell",
device = "ragg_png"
)Or export by named output preset with save_lab_plot():
save_lab_plot(
plot = combo,
filename = "figures/combo_half.png",
preset = "nature_half",
device = "svglite"
)For PDF output on macOS, device = "quartz_pdf" can be useful when native font handling is more reliable than Cairo-based PDF devices. Exports are checked by default so missing or suspiciously small files fail early.
Comparison Plots
For common manuscript-style grouped comparisons, use:
You can also assemble the layers manually:
Example:
df <- data.frame(
condition = rep(c("Control", "Treatment"), each = 12),
value = c(rnorm(12, 5, 0.4), rnorm(12, 6.1, 0.5))
)
plot_box_paper(
data = df,
x = condition,
y = value,
dictionary = "default",
show_points = TRUE,
show_summary = TRUE,
show_signif = TRUE,
comparisons = list(c("Control", "Treatment"))
)Example Gallery
See vignette("gallery", package = "PaperPlotR") for a compact visual workflow covering semantic colors, tagged multi-panel layouts, and explicit export devices.
To generate a small gallery of reusable example figures:
paths <- render_paperplotr_examples("figures/paperplotr_gallery")
print(paths)