Skip to content

Commit 9799517

Browse files
authored
Merge pull request #22 from DataScienceScotland/sg-palettes
Add SG colour palettes
2 parents 1871b1c + 1916519 commit 9799517

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+639
-266
lines changed

DESCRIPTION

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Package: sgplot
22
Title: Graphic Styles and Colours for Scottish Government Plots
3-
Version: 0.1.0
3+
Version: 0.2.0
44
Authors@R: c(
55
person("Scottish Government", , , "statistics.enquiries@gov.scot", role = c("cph", "fnd")),
66
person("Alice", "Byers", , "alice.byers@gov.scot", c("aut", "cre"))
@@ -17,9 +17,10 @@ RoxygenNote: 7.2.3
1717
Depends:
1818
R (>= 2.10)
1919
Imports:
20-
ggplot2,
21-
scales,
22-
cli
20+
ggplot2,
21+
scales,
22+
cli,
23+
rlang
2324
Suggests:
2425
dplyr,
2526
knitr,
@@ -31,5 +32,6 @@ Suggests:
3132
gapminder,
3233
stringr,
3334
testthat (>= 2.1.0),
34-
plotly
35+
plotly,
36+
gt
3537
VignetteBuilder: knitr

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ export(scale_fill_continuous_sg)
77
export(scale_fill_discrete_sg)
88
export(theme_sg)
99
export(use_sgplot)
10+
importFrom(rlang,.data)

NEWS.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
# sgplot 0.2.0
2+
3+
* Add [Scottish Government Design System colour palettes](https://designsystem.gov.scot/guidance/charts/data-visualisation-colour-palettes)
4+
* Reduce `base_line_size` in `theme_sg()`
5+
* Remove default dark blue outline from `geom_col` and `geom_bar` when using `use_sgplot()`.
6+
17
# sgplot 0.1.0
28

39
* First package release

R/colour_table.R

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#' @title Create \code{gt} table of colour palette
2+
#'
3+
#' @param pal Named vector of colour palette;
4+
#' e.g. \code{sgplot::sg_colour_palettes[["main"]]}
5+
#'
6+
#' @return An object of class \code{gt_tbl}.
7+
8+
colour_table <- function(pal) {
9+
10+
tibble::enframe(pal) |>
11+
dplyr::mutate(example = "") |>
12+
dplyr::mutate(value = factor(
13+
pal,
14+
ordered = TRUE,
15+
levels = unname(pal)
16+
)) |>
17+
gt::gt() |>
18+
gt::data_color(
19+
columns = .data$value,
20+
target_columns = .data$example,
21+
fn = scales::col_factor(
22+
palette = pal,
23+
domain = NULL
24+
)
25+
) |>
26+
gt::cols_width(
27+
name ~ gt::px(110),
28+
value ~ gt::px(100),
29+
example ~ gt::px(150)
30+
) |>
31+
gt::cols_align(
32+
align = "left",
33+
columns = dplyr::everything()
34+
) |>
35+
gt::cols_label(
36+
name = "Colour name",
37+
value = "Hex code",
38+
example = "Example of colour"
39+
)
40+
41+
}

R/data.R

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#' hex code.
66
#'
77
#' @format A character vector
8-
#' @source \href{https://analysisfunction.civilservice.gov.uk/policy-store/data-visualisation-colours-in-charts/}{Government Analysis Function Colours Guidance}
8+
#' @source \href{https://designsystem.gov.scot/guidance/charts/data-visualisation-colour-palettes}{Scottish Government Design System}
99
# nolint end
1010

1111
"sg_colour_values"
@@ -17,7 +17,32 @@
1717
#' @description A list grouping colours into palettes.
1818
#'
1919
#' @format A character list
20-
#' @source \href{https://analysisfunction.civilservice.gov.uk/policy-store/data-visualisation-colours-in-charts/}{Government Analysis Function Colours Guidance}
20+
#' @source \href{https://designsystem.gov.scot/guidance/charts/data-visualisation-colour-palettes}{Scottish Government Design System}
2121
# nolint end
2222

2323
"sg_colour_palettes"
24+
25+
26+
# nolint start
27+
#' @title Analysis Function colour names and hex codes
28+
#'
29+
#' @description A vector containing colour names and their corresponding
30+
#' hex code.
31+
#'
32+
#' @format A character vector
33+
#' @source \href{https://analysisfunction.civilservice.gov.uk/policy-store/data-visualisation-colours-in-charts/}{Government Analysis Function Colours Guidance}
34+
# nolint end
35+
36+
"af_colour_values"
37+
38+
39+
# nolint start
40+
#' @title Analysis Function colour palettes
41+
#'
42+
#' @description A list grouping colours into palettes.
43+
#'
44+
#' @format A character list
45+
#' @source \href{https://analysisfunction.civilservice.gov.uk/policy-store/data-visualisation-colours-in-charts/}{Government Analysis Function Colours Guidance}
46+
# nolint end
47+
48+
"af_colour_palettes"

R/scale_colour_continuous_sg.R

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#' @title Continuous colour scales for Scottish Government plots
22
#'
3-
#' @param palette Name of palette to use from `sg_colour_palettes`; e.g. main,
4-
#' sequential, focus. Default value is 'sequential'.
3+
#' @param palette Name of palette to use; e.g. "main", "sequential", "focus".
4+
#' Default value is "sequential".
5+
#' @param palette_type Either "sg" to use Scottish Government palettes, or "af"
6+
#' to use Analysis Function palettes. Defaults to "sg".
57
#' @param reverse Boolean value to indicate whether the palette should be
68
#' reversed.
79
#' @param na_colour Colour to set for missing values.
@@ -18,22 +20,30 @@
1820
#' @export
1921

2022
scale_colour_continuous_sg <- function(palette = "sequential",
23+
palette_type = c("sg", "af"),
2124
reverse = FALSE,
2225
na_colour = "grey50",
2326
guide = "colourbar",
2427
...) {
28+
29+
palette_type <- match.arg(palette_type)
30+
31+
palette_list <- get(paste0(palette_type, "_colour_palettes"),
32+
as.environment("package:sgplot"))
33+
2534
# Error if palette doesn't exist
26-
if (!palette %in% names(sgplot::sg_colour_palettes)) {
35+
if (!palette %in% names(palette_list)) {
2736
cli::cli_abort(c(
28-
"x" = paste(palette, "is not a valid palette name.")
37+
"x" = paste("`{palette}` is not a valid palette name in",
38+
"`{palette_type}_colour_palettes`.")
2939
))
3040
}
3141

32-
colours <- as.vector(sgplot::sg_colour_palettes[[palette]])
42+
colours <- as.vector(palette_list[[palette]])
3343

3444
ggplot2::continuous_scale(
3545
aesthetics = "colour",
36-
scale_name = "sg_continuous",
46+
scale_name = paste0(palette_type, "_continuous"),
3747
palette = scales::gradient_n_pal(colours, values = NULL, "Lab"),
3848
na.value = na_colour,
3949
guide = guide,

R/scale_colour_discrete_sg.R

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#' @title Discrete colour scales for Scottish Government plots
22
#'
3-
#' @param palette Name of palette to use from `sg_colour_palettes`; e.g. main,
4-
#' sequential, focus. Default value is 'main'.
3+
#' @param palette Name of palette to use; e.g. "main", "sequential", "focus."
4+
#' Default value is "main".
5+
#' @param palette_type Either "sg" to use Scottish Government palettes, or "af"
6+
#' to use Analysis Function palettes. Defaults to "sg".
57
#' @param reverse Boolean value to indicate whether the palette should be
68
#' reversed.
79
#' @param ... Additional arguments passed to scale type.
@@ -14,16 +16,20 @@
1416
#' filter(variable %in% c("psavert", "uempmed")) %>%
1517
#' ggplot(aes(x = date, y = value, colour = variable)) +
1618
#' geom_line(linewidth = 1) +
17-
#' scale_colour_discrete_sg("main2")
19+
#' scale_colour_discrete_sg()
1820
#'
1921
#' @export
2022

2123
scale_colour_discrete_sg <- function(palette = "main",
24+
palette_type = c("sg", "af"),
2225
reverse = FALSE,
2326
...) {
27+
28+
palette_type <- match.arg(palette_type)
29+
2430
ggplot2::discrete_scale("colour",
25-
paste0("sg_", palette),
26-
palette = sg_palette(palette, reverse),
31+
paste0(palette_type, "_", palette),
32+
palette = sg_palette(palette, reverse, palette_type = palette_type),
2733
...
2834
)
2935
}

R/scale_fill_continuous_sg.R

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#' @title Continuous colour fill scales for Scottish Government plots
22
#'
3-
#' @param palette Name of palette to use from `sg_colour_palettes`; e.g. main,
4-
#' sequential, focus. Default value is 'sequential'.
3+
#' @param palette Name of palette to use; e.g. "main", "sequential", "focus."
4+
#' Default value is "sequential".
5+
#' @param palette_type Either "sg" to use Scottish Government palettes, or "af"
6+
#' to use Analysis Function palettes. Defaults to "sg".
57
#' @param reverse Boolean value to indicate whether the palette should be
68
#' reversed.
79
#' @param na_colour Colour to set for missing values.
@@ -18,22 +20,30 @@
1820
#' @export
1921

2022
scale_fill_continuous_sg <- function(palette = "sequential",
23+
palette_type = c("sg", "af"),
2124
reverse = FALSE,
2225
na_colour = "grey50",
2326
guide = "colourbar",
2427
...) {
28+
29+
palette_type <- match.arg(palette_type)
30+
31+
palette_list <- get(paste0(palette_type, "_colour_palettes"),
32+
as.environment("package:sgplot"))
33+
2534
# Error if palette doesn't exist
26-
if (!palette %in% names(sgplot::sg_colour_palettes)) {
35+
if (!palette %in% names(palette_list)) {
2736
cli::cli_abort(c(
28-
"x" = paste(palette, "is not a valid palette name.")
37+
"x" = paste("`{palette}` is not a valid palette name in",
38+
"`{palette_type}_colour_palettes`.")
2939
))
3040
}
3141

32-
colours <- as.vector(sgplot::sg_colour_palettes[[palette]])
42+
colours <- as.vector(palette_list[[palette]])
3343

3444
ggplot2::continuous_scale(
3545
aesthetics = "fill",
36-
scale_name = "sg_continuous",
46+
scale_name = paste0(palette_type, "_continuous"),
3747
palette = scales::gradient_n_pal(colours, values = NULL, "Lab"),
3848
na.value = na_colour,
3949
guide = guide,

R/scale_fill_discrete_sg.R

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#' @title Discrete colour fill scales for Scottish Government plots
22
#'
3-
#' @param palette Name of palette to use from `sg_colour_palettes`; e.g. main,
4-
#' sequential, focus. Default value is 'main'.
3+
#' @param palette Name of palette to use; e.g. "main", "sequential", "focus."
4+
#' Default value is "main."
5+
#' @param palette_type Either "sg" to use Scottish Government palettes, or "af"
6+
#' to use Analysis Function palettes. Defaults to "sg".
57
#' @param reverse Boolean value to indicate whether the palette should be
68
#' reversed.
79
#' @param ... Additional arguments passed to scale type.
@@ -18,11 +20,15 @@
1820
#' @export
1921

2022
scale_fill_discrete_sg <- function(palette = "main",
23+
palette_type = c("sg", "af"),
2124
reverse = FALSE,
2225
...) {
26+
27+
palette_type <- match.arg(palette_type)
28+
2329
ggplot2::discrete_scale("fill",
24-
paste0("sg_", palette),
25-
palette = sg_palette(palette, reverse),
30+
paste0(palette_type, "_", palette),
31+
palette = sg_palette(palette, reverse, palette_type = palette_type),
2632
...
2733
)
2834
}

R/sg_palette.R

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,47 +5,66 @@
55
#' reversed
66
#' @param colour_names Boolean value to indicate whether colour names should be
77
#' included
8+
#' @param palette_type Either `sg` to use Scottish Government palettes, or `af`
9+
#' to use Analysis Function palettes. Defaults to `sg`.
810

911
sg_palette <- function(palette = "main",
1012
reverse = FALSE,
11-
colour_names = FALSE) {
13+
colour_names = FALSE,
14+
palette_type = c("sg", "af")) {
15+
16+
palette_type <- match.arg(palette_type)
17+
18+
palette_list <- get(paste0(palette_type, "_colour_palettes"))
1219

1320
# Check valid palette name
14-
if (!palette %in% names(sgplot::sg_colour_palettes)) {
21+
if (!palette %in% names(palette_list)) {
1522
cli::cli_abort(c(
16-
"x" = paste0("`", palette, "` is not a valid palette name.")
23+
"x" = paste("`{palette}` is not a valid palette name ",
24+
"in `{palette_type}_colour_palettes`.")
1725
))
1826
}
1927

2028
function(n) {
21-
n_available <- length(sgplot::sg_colour_palettes[[palette]])
29+
n_available <- length(palette_list[[palette]])
2230

23-
# Use 'main2' if main palette used and only 2 colours required
24-
if (n == 2 && palette != "main2" && grepl("main", palette)) {
31+
# Use 'main2' if AF main palette used and only 2 colours required
32+
if (
33+
palette_type == "af" &&
34+
n == 2 &&
35+
palette != "main2" &&
36+
grepl("main", palette)
37+
) {
2538
palette <- "main2"
2639
cli::cli_warn(c(
2740
"!" = "Using `main2` as only two colours are required."
2841
))
2942
}
3043

44+
ext_palettes <- subset(
45+
names(palette_list),
46+
stringr::str_detect(names(palette_list), "^main([5-9]|-extended)")
47+
)
48+
3149
# Error if more colours requested than exist in palette
3250
if (n > n_available) {
3351
cli::cli_abort(c(
34-
"x" = paste0(
35-
"There are not enough colours available in the `",
36-
palette, "` palette (", n_available, " available)."
52+
"x" = glue::glue(
53+
"There are not enough colours available in the `{palette}`",
54+
"palette from `{palette_type}_colour_palettes`",
55+
"({n_available} available)."
3756
),
38-
"i" = paste(
57+
"i" = glue::glue(
3958
"Accessibility guidance recommends a limit of four",
4059
"colours per chart. If more than four colours are",
4160
"required, first consider chart redesign. If it is",
42-
"essential to use more than four colours, the `main6`",
43-
"palette can be used."
61+
"essential to use more than four colours, the `{ext_palettes}`",
62+
"palette{?s} can be used."
4463
)
4564
))
4665
}
4766

48-
pal <- sgplot::sg_colour_palettes[[palette]][seq_len(n)]
67+
pal <- palette_list[[palette]][seq_len(n)]
4968

5069
if (reverse) pal <- rev(pal)
5170

R/sgplot-package.R

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#' @keywords internal
2+
"_PACKAGE"
3+
4+
## usethis namespace: start
5+
#' @importFrom rlang .data
6+
## usethis namespace: end
7+
NULL

R/theme_sg.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424

2525
theme_sg <- function(base_size = 12,
26-
base_line_size = base_size / 22,
27-
base_rect_size = base_size / 22,
26+
base_line_size = base_size / 24,
27+
base_rect_size = base_size / 24,
2828
grid = c("y", "x", "xy", "none"),
2929
axis = c("x", "y", "xy", "none"),
3030
ticks = c("xy", "x", "y", "none"),

0 commit comments

Comments
 (0)