Learn R Programming

scales

One of the most difficult parts of any graphics package is scaling, converting from data values to perceptual properties. The inverse of scaling, making guides (legends and axes) that can be used to read the graph, is often even harder! The scales packages provides the internal scaling infrastructure used by ggplot2, and gives you tools to override the default breaks, labels, transformations and palettes.

Installation

# Scales is installed when you install ggplot2 or the tidyverse.
# But you can install just scales from CRAN:
install.packages("scales")

# Or the development version from Github:
# install.packages("pak")
pak::pak("r-lib/scales")

Usage

Breaks and labels

The most common use of the scales package is to control the appearance of axis and legend labels. Use a break_ function to control how breaks are generated from the limits, and a label_ function to control how breaks are turned in to labels.

library(ggplot2)
library(dplyr, warn.conflicts = FALSE)
library(lubridate, warn.conflicts = FALSE)

txhousing %>% 
  mutate(date = make_date(year, month, 1)) %>% 
  group_by(city) %>% 
  filter(min(sales) > 5e2) %>% 
  ggplot(aes(date, sales, group = city)) + 
  geom_line(na.rm = TRUE) + 
  scale_x_date(
    NULL,
    breaks = scales::breaks_width("2 years"), 
    labels = scales::label_date("'%y")
  ) + 
  scale_y_log10(
    "Total sales",
    labels = scales::label_number(scale_cut = scales::cut_short_scale())
  )


economics %>% 
  filter(date < ymd("1970-01-01")) %>% 
  ggplot(aes(date, pce)) + 
  geom_line() + 
  scale_x_date(NULL,
    breaks = scales::breaks_width("3 months"), 
    labels = scales::label_date_short()
  ) + 
  scale_y_continuous("Personal consumption expenditures",
    breaks = scales::breaks_extended(8),
    labels = scales::label_dollar()  
  )

Generally, I don’t recommend running library(scales) because when you type (e.g.) scales::label_ autocomplete will provide you with a list of labelling functions to jog your memory.

Advanced features

Scales colour palettes are used to power the scales in ggplot2, but you can use them in any plotting system. The following example shows how you might apply them to a base plot.

library(scales)
# pull a list of colours from any palette
pal_viridis()(4)
#> [1] "#440154FF" "#31688EFF" "#35B779FF" "#FDE725FF"

# use in combination with baseR `palette()` to set new defaults
palette(pal_brewer(palette = "Set2")(4))
par(mar = c(5, 5, 1, 1))
plot(Sepal.Length ~ Sepal.Width, data = iris, col = Species, pch = 20)

scales also gives users the ability to define and apply their own custom transformation functions for repeated use.

# use new_transform to build a new transformation
transform_logp3 <- new_transform(
  name = "logp",
  transform = function(x) log(x + 3),
  inverse = function(x) exp(x) - 3,
  breaks = log_breaks()
)

dsamp <- sample_n(diamonds, 100)
ggplot(dsamp, aes(carat, price, colour = color)) +
  geom_point() + 
  scale_y_continuous(trans = transform_logp3)

Copy Link

Version

Install

install.packages('scales')

Monthly Downloads

1,173,776

Version

1.3.0

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Last Published

November 28th, 2023

Functions in scales (1.3.0)

comma

Superseded interface to label_number()/label_comma()
label_log

Label numbers in log format (10^3, 10^6, etc)
date_breaks

Regularly spaced dates
label_bytes

Label bytes (1 kB, 2 MB, etc)
fullseq

Generate sequence of fixed size intervals covering range.
label_parse

Label with mathematical annotations
label_ordinal

Label ordinal numbers (1st, 2nd, 3rd, etc)
label_number_auto

Label numbers, avoiding scientific notation where possible
label_number_si

Label numbers with SI prefixes (2 kg, 5 mm, etc)
label_wrap

Label strings by wrapping across multiple lines
label_scientific

Label numbers with scientific notation (e.g. 1e05, 1.5e-02)
label_currency

Label currencies ($100, €2.50, etc)
label_date

Label date/times
label_pvalue

Label p-values (e.g. <0.001, 0.25, p >= 0.99)
label_percent

Label percentages (2.5%, 50%, etc)
number_bytes_format

Older interface to label_bytes()
pal_linetype

Line type palette (discrete)
pal_identity

Identity palette
oob

Out of bounds handling
minor_breaks_width

Minor breaks
muted

Mute standard colour
pal_dichromat

Dichromat (colour-blind) palette (discrete)
pal_brewer

Colour Brewer palette (discrete)
label_number

Label numbers in decimal format (e.g. 0.12, 1,234)
pal_hue

Hue palette (discrete)
show_col

Show colours
percent_format

Superseded interface to label_percent()
train_continuous

Train (update) a continuous scale
pal_grey

Grey scale palette (discrete)
train_discrete

Train (update) a discrete scale
number

A low-level numeric formatter
trans_breaks

Pretty breaks on transformed scale
pretty_breaks

Superseded interface to breaks_pretty()
new_transform

Create a new transformation object
ordinal_format

Superseded interface to label_ordinal()
transform_boxcox

Box-Cox & modulus transformations
transform_identity

Identity transformation (do nothing)
pal_manual

Manual palette (discrete)
pal_rescale

Rescale palette (continuous)
scales-package

scales: Scale Functions for Visualization
transform_compose

Compose two or more transformations together
scientific_format

Superseded interface to label_scientific()
transform_yj

Yeo-Johnson transformation
transform_log

Log transformations
regular_minor_breaks

Minor breaks
transform_sqrt

Square-root transformation
transform_reverse

Reverse transformation
transform_asn

Arc-sin square root transformation
transform_atanh

Arc-tangent transformation
pvalue_format

Superseded interface to label_pvalue()
trans_format

Format labels after transformation
trim_to_domain

Compute range of transformed values
parse_format

Superseded interface to label_parse()/label_math()
wrap_format

Superseded interface to label_wrap()
zero_range

Determine if range of vector is close to zero, with a specified tolerance
transform_asinh

Inverse Hyperbolic Sine transformation
unit_format

Unit labels
pal_div_gradient

Diverging colour gradient (continuous).
pal_gradient_n

Arbitrary colour gradient palette (continuous)
pal_area

Area palettes (continuous)
pal_viridis

Viridis palette
transform_exp

Exponential transformation (inverse of log transformation)
transform_date

Transformation for dates (class Date)
transform_time

Transformation for date-times (class POSIXt)
rescale_max

Rescale numeric vector to have specified maximum
rescale

Rescale continuous vector to have specified minimum and maximum
transform_timespan

Transformation for times (class hms)
pal_seq_gradient

Sequential colour gradient palette (continuous)
pal_shape

Shape palette (discrete)
rescale_none

Don't perform rescaling
transform_reciprocal

Reciprocal transformation
transform_probability

Probability transformation
rescale_mid

Rescale vector to have specified minimum, midpoint, and maximum
breaks_extended

Automatic breaks for numeric axes
Range

Mutable ranges
breaks_timespan

Breaks for timespan data
breaks_log

Breaks for log axes
col2hcl

Modify standard R colour in hcl colour space.
alpha

Modify colour transparency
breaks_pretty

Pretty breaks for date/times
breaks_width

Equally spaced breaks
cbreaks

Compute breaks for continuous scale
cscale

Continuous scale
expand_range

Expand a range with a multiplicative or additive constant
date_format

Superseded interface to label_date()/label_time()
demo_continuous

Demonstrate scales functions with ggplot2 code
col_numeric

Colour mapping
colour_ramp

Fast colour interpolation
dollar_format

Superseded interface to label_currency()
format_format

Label using format()
dscale

Discrete scale