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()
)

set.seed(1234) # Ensures same sampling
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,150,328

Version

1.4.0

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Thomas Lin Pedersen

Last Published

April 24th, 2025

Functions in scales (1.4.0)

colour_ramp

Fast colour interpolation
comma

Superseded interface to label_number()/label_comma()
colour_manip

Colour manipulation
date_format

Superseded interface to label_date()/label_time()
date_breaks

Regularly spaced dates
label_dictionary

Labels from lookup tables
label_currency

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

Interpolated labels
expand_range

Expand a range with a multiplicative or additive constant
format_format

Label using format()
dscale

Discrete scale
label_bytes

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

Label date/times
dollar_format

Superseded interface to label_currency()
fullseq

Generate sequence of fixed size intervals covering range.
label_log

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

Label strings by wrapping across multiple lines
label_number

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

Label numbers, avoiding scientific notation where possible
label_number_si

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

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

Label with mathematical annotations
label_ordinal

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

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

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

Constructors for palettes
minor_breaks_log

Minor breaks for log-10 axes
new_transform

Create a new transformation object
oob

Out of bounds handling
minor_breaks_width

Minor breaks
number_options

Number options
muted

Mute standard colour
pal_grey

Grey scale palette (discrete)
pal_hue

Hue palette (discrete)
pal_area

Area palettes (continuous)
pal_dichromat

Dichromat (colour-blind) palette (discrete)
pal_linetype

Line type palette (discrete)
pal_brewer

Colour Brewer palette (discrete)
pal_gradient_n

Arbitrary colour gradient palette (continuous)
number_bytes_format

Older interface to label_bytes()
ordinal_format

Superseded interface to label_ordinal()
number

A low-level numeric formatter
pal_identity

Identity palette
pal_manual

Manual palette (discrete)
pal_div_gradient

Diverging colour gradient (continuous).
palette-recommendations

Recommendations for colour palettes
pal_rescale

Rescale palette (continuous)
pal_seq_gradient

Sequential colour gradient palette (continuous)
percent_format

Superseded interface to label_percent()
pal_shape

Shape palette (discrete)
pretty_breaks

Superseded interface to breaks_pretty()
rescale_none

Don't perform rescaling
rescale_mid

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

Superseded interface to label_parse()/label_math()
rescale_max

Rescale numeric vector to have specified maximum
transform_date

Transformation for dates (class Date)
rescale

Rescale continuous vector to have specified minimum and maximum
transform_exp

Exponential transformation (inverse of log transformation)
train_discrete

Train (update) a discrete scale
pvalue_format

Superseded interface to label_pvalue()
regular_minor_breaks

Minor breaks
trans_format

Format labels after transformation
trans_breaks

Pretty breaks on transformed scale
pal_viridis

Viridis palette
transform_identity

Identity transformation (do nothing)
transform_log

Log transformations
train_continuous

Train (update) a continuous scale
show_col

Show colours
transform_yj

Yeo-Johnson transformation
transform_timespan

Transformation for times (class hms)
transform_time

Transformation for date-times (class POSIXt)
transform_probability

Probability transformation
transform_asn

Arc-sin square root transformation
transform_atanh

Arc-tangent transformation
transform_reciprocal

Reciprocal transformation
trim_to_domain

Compute range of transformed values
transform_reverse

Reverse transformation
transform_sqrt

Square-root transformation
scales-package

scales: Scale Functions for Visualization
transform_asinh

Inverse Hyperbolic Sine transformation
wrap_format

Superseded interface to label_wrap()
unit_format

Unit labels
transform_boxcox

Box-Cox & modulus transformations
transform_compose

Compose two or more transformations together
scientific_format

Superseded interface to label_scientific()
zero_range

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