GitHubLifecycle: experimental

sciplotr

sciplotr is built on the basis of ggplot2 (and includes parts of the ggplot2 distributed under GPLv2).

sciplotr provides versions of some ggplot2 functions (like theme, facet, scale) that produce more manuscript-oriented plots.

There are also extension methods to work with units (as in grid's unit).

Units support

library(grid)
library(ggplot2)
library(sciplotr, quietly = TRUE, warn.conflicts = FALSE)
# {grid}'s way
unit(5, "cm") + unit(1, "pt")
# {sciplotr}'s way
# Use `~` to define a single unit
# Use `$` when doing arithmetic
u_(5 ~ cm) + u_(1 ~ pt)
u_(5$cm + 1$pt)

Function u_ creates units and is best for hard-coded values, e.g.

u_(1 ~ cm, 2 ~ `in`, 3 ~ pt, 4$mm + 8$mm)

There is a similar mar_ to create margin (which understands top, bot, etc.). An accessor at_ gives access to margin's components by their names in a rlang-ish way.

# Set vertical margin to 5 cm and horizontal to 10 pt
m <- mar_(v = 5 ~ cm, h = 10 ~ pt)
at_(m, top) + at_(m, left)

gtable-like methods

gtable provides tools to manipulate grobs. sciplotr has a few extra functions to inspect layout. postprocess_axes is a handy method that sets up margins of a typical ggplot2 plot, that is, modifying heights/widths of axis name grobs, axis ticks grobs and facet strips. It is possible to produce plots with exactly same plot area sizes to nicely align them in the manuscript.

There are also some other tools of the family get_grob_*

Plotting

siplotr has several main plotting-related methods that are derived from ggplot2's implementations.

To wrap things up, here is an example

# Generate strip labels as list of expressions
labeller <- label_f(
    .f_left = ~purrr::map(as.list(paste0("hp[", .x$rows$am, "]")), ~parse(text = .x)),
    .f_bottom = ~purrr::map(as.list(paste0("mpg[", .x$cols$vs, "]")), ~parse(text = .x)))

# ggplot_sci is equivalent to ggplot() + theme_sci() + coord_sci()
ggplot_sci(mtcars, aes(hp, mpg, col = factor(gear))) +
    theme_sci(ticks = -u_(5~pt), facet.lab.x = u_(0.93 ~ npc)) +
    geom_point() +
    scale_x_sci(name = NULL, sec.axis = dup_axis_sci_weak()) +
    scale_y_sci(name = NULL, sec.axis = dup_axis_sci_weak()) +
    facet_sci(am ~ vs, 
        labeller = labeller) -> plt
print(plt)
# This call generates plot with equal margin on all four sides (0.75 + 0.75 cm)
grid.newpage()
grid.draw(postprocess_axes(plt, 
    axes_margin = mar_(0.75 ~ cm), 
    text_margin = mar_(0.75 ~ cm, 0.75 ~ cm , 0 ~ npc, 0 ~ npc),
    strip_margin = mar_(0 ~ npc, 0 ~ npc, 0.75 ~ cm, 0.75 ~ cm)))

Another example shows different secondary axes scales. The main use case is plots with sophisticated secondary axes, like astrophysical plots where y-axis shows logarithmic fluxes (e.g. incident energy per unit time, surface and frequency) and secondary y-axis shows "magnitudes" (2.5 * log10(F / F0)).

set.seed(1)
data <- data.frame(x = 1:1000, y = 10 ^ runif(1000, 3, 5));
ggplot_sci(data, aes(x, y)) +
     geom_point() +
     scale_x_sci(sec.axis = sec_axis_sci(~2 * .)) +
     scale_y_log10_sci(name = "F",
        sec.axis = sec_axis_sci(
            ~ -2.5 * log10(.) + 20, 
            name = "m", 
            breaks_trans = identity_sci_trans()))


Ilia-Kosenkov/sciplotr documentation built on June 7, 2022, 8:01 a.m.