We’re delighted to announce the release of scales 1.0.0. The scales packages provides the internal scaling infrastructure to ggplot2 and its functions allow users to customize the transformations, breaks, guides and palettes used in visualizations in ggplot2 and beyond.
This is a major release with significant changes to the popular formatter functions, and added transformations. Below we demonstrate some of the biggest changes in this release including:
- updated formatter functions
- new transformations
- improved breaks on log-transformed scales
Install the latest version with:
Thanks to the help of @larmarange, scales has
now added a generic formatter function,
number_format(), that powers the majority
of the formatters in the package.
This change altered the arguments of most of the formatters:
scientific_format(). All gained new arguments
suffix, allowing users to specify rounding accuracy,
a scaling value, a prefix, and a suffix to
customize output. Furthermore, all of these functions now allow user
specification of the thousands separator,
big.mark, and the decimal separator,
decimal.mark. Users of these formatters will notice that the default thousands
separator is now a space. This default was chosen as a useful compromise for
an international audience (a space for thousands separator and a dot for decimal
separator) and is officially endorsed by SI/ISO 31-0 standard, as well as by the
International Bureau of Weights and Measures and the International Union of
Pure and Applied Chemistry (IUPAC), the American Medical Association’s widely
followed AMA Manual of Style, and the Metrication Board, among others
(read more here).
Those interested in number formatting with no separator can simply define
big.mark = "" to revert to the previous behaviour.
library(scales) number(c(12.3, 4, 12345.789, 0.0002)) #>  "12" "4" "12 346" "0" # these functions round by default, but you can set the accuracy number(c(12.3, 4, 12345.789, 0.0002), big.mark = "", accuracy = .01) #>  "12.30" "4.00" "12345.79" "0.00" # percent() function takes a numeric and does your division and labelling for you percent(c(0.1, 1 / 3, 0.56)) #>  "10.0%" "33.3%" "56.0%" # comma() adds commas into large numbers for easier readability comma(10e6) #>  "10,000,000" # dollar() adds currency symbols speficifed by `prefix` or `suffix` dollar(c(100, 125, 3000)) #>  "$100" "$125" "$3,000" dollar(c(100, 125, 3000), suffix = "€", prefix = "") #>  "100€" "125€" "3,000€" # unit_format() adds unique units # the scale argument can do simple conversion on the fly unit_format(unit = "ha", scale = 1e-4)(c(10e6, 10e4, 8e3)) #>  "1 000 ha" "10 ha" "1 ha"
Three additional formatters have been added:
pvalue_format() formats p-values,
number_bytes_format() formats numeric vectors into byte measurements, and
time_format() provides support for formatting POSIXt and hms objects. Finally,
ordinal_format() has gained new rules for French and Spanish formatting.
Two new transformations were added to the package for this release:
pseudo_log_trans() transforms data on a signed
logarithmic scale with a smooth transition to a linear scale around 0. The
modulus_trans() was added along with a refactored
provide a better option for negative numbers. Both
boxcox_trans() gained an argument
offset which now allows users to fit both
type-1 and type-2 Box-Cox transformations.
In a long awaited fix,
log_breaks() now returns integer multiples of
integer powers of base when finer breaks are needed on the log scale.
This will change all ggplot graphics with log-transformed axes.
library(ggplot2) library(dplyr) set.seed(5678) dsamp <- sample_n(1000, tbl = diamonds) ggplot(dsamp, aes(y = price, x = carat)) + geom_point() + scale_x_log10() + scale_y_log10()
We’re grateful to the 24 people who contributed issues, code and comments: @alexandreliborio, @AndreaCirilloAC, @batpigandme, @BenOnEarth, @billdenney, @Bisaloo, @CesarSancho, @christianhomberg, @clauswilke, @cwickham, @dpseidel, @foo-bar-baz-qux, @graciecorgi, @hadley, @jimhester, @jnolis, @larmarange, @lepennec, @markvanderloo, @ptoche, @RobertMyles, @statist7, @ThierryO, and @zeehio.