|
|
@ -1,10 +1,17 @@
|
||||||
^.*\.Rproj$
|
^.*\.Rproj$
|
||||||
^\.Rproj\.user$
|
|
||||||
^LICENSE\.md$
|
^LICENSE\.md$
|
||||||
^README\.Rmd
|
^README\.Rmd
|
||||||
^pkgdown\.css
|
^\.Rproj\.user$
|
||||||
^docs
|
^\.github$
|
||||||
|
^\.pre-commit-config\.yaml$
|
||||||
^_pkgdown\.yml$
|
^_pkgdown\.yml$
|
||||||
|
^data-raw$
|
||||||
|
^docs
|
||||||
^docs$
|
^docs$
|
||||||
^pkgdown$
|
^pkgdown$
|
||||||
^data-raw$
|
^pkgdown\.css
|
||||||
|
^renv$
|
||||||
|
^renv$
|
||||||
|
^renv\.lock$
|
||||||
|
^renv\.lock$
|
||||||
|
^test-example.R
|
||||||
|
|
|
||||||
3
.Rprofile
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# source("renv/activate.R")
|
||||||
|
options(repos = c(CRAN = "https://p3m.dev/cran/__linux__/manylinux_2_28/latest"))
|
||||||
|
options(renv.config.pak.enabled = TRUE)
|
||||||
4
.gitignore
vendored
|
|
@ -4,3 +4,7 @@
|
||||||
.httr-oauth
|
.httr-oauth
|
||||||
.DS_Store
|
.DS_Store
|
||||||
R/test.R
|
R/test.R
|
||||||
|
inst/doc
|
||||||
|
|
||||||
|
/.quarto/
|
||||||
|
docs
|
||||||
|
|
|
||||||
93
.pre-commit-config.yaml
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
# All available hooks: https://pre-commit.com/hooks.html
|
||||||
|
# R specific hooks: https://github.com/lorenzwalthert/precommit
|
||||||
|
repos:
|
||||||
|
- repo: https://github.com/lorenzwalthert/precommit
|
||||||
|
rev: v0.4.3.9012
|
||||||
|
hooks:
|
||||||
|
- id: style-files
|
||||||
|
args: [--style_pkg=styler, --style_fun=tidyverse_style]
|
||||||
|
- id: roxygenize
|
||||||
|
# roxygen requires loading pkg -> add dependencies from DESCRIPTION
|
||||||
|
additional_dependencies:
|
||||||
|
- ggplot2
|
||||||
|
- rlang
|
||||||
|
- grDevices
|
||||||
|
- glue
|
||||||
|
- scales
|
||||||
|
- ggtext
|
||||||
|
- ggrepel
|
||||||
|
- tidyr
|
||||||
|
- dplyr
|
||||||
|
- ggalluvial
|
||||||
|
- viridisLite
|
||||||
|
- waffle
|
||||||
|
- stringr
|
||||||
|
- checkmate
|
||||||
|
- forcats
|
||||||
|
|
||||||
|
# codemeta must be above use-tidy-description when both are used
|
||||||
|
# - id: codemeta-description-updated
|
||||||
|
- id: use-tidy-description
|
||||||
|
- id: spell-check
|
||||||
|
exclude: >
|
||||||
|
(?x)^(
|
||||||
|
.*\.[rR]|
|
||||||
|
.*\.feather|
|
||||||
|
.*\.jpeg|
|
||||||
|
.*\.pdf|
|
||||||
|
.*\.png|
|
||||||
|
.*\.py|
|
||||||
|
.*\.RData|
|
||||||
|
.*\.rds|
|
||||||
|
.*\.Rds|
|
||||||
|
.*\.Rproj|
|
||||||
|
.*\.sh|
|
||||||
|
(.*/|)\.gitignore|
|
||||||
|
(.*/|)\.gitlab-ci\.yml|
|
||||||
|
(.*/|)\.lintr|
|
||||||
|
(.*/|)\.pre-commit-.*|
|
||||||
|
(.*/|)\.Rbuildignore|
|
||||||
|
(.*/|)\.Renviron|
|
||||||
|
(.*/|)\.Rprofile|
|
||||||
|
(.*/|)\.travis\.yml|
|
||||||
|
(.*/|)appveyor\.yml|
|
||||||
|
(.*/|)NAMESPACE|
|
||||||
|
(.*/|)renv/settings\.dcf|
|
||||||
|
(.*/|)renv\.lock|
|
||||||
|
(.*/|)WORDLIST|
|
||||||
|
\.github/workflows/.*|
|
||||||
|
data/.*|
|
||||||
|
)$
|
||||||
|
- id: readme-rmd-rendered
|
||||||
|
- id: parsable-R
|
||||||
|
- id: no-browser-statement
|
||||||
|
- id: no-print-statement
|
||||||
|
- id: no-debug-statement
|
||||||
|
- id: deps-in-desc
|
||||||
|
- id: pkgdown
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v5.0.0
|
||||||
|
hooks:
|
||||||
|
- id: check-added-large-files
|
||||||
|
args: ["--maxkb=200"]
|
||||||
|
- id: file-contents-sorter
|
||||||
|
files: '^\.Rbuildignore$'
|
||||||
|
- id: end-of-file-fixer
|
||||||
|
exclude: '\.Rd'
|
||||||
|
- repo: https://github.com/pre-commit-ci/pre-commit-ci-config
|
||||||
|
rev: v1.6.1
|
||||||
|
hooks:
|
||||||
|
# Only required when https://pre-commit.ci is used for config validation
|
||||||
|
- id: check-pre-commit-ci-config
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: forbid-to-commit
|
||||||
|
name: Don't commit common R artifacts
|
||||||
|
entry: Cannot commit .Rhistory, .RData, .Rds or .rds.
|
||||||
|
language: fail
|
||||||
|
files: '\.(Rhistory|RData|Rds|rds)$'
|
||||||
|
# `exclude: <regex>` to allow committing specific files
|
||||||
|
|
||||||
|
ci:
|
||||||
|
autoupdate_schedule: monthly
|
||||||
|
skip: [pkgdown]
|
||||||
59
DESCRIPTION
|
|
@ -1,39 +1,44 @@
|
||||||
Package: visualizeR
|
|
||||||
Type: Package
|
Type: Package
|
||||||
|
Package: visualizeR
|
||||||
Title: What a color! What a viz!
|
Title: What a color! What a viz!
|
||||||
Version: 0.8.9000
|
Version: 1.0
|
||||||
Authors@R: c(
|
Authors@R:
|
||||||
person(
|
person("Noblet", "Guillaume", , "gnoblet@zaclys.net", role = c("aut", "cre"))
|
||||||
'Noblet', 'Guillaume',
|
Maintainer: Guillaume Noblet <gnoblet@zaclys.net>
|
||||||
email = 'gnoblet@zaclys.net',
|
Description: It basically provides colors as hex codes, color palettes,
|
||||||
role = c('aut', 'cre')
|
and some viz functions (graphs and maps).
|
||||||
)
|
License: GPL (>= 3)
|
||||||
)
|
|
||||||
URL: https://github.com/gnoblet/visualizeR,
|
URL: https://github.com/gnoblet/visualizeR,
|
||||||
https://gnoblet.github.io/visualizeR/
|
https://gnoblet.github.io/visualizeR/
|
||||||
Maintainer: Guillaume Noblet <gnoblet@zaclys.net>
|
Depends:
|
||||||
Description: It basically provides colors as hex codes, color palettes, and some viz functions (graphs and maps).
|
R (>= 4.1.0)
|
||||||
Depends: R (>= 4.1.0)
|
|
||||||
License: GPL (>= 3)
|
|
||||||
Encoding: UTF-8
|
|
||||||
LazyData: true
|
|
||||||
RoxygenNote: 7.2.3
|
|
||||||
Imports:
|
Imports:
|
||||||
ggplot2,
|
checkmate,
|
||||||
rlang (>= 0.4.11),
|
|
||||||
grDevices,
|
|
||||||
glue,
|
|
||||||
scales,
|
|
||||||
ggtext,
|
|
||||||
ggrepel,
|
|
||||||
tidyr,
|
|
||||||
dplyr,
|
dplyr,
|
||||||
|
forcats,
|
||||||
ggalluvial,
|
ggalluvial,
|
||||||
|
ggplot2,
|
||||||
|
ggrepel,
|
||||||
|
ggtext,
|
||||||
|
glue,
|
||||||
|
grDevices,
|
||||||
|
rlang (>= 0.4.11),
|
||||||
|
scales,
|
||||||
|
stringr,
|
||||||
|
tidyr,
|
||||||
viridisLite,
|
viridisLite,
|
||||||
waffle
|
waffle
|
||||||
Suggests:
|
Suggests:
|
||||||
knitr,
|
knitr,
|
||||||
|
rio,
|
||||||
|
rmarkdown,
|
||||||
roxygen2,
|
roxygen2,
|
||||||
sf,
|
testthat (>= 3.0.0),
|
||||||
tmap
|
vdiffr,
|
||||||
VignetteBuilder: knitr
|
mockery
|
||||||
|
VignetteBuilder:
|
||||||
|
knitr
|
||||||
|
Config/testthat/edition: 3
|
||||||
|
Encoding: UTF-8
|
||||||
|
LazyData: true
|
||||||
|
RoxygenNote: 7.3.2
|
||||||
|
|
|
||||||
104
R/alluvial.R
|
|
@ -1,104 +0,0 @@
|
||||||
#' @title Simple alluvial chart
|
|
||||||
#'
|
|
||||||
#' @param df A data frame.
|
|
||||||
#' @param from A character column of upstream stratum.
|
|
||||||
#' @param to A character column of downstream stratum.
|
|
||||||
#' @param value A numeric column of values.
|
|
||||||
#' @param group The grouping column to fill the alluvium with.
|
|
||||||
#' @param alpha Fill transparency. Default to 0.5.
|
|
||||||
#' @param from_levels Order by given from levels?
|
|
||||||
#' @param value_title The value/y scale title. Default to NULL.
|
|
||||||
#' @param group_title The group title. Default to NULL.
|
|
||||||
#' @param title Plot title. Default to NULL.
|
|
||||||
#' @param subtitle Plot subtitle. Default to NULL.
|
|
||||||
#' @param caption Plot caption. Default to NULL.
|
|
||||||
#' @param rect_color Stratum rectangles' fill color.
|
|
||||||
#' @param rect_border_color Stratum rectangles' border color.
|
|
||||||
#' @param rect_text_color Stratum rectangles' text color.
|
|
||||||
#' @param theme Whatever theme. Default to theme_reach().
|
|
||||||
#'
|
|
||||||
#' @return A donut chart to be used parsimoniously
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
alluvial <- function(
|
|
||||||
df,
|
|
||||||
from,
|
|
||||||
to,
|
|
||||||
value,
|
|
||||||
group = NULL,
|
|
||||||
alpha = 0.5,
|
|
||||||
from_levels = NULL,
|
|
||||||
value_title = NULL,
|
|
||||||
group_title = NULL,
|
|
||||||
title = NULL,
|
|
||||||
subtitle = NULL,
|
|
||||||
caption = NULL,
|
|
||||||
rect_color = cols_reach("white"),
|
|
||||||
rect_border_color = cols_reach("main_grey"),
|
|
||||||
rect_text_color = cols_reach("main_grey"),
|
|
||||||
theme = theme_reach(axis_y = FALSE,
|
|
||||||
legend_position = "none")
|
|
||||||
){
|
|
||||||
|
|
||||||
if(!is.null(from_levels)) df <- dplyr::mutate(df, "{{from}}" := factor({{ from }}, levels = from_levels))
|
|
||||||
|
|
||||||
# General mapping
|
|
||||||
g <- ggplot2::ggplot(
|
|
||||||
data = df,
|
|
||||||
mapping = ggplot2::aes(
|
|
||||||
y = {{ value }},
|
|
||||||
axis1 = {{ from }},
|
|
||||||
axis3 = {{ to }}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add alluvium
|
|
||||||
g <- g +
|
|
||||||
ggalluvial::geom_alluvium(
|
|
||||||
ggplot2::aes(
|
|
||||||
fill = {{ group }},
|
|
||||||
color = {{ group }}
|
|
||||||
),
|
|
||||||
alpha = alpha)
|
|
||||||
|
|
||||||
# Add stratum
|
|
||||||
g <- g +
|
|
||||||
ggalluvial::geom_stratum(
|
|
||||||
fill = rect_color,
|
|
||||||
color = rect_border_color
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add stratum text
|
|
||||||
|
|
||||||
stratum <- ggalluvial::StatStratum
|
|
||||||
|
|
||||||
g <- g +
|
|
||||||
ggplot2::geom_text(
|
|
||||||
stat = stratum,
|
|
||||||
ggplot2::aes(label = ggplot2::after_stat(!!rlang::sym("stratum"))),
|
|
||||||
color = cols_reach("main_grey")
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# Add title, subtitle, caption, x_title, y_title
|
|
||||||
g <- g + ggplot2::labs(
|
|
||||||
y = value_title,
|
|
||||||
title = title,
|
|
||||||
subtitle = subtitle,
|
|
||||||
caption = caption,
|
|
||||||
fill = group_title,
|
|
||||||
color = group_title
|
|
||||||
)
|
|
||||||
|
|
||||||
# Remove x-axis
|
|
||||||
g <- g + ggplot2::theme(
|
|
||||||
axis.line.x = ggplot2::element_blank(),
|
|
||||||
axis.ticks.x = ggplot2::element_blank(),
|
|
||||||
axis.text.x = ggplot2::element_blank(),
|
|
||||||
axis.title.x = ggplot2::element_blank()
|
|
||||||
)
|
|
||||||
|
|
||||||
g <- g + theme
|
|
||||||
|
|
||||||
return(g)
|
|
||||||
}
|
|
||||||
495
R/bar.R
|
|
@ -1,11 +1,34 @@
|
||||||
#' @title Simple bar chart
|
#' @rdname bar
|
||||||
|
#'
|
||||||
|
#' @inheritParams bar
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
hbar <- function(
|
||||||
|
...,
|
||||||
|
flip = TRUE,
|
||||||
|
add_text = FALSE,
|
||||||
|
theme_fun = theme_bar(flip = flip, add_text = add_text)
|
||||||
|
) {
|
||||||
|
bar(flip = flip, add_text = add_text, theme_fun = theme_fun, ...)
|
||||||
|
}
|
||||||
|
|
||||||
|
#' Simple bar chart
|
||||||
|
#'
|
||||||
|
#' `bar()` is a simple bar chart with some customization allowed, in particular the `theme_fun` argument for theming. `hbar()` uses `bar()` with sane defaults for a horizontal bar chart.
|
||||||
#'
|
#'
|
||||||
#' @param df A data frame.
|
#' @param df A data frame.
|
||||||
#' @param x A numeric column.
|
#' @param x A quoted numeric column.
|
||||||
#' @param y A character column or coercible as a character column.
|
#' @param y A quoted character column or coercible as a character column.
|
||||||
#' @param group Some grouping categorical column, e.g. administrative areas or population groups.
|
#' @param group Some quoted grouping categorical column, e.g. administrative areas or population groups.
|
||||||
#' @param flip TRUE or FALSE. Default to TRUE or horizontal bar plot.
|
#' @param facet Some quoted grouping categorical column, e.g. administrative areas or population groups.
|
||||||
#' @param percent TRUE or FALSE. Should the x-labels (and text labels if present) be displayed as percentages? Default to TRUE.
|
#' @param x_rm_na Remove NAs in x?
|
||||||
|
#' @param y_rm_na Remove NAs in y?
|
||||||
|
#' @param group_rm_na Remove NAs in group?
|
||||||
|
#' @param facet_rm_na Remove NAs in facet?
|
||||||
|
#' @param y_expand Multiplier to expand the y axis.
|
||||||
|
#' @param add_color Add a color to bars (if no grouping).
|
||||||
|
#' @param add_color_guide Should a legend be added?
|
||||||
|
#' @param flip TRUE or FALSE (default). Default to TRUE or horizontal bar plot.
|
||||||
#' @param wrap Should x-labels be wrapped? Number of characters.
|
#' @param wrap Should x-labels be wrapped? Number of characters.
|
||||||
#' @param position Should the chart be stacked? Default to "dodge". Can take "dodge" and "stack".
|
#' @param position Should the chart be stacked? Default to "dodge". Can take "dodge" and "stack".
|
||||||
#' @param alpha Fill transparency.
|
#' @param alpha Fill transparency.
|
||||||
|
|
@ -15,127 +38,439 @@
|
||||||
#' @param title Plot title. Default to NULL.
|
#' @param title Plot title. Default to NULL.
|
||||||
#' @param subtitle Plot subtitle. Default to NULL.
|
#' @param subtitle Plot subtitle. Default to NULL.
|
||||||
#' @param caption Plot caption. Default to NULL.
|
#' @param caption Plot caption. Default to NULL.
|
||||||
#' @param add_text TRUE or FALSE. Add the value as text.
|
#' @param width Bar width.
|
||||||
|
#' @param add_text TRUE or FALSE. Add values as text.
|
||||||
|
#' @param add_text_size Text size.
|
||||||
|
#' @param add_text_color Text color.
|
||||||
|
#' @param add_text_font_face Text font_face.
|
||||||
|
#' @param add_text_threshold_display Minimum value to add the text label.
|
||||||
#' @param add_text_suffix If percent is FALSE, should we add a suffix to the text label?
|
#' @param add_text_suffix If percent is FALSE, should we add a suffix to the text label?
|
||||||
#' @param theme Whatever theme. Default to theme_reach().
|
#' @param add_text_expand_limit Default to adding 10\% on top of the bar.
|
||||||
|
#' @param add_text_round Round the text label.
|
||||||
|
#' @param theme_fun Whatever theme function. For no custom theme, use theme_fun = NULL.
|
||||||
#'
|
#'
|
||||||
#' @return A bar chart
|
#' @inheritParams reorder_by
|
||||||
|
#'
|
||||||
|
#' @importFrom rlang `:=`
|
||||||
#'
|
#'
|
||||||
#' @export
|
#' @export
|
||||||
bar <- function(df, x, y, group = NULL, flip = TRUE, percent = TRUE, wrap = NULL, position = "dodge", alpha = 1, x_title = NULL, y_title = NULL, group_title = NULL, title = NULL, subtitle = NULL, caption = NULL, add_text = FALSE, add_text_suffix = "", theme = theme_reach()){
|
bar <- function(
|
||||||
|
df,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
group = "",
|
||||||
|
facet = "",
|
||||||
|
order = "none",
|
||||||
|
x_rm_na = TRUE,
|
||||||
|
y_rm_na = TRUE,
|
||||||
|
group_rm_na = TRUE,
|
||||||
|
facet_rm_na = TRUE,
|
||||||
|
y_expand = 0.1,
|
||||||
|
add_color = color("cat_5_main_1"),
|
||||||
|
add_color_guide = TRUE,
|
||||||
|
flip = FALSE,
|
||||||
|
wrap = NULL,
|
||||||
|
position = "dodge",
|
||||||
|
alpha = 1,
|
||||||
|
x_title = NULL,
|
||||||
|
y_title = NULL,
|
||||||
|
group_title = NULL,
|
||||||
|
title = NULL,
|
||||||
|
subtitle = NULL,
|
||||||
|
caption = NULL,
|
||||||
|
width = 0.8,
|
||||||
|
add_text = FALSE,
|
||||||
|
add_text_size = 4.5,
|
||||||
|
add_text_color = color("dark_grey"),
|
||||||
|
add_text_font_face = "bold",
|
||||||
|
add_text_threshold_display = 0.05,
|
||||||
|
add_text_suffix = "%",
|
||||||
|
add_text_expand_limit = 1.2,
|
||||||
|
add_text_round = 1,
|
||||||
|
theme_fun = theme_bar(
|
||||||
|
flip = flip,
|
||||||
|
add_text = add_text,
|
||||||
|
axis_text_x_angle = 0,
|
||||||
|
axis_text_x_vjust = 0.5,
|
||||||
|
axis_text_x_hjust = 0.5
|
||||||
|
),
|
||||||
|
scale_fill_fun = scale_fill_visualizer_discrete(),
|
||||||
|
scale_color_fun = scale_color_visualizer_discrete()
|
||||||
|
) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
# To do :
|
# df is a data frame
|
||||||
# - automate bar width and text size, or at least give the flexibility and still center text
|
checkmate::assert_data_frame(df)
|
||||||
# - add facet possibility
|
|
||||||
|
|
||||||
# Prepare group, x and y names
|
# x and y and group are character
|
||||||
# if (is.null(x_title)) x_title <- rlang::as_name(rlang::enquo(x))
|
checkmate::assert_character(x, len = 1)
|
||||||
# if (is.null(y_title)) y_title <- rlang::as_name(rlang::enquo(y))
|
checkmate::assert_character(y, len = 1)
|
||||||
# if (is.null(group_title)) group_title <- rlang::as_name(rlang::enquo(group))
|
checkmate::assert_character(group, len = 1)
|
||||||
|
|
||||||
# Mapping
|
# x and y are columns in df
|
||||||
|
checkmate::assert_choice(x, colnames(df))
|
||||||
|
checkmate::assert_choice(y, colnames(df))
|
||||||
|
if (group != "") {
|
||||||
|
checkmate::assert_choice(group, colnames(df))
|
||||||
|
}
|
||||||
|
|
||||||
|
# x_rm_na, y_rm_na and group_rm_na are logical scalar
|
||||||
|
checkmate::assert_logical(x_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(y_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(group_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(facet_rm_na, len = 1)
|
||||||
|
|
||||||
|
# flip is a logical scalar
|
||||||
|
checkmate::assert_logical(flip, len = 1)
|
||||||
|
|
||||||
|
# wrap is a numeric scalar or NULL
|
||||||
|
if (!is.null(wrap)) {
|
||||||
|
checkmate::assert_numeric(wrap, len = 1, null.ok = TRUE)
|
||||||
|
}
|
||||||
|
|
||||||
|
# alpha is a numeric scalar between 0 and 1
|
||||||
|
checkmate::assert_numeric(alpha, lower = 0, upper = 1, len = 1)
|
||||||
|
|
||||||
|
# add_text is a logical scalar
|
||||||
|
checkmate::assert_logical(add_text, len = 1)
|
||||||
|
|
||||||
|
# add_text_size is a numeric scalar
|
||||||
|
checkmate::assert_numeric(add_text_size, len = 1)
|
||||||
|
|
||||||
|
# add_text_font_face is a character scalar in bold plain or italic
|
||||||
|
checkmate::assert_choice(add_text_font_face, c("bold", "plain", "italic"))
|
||||||
|
|
||||||
|
# add_text_threshold_display is a numeric scalar
|
||||||
|
checkmate::assert_numeric(add_text_threshold_display, len = 1)
|
||||||
|
|
||||||
|
# add_text_suffix is a character scalar
|
||||||
|
checkmate::assert_character(add_text_suffix, len = 1)
|
||||||
|
|
||||||
|
# add_text_expand_limit is a numeric scalar
|
||||||
|
checkmate::assert_numeric(add_text_expand_limit, len = 1)
|
||||||
|
|
||||||
|
# add_text_round is a numeric scalar
|
||||||
|
checkmate::assert_numeric(add_text_round, len = 1)
|
||||||
|
|
||||||
|
# x and y are numeric or character
|
||||||
|
if (class(df[[y]]) %notin% c("integer", "numeric")) {
|
||||||
|
rlang::abort(paste0(y, " must be numeric."))
|
||||||
|
}
|
||||||
|
if (!any(class(df[[x]]) %in% c("character", "factor"))) {
|
||||||
|
rlang::abort(paste0(x, " must be character or factor"))
|
||||||
|
}
|
||||||
|
|
||||||
|
# width is a numeric scalar between 0 and 1
|
||||||
|
checkmate::assert_numeric(width, lower = 0, upper = 1, len = 1)
|
||||||
|
|
||||||
|
# Check if position is stack or dodge
|
||||||
|
if (position %notin% c("stack", "dodge")) {
|
||||||
|
rlang::abort("Position should be either 'stack' or 'dodge'.")
|
||||||
|
}
|
||||||
|
|
||||||
|
#----- Data wrangling
|
||||||
|
|
||||||
|
# facets over group
|
||||||
|
if (group != "" && facet != "" && group == facet) {
|
||||||
|
rlang::warn("'group' and 'facet' are the same identical.")
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove NAs using base R
|
||||||
|
if (x_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[x]])), ]
|
||||||
|
}
|
||||||
|
if (y_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[y]])), ]
|
||||||
|
}
|
||||||
|
if (group != "" && group_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[group]])), ]
|
||||||
|
}
|
||||||
|
if (facet != "" && facet_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[facet]])), ]
|
||||||
|
}
|
||||||
|
|
||||||
|
# reorder
|
||||||
|
dir_order <- if (flip && order %in% c("x", "grouped_x")) {
|
||||||
|
-1
|
||||||
|
} else if (!flip && order %in% c("x", "grouped_x")) {
|
||||||
|
1
|
||||||
|
} else if (flip) {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
group_order <- if (group != "" || (group == "" && facet == "")) {
|
||||||
|
group
|
||||||
|
} else if (group == "" && facet != "") {
|
||||||
|
facet
|
||||||
|
}
|
||||||
|
df <- reorder_by(
|
||||||
|
df = df,
|
||||||
|
x = x,
|
||||||
|
y = y,
|
||||||
|
group = group_order,
|
||||||
|
order = order,
|
||||||
|
dir_order = dir_order
|
||||||
|
)
|
||||||
|
|
||||||
|
# prepare aes
|
||||||
|
if (group != "") {
|
||||||
g <- ggplot2::ggplot(
|
g <- ggplot2::ggplot(
|
||||||
df,
|
df,
|
||||||
mapping = ggplot2::aes(x = {{ x }}, y = {{ y }}, fill = {{ group }}, color = {{ group }}
|
mapping = ggplot2::aes(
|
||||||
|
x = !!rlang::sym(x),
|
||||||
|
y = !!rlang::sym(y),
|
||||||
|
fill = !!rlang::sym(group),
|
||||||
|
color = !!rlang::sym(group)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
} else {
|
||||||
|
g <- ggplot2::ggplot(
|
||||||
|
df,
|
||||||
|
mapping = ggplot2::aes(
|
||||||
|
x = !!rlang::sym(x),
|
||||||
|
y = !!rlang::sym(y)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
# Add title, subtitle, caption, x_title, y_title
|
# add title, subtitle, caption, x_title, y_title
|
||||||
g <- g + ggplot2::labs(
|
g <- g +
|
||||||
|
ggplot2::labs(
|
||||||
title = title,
|
title = title,
|
||||||
subtitle = subtitle,
|
subtitle = subtitle,
|
||||||
caption = caption,
|
caption = caption,
|
||||||
x = x_title,
|
x = y_title,
|
||||||
y = y_title,
|
y = x_title,
|
||||||
color = group_title,
|
color = group_title,
|
||||||
fill = group_title
|
fill = group_title
|
||||||
)
|
)
|
||||||
|
|
||||||
width <- 0.5
|
# width
|
||||||
dodge_width <- 0.5
|
width <- width
|
||||||
|
dodge_width <- width
|
||||||
|
|
||||||
# Should the graph use position_fill?
|
# facets
|
||||||
if (position == "stack"){
|
if (facet != "") {
|
||||||
g <- g + ggplot2::geom_col(
|
if (flip) {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::facet_grid(
|
||||||
|
rows = ggplot2::vars(!!rlang::sym(facet)),
|
||||||
|
scales = "free",
|
||||||
|
space = "free_y"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::facet_grid(
|
||||||
|
cols = ggplot2::vars(!!rlang::sym(facet)),
|
||||||
|
scales = "free",
|
||||||
|
space = "free_x"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# should the graph use position_fill?
|
||||||
|
if (group != "") {
|
||||||
|
if (position == "stack") {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_col(
|
||||||
alpha = alpha,
|
alpha = alpha,
|
||||||
width = width,
|
width = width,
|
||||||
position = ggplot2::position_stack()
|
position = ggplot2::position_stack()
|
||||||
)
|
)
|
||||||
} else if (position == "dodge"){
|
} else if (position == "dodge") {
|
||||||
g <- g + ggplot2::geom_col(
|
g <- g +
|
||||||
|
ggplot2::geom_col(
|
||||||
alpha = alpha,
|
alpha = alpha,
|
||||||
width = width,
|
width = width,
|
||||||
position = ggplot2::position_dodge2(
|
position = ggplot2::position_dodge2(
|
||||||
width = dodge_width,
|
width = dodge_width,
|
||||||
preserve = "single")
|
preserve = "single"
|
||||||
)
|
)
|
||||||
} else{
|
)
|
||||||
g <- g + ggplot2::geom_col(
|
} else {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_col(
|
||||||
alpha = alpha,
|
alpha = alpha,
|
||||||
width = width
|
width = width
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
#
|
} else {
|
||||||
# Labels to percent and expand scale
|
if (position == "stack") {
|
||||||
if (percent) {
|
g <- g +
|
||||||
g <- g + ggplot2::scale_y_continuous(
|
ggplot2::geom_col(
|
||||||
labels = scales::label_percent(
|
alpha = alpha,
|
||||||
accuracy = 1,
|
width = width,
|
||||||
decimal.mark = ",",
|
position = ggplot2::position_stack(),
|
||||||
suffix = " %"),
|
fill = add_color,
|
||||||
expand = c(0.01, 0.1)
|
color = add_color
|
||||||
|
)
|
||||||
|
} else if (position == "dodge") {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_col(
|
||||||
|
alpha = alpha,
|
||||||
|
width = width,
|
||||||
|
position = ggplot2::position_dodge2(
|
||||||
|
width = dodge_width,
|
||||||
|
preserve = "single"
|
||||||
|
),
|
||||||
|
fill = add_color,
|
||||||
|
color = add_color
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
g <- g + ggplot2::scale_y_continuous(expand = c(0.01, 0.1))
|
g <- g +
|
||||||
|
ggplot2::geom_col(
|
||||||
|
alpha = alpha,
|
||||||
|
width = width,
|
||||||
|
fill = add_color,
|
||||||
|
color = add_color
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# wrap labels on the x scale?
|
||||||
if (!is.null(wrap)) {
|
if (!is.null(wrap)) {
|
||||||
g <- g + ggplot2::scale_x_discrete(labels = scales::label_wrap(wrap))
|
g <- g + ggplot2::scale_x_discrete(labels = scales::label_wrap(wrap))
|
||||||
}
|
}
|
||||||
|
|
||||||
# Because a text legend should always be horizontal, especially for an horizontal bar graph
|
# because a text legend should always be horizontal, especially for an horizontal bar graph
|
||||||
if (flip){
|
if (flip) {
|
||||||
g <- g + ggplot2::coord_flip()
|
g <- g + ggplot2::coord_flip()
|
||||||
}
|
}
|
||||||
|
# add text to bars
|
||||||
# Add text to bars
|
if (flip) {
|
||||||
if (flip) hjust_flip <- 1.5 else hjust_flip <- 0.5
|
hjust_flip <- -0.5
|
||||||
if (flip) vjust_flip <- 0.5 else vjust_flip <- 1.5
|
|
||||||
|
|
||||||
if (add_text & position != "dodge") {
|
|
||||||
rlang::abort("Adding text labels and positions different than dodges as not been implemented yet")
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add text labels
|
|
||||||
if (add_text) {
|
|
||||||
if (percent) {
|
|
||||||
g <- g + ggplot2::geom_text(
|
|
||||||
ggplot2::aes(
|
|
||||||
label = scales::label_percent(
|
|
||||||
accuracy = 1,
|
|
||||||
decimal.mark = ",",
|
|
||||||
suffix = " %")({{ y }}),
|
|
||||||
group = {{ group }}),
|
|
||||||
hjust = hjust_flip,
|
|
||||||
vjust = vjust_flip,
|
|
||||||
color = "white",
|
|
||||||
fontface = "bold",
|
|
||||||
position = ggplot2::position_dodge(width = dodge_width))
|
|
||||||
} else {
|
} else {
|
||||||
g <- g + ggplot2::geom_text(
|
hjust_flip <- 0.5
|
||||||
ggplot2::aes(
|
}
|
||||||
label = paste0(round({{ y }}), add_text_suffix),
|
if (flip) {
|
||||||
group = {{ group }}),
|
vjust_flip <- 0.5
|
||||||
hjust = hjust_flip,
|
} else {
|
||||||
vjust = vjust_flip,
|
vjust_flip <- -0.5
|
||||||
color = "white",
|
}
|
||||||
fontface = "bold",
|
|
||||||
position = ggplot2::position_dodge(width = dodge_width))
|
# function for interaction
|
||||||
|
interaction_f <- function(group, facet, data) {
|
||||||
|
if (group == "" && facet == "") {
|
||||||
|
return(NULL)
|
||||||
|
} else if (group != "" && facet != "") {
|
||||||
|
return(interaction(data[[group]], data[[facet]]))
|
||||||
|
} else if (group != "") {
|
||||||
|
return(data[[group]])
|
||||||
|
} else if (facet != "") {
|
||||||
|
return(data[[facet]])
|
||||||
|
} else {
|
||||||
|
return(NULL)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add theme
|
# add text labels
|
||||||
g <- g + theme
|
if (add_text & position == "dodge") {
|
||||||
|
df <- dplyr::mutate(
|
||||||
|
df,
|
||||||
|
"y_threshold" := ifelse(
|
||||||
|
!!rlang::sym(y) >= add_text_threshold_display,
|
||||||
|
!!rlang::sym(y),
|
||||||
|
NA
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# expand limits
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_blank(
|
||||||
|
data = df,
|
||||||
|
ggplot2::aes(
|
||||||
|
x = !!rlang::sym(x),
|
||||||
|
y = !!rlang::sym(y) * add_text_expand_limit,
|
||||||
|
group = interaction_f(group, facet, df)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_text(
|
||||||
|
data = df,
|
||||||
|
ggplot2::aes(
|
||||||
|
label = ifelse(
|
||||||
|
is.na(!!rlang::sym("y_threshold")),
|
||||||
|
NA,
|
||||||
|
paste0(
|
||||||
|
round(!!rlang::sym("y_threshold"), add_text_round),
|
||||||
|
add_text_suffix
|
||||||
|
)
|
||||||
|
),
|
||||||
|
group = interaction_f(group, facet, df)
|
||||||
|
),
|
||||||
|
hjust = hjust_flip,
|
||||||
|
vjust = vjust_flip,
|
||||||
|
color = add_text_color,
|
||||||
|
fontface = add_text_font_face,
|
||||||
|
size = add_text_size,
|
||||||
|
position = ggplot2::position_dodge2(width = dodge_width)
|
||||||
|
)
|
||||||
|
} else if (add_text & position == "stack") {
|
||||||
|
df <- dplyr::mutate(
|
||||||
|
df,
|
||||||
|
"y_threshold" := ifelse(
|
||||||
|
!!rlang::sym(y) >= add_text_threshold_display,
|
||||||
|
!!rlang::sym(y),
|
||||||
|
NA
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_text(
|
||||||
|
data = df,
|
||||||
|
ggplot2::aes(
|
||||||
|
label = ifelse(
|
||||||
|
is.na(!!rlang::sym("y_threshold")),
|
||||||
|
NA,
|
||||||
|
paste0(
|
||||||
|
round(!!rlang::sym("y_threshold"), add_text_round),
|
||||||
|
add_text_suffix
|
||||||
|
)
|
||||||
|
),
|
||||||
|
group = interaction_f(group, facet, df)
|
||||||
|
),
|
||||||
|
hjust = hjust_flip,
|
||||||
|
vjust = vjust_flip,
|
||||||
|
color = add_text_color,
|
||||||
|
fontface = add_text_font_face,
|
||||||
|
size = add_text_size,
|
||||||
|
position = ggplot2::position_dodge2(width = dodge_width)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# y scale tweaks
|
||||||
|
g <- g +
|
||||||
|
ggplot2::scale_y_continuous(
|
||||||
|
# start at 0
|
||||||
|
expand = ggplot2::expansion(mult = c(0, y_expand)),
|
||||||
|
# remove trailing 0 and choose accuracy of y labels
|
||||||
|
labels = scales::label_number(
|
||||||
|
accuracy = 0.1,
|
||||||
|
drop0trailing = TRUE,
|
||||||
|
big.mark = "",
|
||||||
|
decimal.mark = "."
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
# # remove guides for legend if !add_color_guide
|
||||||
|
if (!add_color_guide) {
|
||||||
|
g <- g + ggplot2::guides(fill = "none", color = "none")
|
||||||
|
}
|
||||||
|
|
||||||
|
# # add theme fun
|
||||||
|
if (!is.null(theme_fun)) {
|
||||||
|
g <- g + theme_fun
|
||||||
|
}
|
||||||
|
|
||||||
|
# # # add scale fun
|
||||||
|
if (!is.null(scale_fill_fun)) {
|
||||||
|
g <- g + scale_fill_fun
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is.null(scale_color_fun)) {
|
||||||
|
g <- g + scale_color_fun
|
||||||
|
}
|
||||||
|
|
||||||
return(g)
|
return(g)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
#' @title Bbbox buffer
|
|
||||||
#'
|
|
||||||
#' @param sf_obj A `sf` object
|
|
||||||
#' @param buffer A buffer, either one value or a vector of 4 values (left, bottom, right, top). Default to 0.
|
|
||||||
#'
|
|
||||||
#' @return A bbox with a buffer
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
buffer_bbox <- function(sf_obj, buffer = 0){
|
|
||||||
|
|
||||||
rlang::check_installed("sf", reason = "Package \"sf\" needed for `buffer_bbox()` to work. Please install it.")
|
|
||||||
|
|
||||||
|
|
||||||
if (!(length(buffer) %in% c(1,4)) | !is.numeric(buffer)) stop("Please provide a numeric buffer of length 1 or 4.")
|
|
||||||
|
|
||||||
bbox <- sf::st_bbox(sf_obj)
|
|
||||||
xrange <- bbox$xmax - bbox$xmin # range of x values
|
|
||||||
yrange <- bbox$ymax - bbox$ymin # range of y values
|
|
||||||
|
|
||||||
|
|
||||||
bbox_with_buffer <- if (length(buffer) == 1) {
|
|
||||||
c(
|
|
||||||
bbox[1] - (buffer * xrange), # xmin - left
|
|
||||||
bbox[2] - (buffer * yrange), # ymin - bottom
|
|
||||||
bbox[3] + (buffer * xrange), # xmax - right
|
|
||||||
bbox[4] + (buffer * yrange) # ymax - top
|
|
||||||
)
|
|
||||||
} else if (length(buffer) == 4) {
|
|
||||||
c(
|
|
||||||
bbox[1] - (buffer[1] * xrange), # xmin - left
|
|
||||||
bbox[2] - (buffer[2] * yrange), # ymin - bottom
|
|
||||||
bbox[3] + (buffer[3] * xrange), # xmax - right
|
|
||||||
bbox[4] + (buffer[4] * yrange) # ymax - top
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
print("Missed something while writing the funtion.")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
17
R/checks.R
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#' @title Check if variables are in data frame
|
||||||
|
#'
|
||||||
|
#' @param df A data frame
|
||||||
|
#' @param vars A vector of variable names
|
||||||
|
#'
|
||||||
|
#' @return A stop statement
|
||||||
|
check_vars_in_df <- function(df, vars) {
|
||||||
|
vars_nin <- setdiff(vars, colnames(df))
|
||||||
|
|
||||||
|
if (length(vars_nin) > 0) {
|
||||||
|
rlang::abort(glue::glue(
|
||||||
|
"Variables ",
|
||||||
|
glue::glue_collapse(vars_nin, sep = ", ", last = ", and "),
|
||||||
|
" not found in data frame."
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
162
R/color.R
Normal file
|
|
@ -0,0 +1,162 @@
|
||||||
|
#' Helpers to extract defined colors as hex codes
|
||||||
|
#'
|
||||||
|
#' [color()] returns the requested columns, returns NA if absent. [color_pattern()] returns all colors that start with the pattern.
|
||||||
|
#'
|
||||||
|
#' @param ... Character names of colors. If NULL returns all colors.
|
||||||
|
#' @param unname Boolean. Should the output vector be unnamed? Default to `TRUE`.
|
||||||
|
#' @section Naming of colors:
|
||||||
|
#' * All branding colors start with "branding";
|
||||||
|
#' * All , categorical colors start with ", cat_";
|
||||||
|
#' * All sequential colors start with "seq_";
|
||||||
|
#'
|
||||||
|
#' Then, a number indicates the number of colors that belong to the palettes, a string the name of the palette, and, finally, a number the position of the color. E.g., "seq_5_red_4" would be the 4th color of a continuous palettes of 5 colors in the red band. Exception is made for white, light_grey, dark_grey, and black.
|
||||||
|
#'
|
||||||
|
#'
|
||||||
|
#' @return Hex codes named or unnamed.
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
color <- function(..., unname = TRUE) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
# unname is a logical scalar
|
||||||
|
checkmate::assert_logical(unname, len = 1)
|
||||||
|
|
||||||
|
# all elements in ... are character strings
|
||||||
|
dots <- list(...)
|
||||||
|
if (length(dots) > 0) {
|
||||||
|
# Check each argument is a single character string
|
||||||
|
for (i in seq_along(dots)) {
|
||||||
|
checkmate::assert_string(dots[[i]], .var.name = paste0("Argument #", i))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#------ Prep
|
||||||
|
|
||||||
|
# retrieve colors
|
||||||
|
cols <- c(...)
|
||||||
|
|
||||||
|
# define color vector
|
||||||
|
colors <- c(
|
||||||
|
white = "#FFFFFF",
|
||||||
|
lighter_grey = "#F5F5F5",
|
||||||
|
light_grey = "#E3E3E3",
|
||||||
|
dark_grey = "#464647",
|
||||||
|
light_blue_grey = "#B3C6D1",
|
||||||
|
grey = "#71716F",
|
||||||
|
black = "#000000",
|
||||||
|
cat_2_yellow_1 = "#ffc20a",
|
||||||
|
cat_2_yellow_2 = "#0c7bdc",
|
||||||
|
cat_2_light_1 = "#fefe62",
|
||||||
|
cat_2_light_2 = "#d35fb7",
|
||||||
|
cat_2_green_1 = "#1aff1a",
|
||||||
|
cat_2_green_2 = "#4b0092",
|
||||||
|
cat_2_blue_1 = "#1a85ff",
|
||||||
|
cat_2_blue_2 = "#d41159",
|
||||||
|
cat_5_main_1 = "#083d77", # yale blue
|
||||||
|
cat_5_main_2 = "#4ecdc4", # robin egg blue
|
||||||
|
cat_5_main_3 = "#f4c095", # peach
|
||||||
|
cat_5_main_4 = "#b47eb3", # african violet
|
||||||
|
cat_5_main_5 = "#ffd5ff", # mimi pink
|
||||||
|
seq_5_main_1 = "#083d77", # yale blue
|
||||||
|
seq_5_main_2 = "##396492",
|
||||||
|
seq_5_main_3 = "#6b8bad",
|
||||||
|
seq_5_main_4 = "#9cb1c9",
|
||||||
|
seq_5_main_5 = "#ced8e4",
|
||||||
|
cat_5_ibm_1 = "#648fff",
|
||||||
|
cat_5_ibm_2 = "#785ef0",
|
||||||
|
cat_5_ibm_3 = "#dc267f",
|
||||||
|
cat_5_ibm_4 = "#fe6100",
|
||||||
|
cat_5_ibm_5 = "#ffb000",
|
||||||
|
cat_3_aquamarine_1 = "aquamarine2",
|
||||||
|
cat_3_aquamarine_2 = "cornflowerblue",
|
||||||
|
cat_3_aquamarine_3 = "brown1",
|
||||||
|
cat_3_tol_high_contrast_1 = "#215589",
|
||||||
|
cat_3_tol_high_contrast_2 = "#cfaa34",
|
||||||
|
cat_3_tol_high_contrast_3 = "#a35364",
|
||||||
|
cat_8_tol_adapted_1 = "#332e86",
|
||||||
|
cat_8_tol_adapted_2 = "#50504f",
|
||||||
|
cat_8_tol_adapted_3 = "#3dab9a",
|
||||||
|
cat_8_tol_adapted_4 = "#86ccee",
|
||||||
|
cat_8_tol_adapted_5 = "#ddcb77",
|
||||||
|
cat_8_tol_adapted_6 = "#ee5859",
|
||||||
|
cat_8_tol_adapted_7 = "#aa4599",
|
||||||
|
cat_8_tol_adapted_8 = "#721220",
|
||||||
|
div_5_orange_blue_1 = "#c85200",
|
||||||
|
div_5_orange_blue_2 = "#e48646",
|
||||||
|
div_5_orange_blue_3 = "#cccccc",
|
||||||
|
div_5_orange_blue_4 = "#6b8ea4",
|
||||||
|
div_5_orange_blue_5 = "#366785",
|
||||||
|
div_5_green_purple_1 = "#c85200",
|
||||||
|
div_5_green_purple_2 = "#e48646",
|
||||||
|
div_5_green_purple_3 = "#cccccc",
|
||||||
|
div_5_green_purple_4 = "#6b8ea4",
|
||||||
|
div_5_green_purple_5 = "#366785"
|
||||||
|
)
|
||||||
|
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
# Check that if ... is not null, all colors are defined
|
||||||
|
if (!is.null(cols)) {
|
||||||
|
if (cols %notallin% names(colors)) {
|
||||||
|
rlang::abort(c(
|
||||||
|
"Some colors not defined",
|
||||||
|
"*" = glue::glue_collapse(
|
||||||
|
...[which(!... %in% names(cols))],
|
||||||
|
sep = ", ",
|
||||||
|
last = ", and "
|
||||||
|
),
|
||||||
|
"i" = "Use `color(unname = FALSE)` to see all named available colors."
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------ Return
|
||||||
|
|
||||||
|
if (is.null(cols)) {
|
||||||
|
cols_to_return <- colors
|
||||||
|
} else {
|
||||||
|
cols_to_return <- colors[cols]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unname) {
|
||||||
|
cols_to_return <- unname(cols_to_return)
|
||||||
|
}
|
||||||
|
|
||||||
|
return(cols_to_return)
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname color
|
||||||
|
#'
|
||||||
|
#' @param pattern Pattern of the start of colors' name.
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
color_pattern <- function(pattern, unname = TRUE) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
# Check that pattern is a character scalar
|
||||||
|
checkmate::assert_character(pattern, len = 1)
|
||||||
|
|
||||||
|
# Check that unname is a logical scalar
|
||||||
|
checkmate::assert_logical(unname, len = 1)
|
||||||
|
|
||||||
|
#------ Get colors
|
||||||
|
|
||||||
|
# Get colors
|
||||||
|
col <- color(unname = FALSE)
|
||||||
|
col <- col[startsWith(names(col), pattern)]
|
||||||
|
|
||||||
|
if (unname) {
|
||||||
|
col <- unname(col)
|
||||||
|
}
|
||||||
|
|
||||||
|
# If col is of length 0, warn
|
||||||
|
if (length(col) == 0) {
|
||||||
|
rlang::warn(c(
|
||||||
|
"No colors match the pattern",
|
||||||
|
"*" = glue::glue("Pattern used is:'{pattern}'"),
|
||||||
|
"i" = "Use `color(unname = FALSE)` to see all named available colors."
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return(col)
|
||||||
|
}
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
#' @title Function to extract AGORA colors as hex codes
|
|
||||||
#'
|
|
||||||
#' @param ... Character names of reach colors. If NULL returns all colors
|
|
||||||
#' @param unnamed Should the output vector be unnamed? Default to `TRUE`
|
|
||||||
#'
|
|
||||||
#' @return An hex code or hex codes named or unnamed
|
|
||||||
#'
|
|
||||||
#' @details This function needs to be modified to add colors
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
cols_agora <- function(..., unnamed = TRUE) {
|
|
||||||
cols <- c(...)
|
|
||||||
|
|
||||||
colors_agora <- c(white = "#FFFFFF",
|
|
||||||
black = "#000000",
|
|
||||||
main_bordeaux = "#581522",
|
|
||||||
main_lt_beige = "#DDD8C4",
|
|
||||||
main_dk_beige = "#B7AD99",
|
|
||||||
main_lt_grey = "#BCB8B1")
|
|
||||||
|
|
||||||
if (is.null(cols)) {
|
|
||||||
cols_to_return <- colors_agora
|
|
||||||
} else {
|
|
||||||
cols_to_return <- colors_agora[cols]
|
|
||||||
}
|
|
||||||
|
|
||||||
if(unnamed){
|
|
||||||
cols_to_return <- unname(cols_to_return)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(cols_to_return)
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#' @title Function to extract IMPACT colors as hex codes
|
|
||||||
#'
|
|
||||||
#' @param ... Character names of reach colors. If NULL returns all colors
|
|
||||||
#' @param unnamed Should the output vector be unnamed? Default to `TRUE`
|
|
||||||
#'
|
|
||||||
#' @return An hex code or hex codes named or unnamed
|
|
||||||
#'
|
|
||||||
#' @details This function needs to be modified to add colors
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
cols_impact <- function(..., unnamed = TRUE) {
|
|
||||||
cols <- c(...)
|
|
||||||
|
|
||||||
colors_impact <- c(white = "#FFFFFF",
|
|
||||||
black = "#000000",
|
|
||||||
main_blue = "#315975",
|
|
||||||
main_gray = "#58585A")
|
|
||||||
|
|
||||||
if (is.null(cols)) {
|
|
||||||
cols_to_return <- colors_impact
|
|
||||||
} else {
|
|
||||||
cols_to_return <- colors_impact[cols]
|
|
||||||
}
|
|
||||||
|
|
||||||
if(unnamed){
|
|
||||||
cols_to_return <- unname(cols_to_return)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(cols_to_return)
|
|
||||||
}
|
|
||||||
168
R/cols_reach.R
|
|
@ -1,168 +0,0 @@
|
||||||
#' @title Function to extract REACH colors as hex codes
|
|
||||||
#'
|
|
||||||
#' @param ... Character names of reach colors. If NULL returns all colors
|
|
||||||
#' @param unnamed Should the output vector be unnamed? Default to `TRUE`
|
|
||||||
#'
|
|
||||||
#' @return An hex code or hex codes named or unnamed
|
|
||||||
#'
|
|
||||||
#' @details This function needs to be modified to add colors
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
cols_reach <- function(..., unnamed = TRUE) {
|
|
||||||
cols <- c(...)
|
|
||||||
|
|
||||||
colors_reach <- c(
|
|
||||||
white = "#FFFFFF",
|
|
||||||
black = "#000000",
|
|
||||||
main_grey = "#58585A",
|
|
||||||
main_red = "#EE5859",
|
|
||||||
main_lt_grey = "#C7C8CA",
|
|
||||||
main_beige = "#D2CBB8",
|
|
||||||
iroise_1 = "#DFECEF",
|
|
||||||
iroise_2 = "#B1D7E0",
|
|
||||||
iroise_3 = "#699DA3",
|
|
||||||
iroise_4 = "#236A7A",
|
|
||||||
iroise_5 = "#0C3842",
|
|
||||||
red_main_1 = "#AE2829",
|
|
||||||
red_main_2 = "#D05E5F",
|
|
||||||
red_main_3 = "#DB9797",
|
|
||||||
red_main_4 = "#EBC7C8",
|
|
||||||
red_main_5 = "#FAF2F2",
|
|
||||||
red_alt_1 = "#792a2e",
|
|
||||||
red_alt_2 = "#c0474a",
|
|
||||||
red_alt_3 = "#ee5859",
|
|
||||||
red_alt_4 = "#f49695",
|
|
||||||
red_alt_5 = "#f8d6d6",
|
|
||||||
red_alt_na = "#f8f4f4",
|
|
||||||
lt_grey_1 = "#C6C6C6",
|
|
||||||
lt_grey_2 = "#818183",
|
|
||||||
grey3 = "#E3E3E3",
|
|
||||||
dk_grey = "#464647",
|
|
||||||
two_dots_1 = "#706441",
|
|
||||||
two_dots_2 = "#56b4e9",
|
|
||||||
two_dots_flashy_1 = "gold1",
|
|
||||||
two_dots_flashy_2 = "blue2",
|
|
||||||
three_dots_1 = "aquamarine2",
|
|
||||||
three_dots_2 = "cornflowerblue",
|
|
||||||
three_dots_3 = "brown1",
|
|
||||||
orpink = "#f8aa9b",
|
|
||||||
pink = "#f5a6a7",
|
|
||||||
lt_pink = "#F9C6C7",
|
|
||||||
hot_pink = "#ef6d6f",
|
|
||||||
mddk_red = "#bf4749",
|
|
||||||
dk_red = "#782c2e",
|
|
||||||
orange = "#F69E61",
|
|
||||||
lt_green = "#B0CFAC",
|
|
||||||
green = "#84A181",
|
|
||||||
dk_green = "#526450",
|
|
||||||
red_less_4_1 = "#f6e3e3",
|
|
||||||
red_less_4_2 = "#f3b5b6",
|
|
||||||
red_less_4_3 = "#ee5a59",
|
|
||||||
red_less_4_4 = "#9d393c",
|
|
||||||
red_5_1 = "#f6e3e3",
|
|
||||||
red_5_2 = "#f3b5b6",
|
|
||||||
red_5_3 = "#ee5a59",
|
|
||||||
red_5_4 = "#c0474a",
|
|
||||||
red_5_5 = "#792a2e",
|
|
||||||
red_less_7_1 = "#f8f4f4",
|
|
||||||
red_less_7_2 = "#f8d6d6",
|
|
||||||
red_less_7_3 = "#f49695",
|
|
||||||
red_less_7_4 = "#ee5a59",
|
|
||||||
red_less_7_5 = "#c0474a",
|
|
||||||
red_less_7_6 = "#792a2e",
|
|
||||||
red_less_7_7 = "#471119",
|
|
||||||
green_2_1 = "#cce5c9",
|
|
||||||
green_2_2 = "#55a065",
|
|
||||||
green_3_1 = "#e6f2e0",
|
|
||||||
green_3_2 = "#7ebf85",
|
|
||||||
green_3_3 = "#2d8246",
|
|
||||||
green_4_1 = "#e6f2e1",
|
|
||||||
green_4_2 = "#b0d3ab",
|
|
||||||
green_4_3 = "#4bab5e",
|
|
||||||
green_4_4 = "#0c592e",
|
|
||||||
green_5_1 = "#e6f2e1",
|
|
||||||
green_5_2 = "#b0d3ab",
|
|
||||||
green_5_3 = "#6bb26a",
|
|
||||||
green_5_4 = "#229346",
|
|
||||||
green_5_5 = "#0c592e",
|
|
||||||
green_6_1 = "#e6f2e0",
|
|
||||||
green_6_2 = "#b0d3ab",
|
|
||||||
green_6_3 = "#75c376",
|
|
||||||
green_6_4 = "#086d38",
|
|
||||||
green_6_5 = "#0c592e",
|
|
||||||
green_6_6 = "#0d4420",
|
|
||||||
green_7_1 = "#fafafa",
|
|
||||||
green_7_2 = "#e6f2e0",
|
|
||||||
green_7_3 = "#b0d3ab",
|
|
||||||
green_7_4 = "#75c376",
|
|
||||||
green_7_5 = "#40ab5d",
|
|
||||||
green_7_6 = "#086d38",
|
|
||||||
green_7_7 = "#0d4420",
|
|
||||||
artichoke_2_1 = "#b6c8b1",
|
|
||||||
artichoke_2_2 = "#53755f",
|
|
||||||
artichoke_3_1 = "#e4f1db",
|
|
||||||
artichoke_3_2 = "#89a087",
|
|
||||||
artichoke_3_3 = "#455843",
|
|
||||||
artichoke_4_1 = "#e4f1db",
|
|
||||||
artichoke_4_2 = "#b5ceb2",
|
|
||||||
artichoke_4_3 = "#89a087",
|
|
||||||
artichoke_4_4 = "#465944",
|
|
||||||
artichoke_5_1 = "#e4f1db",
|
|
||||||
artichoke_5_2 = "#b5ceb2",
|
|
||||||
artichoke_5_3 = "#89a087",
|
|
||||||
artichoke_5_4 = "#60755f",
|
|
||||||
artichoke_5_5 = "#465944",
|
|
||||||
artichoke_6_1 = "#fafafa",
|
|
||||||
artichoke_6_2 = "#e4f1db",
|
|
||||||
artichoke_6_3 = "#b5ceb2",
|
|
||||||
artichoke_6_4 = "#89a087",
|
|
||||||
artichoke_6_5 = "#60755f",
|
|
||||||
artichoke_6_6 = "#455843",
|
|
||||||
artichoke_7_1 = "#fafafa",
|
|
||||||
artichoke_7_2 = "#e4f1db",
|
|
||||||
artichoke_7_3 = "#b5ceb2",
|
|
||||||
artichoke_7_4 = "#9fb89c",
|
|
||||||
artichoke_7_5 = "#89a087",
|
|
||||||
artichoke_7_6 = "#60755f",
|
|
||||||
artichoke_7_7 = "#455843",
|
|
||||||
blue_2_1 = "#7cb6c4",
|
|
||||||
blue_2_2 = "#286877 ",
|
|
||||||
blue_3_1 = "#b9d7de",
|
|
||||||
blue_3_2 = "#5ca4b4",
|
|
||||||
blue_3_3 = "#286877",
|
|
||||||
blue_4_1 = "#dfecef",
|
|
||||||
blue_4_2 = "#8fc1cc",
|
|
||||||
blue_4_3 = "#3f96aa",
|
|
||||||
blue_4_4 = "#286877",
|
|
||||||
blue_5_1 = "#dfecef",
|
|
||||||
blue_5_2 = "#8fc1cc",
|
|
||||||
blue_5_3 = "#3f96aa",
|
|
||||||
blue_5_4 = "#256a7a",
|
|
||||||
blue_5_5 = "#0c3842",
|
|
||||||
blue_6_1 = "#f4fbfe",
|
|
||||||
blue_6_2 = "#cfe4e9",
|
|
||||||
blue_6_3 = "#77b2bf",
|
|
||||||
blue_6_4 = "#4096aa",
|
|
||||||
blue_6_5 = "#256a7a",
|
|
||||||
blue_6_6 = "#0c3842",
|
|
||||||
blue_7_1 = "#f4fbfe",
|
|
||||||
blue_7_2 = "#b3d5de",
|
|
||||||
blue_7_3 = "#77b2bf",
|
|
||||||
blue_7_4 = "#4096aa",
|
|
||||||
blue_7_5 = "#27768a",
|
|
||||||
blue_7_6 = "#0c596b",
|
|
||||||
blue_7_7 = "#0c3842"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (is.null(cols)) {
|
|
||||||
cols_to_return <- colors_reach
|
|
||||||
} else {
|
|
||||||
cols_to_return <- colors_reach[cols]
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unnamed) {
|
|
||||||
cols_to_return <- unname(cols_to_return)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(cols_to_return)
|
|
||||||
}
|
|
||||||
93
R/data.R
|
|
@ -1,93 +0,0 @@
|
||||||
#' Haïti admin 1 centroids shapefile.
|
|
||||||
#'
|
|
||||||
#' A multipoint shapefile of Haiti's admin 1.
|
|
||||||
#'
|
|
||||||
#' @format A sf multipoint object with 10 features and 9 fields:
|
|
||||||
#' \describe{
|
|
||||||
#' \item{ADM1_PC}{Admin 1 postal code.}
|
|
||||||
#' \item{ADM1_EN}{Full name in English.}
|
|
||||||
#' \item{ADM1_FR}{Full name in French.}
|
|
||||||
#' \item{ADM1_HT}{Full name in Haitian Creole.}
|
|
||||||
#' \item{ADM0_EN}{Country name in English.}
|
|
||||||
#' \item{ADM0_FR}{Country name in French.}
|
|
||||||
#' \item{ADM0_HT}{Country name in Haitian Creole.}
|
|
||||||
#' \item{ADM0_PC}{Country postal code.}
|
|
||||||
#' \item{ADM1_FR_UPPER}{Admin 1 French name - uppercase.}
|
|
||||||
#' \item{geometry}{Multipoint geometry.}
|
|
||||||
#' }
|
|
||||||
"centroid_admin1"
|
|
||||||
|
|
||||||
|
|
||||||
#' Indicator admin 1 polygons shapefile.
|
|
||||||
#'
|
|
||||||
#' A multipolygon shapefile of Haiti's admin 1 with an indicator column 'opn_dfc'.
|
|
||||||
#'
|
|
||||||
#' @format A sf multipoint object with 10 features and 10 fields:
|
|
||||||
#' \describe{
|
|
||||||
#' \item{ADM1_PC}{Admin 1 postal code.}
|
|
||||||
#' \item{admin1}{Admin 1 unique id.}
|
|
||||||
#' \item{opn_dfc}{Proportion of HHs that reported open defecation as sanitation facility.}
|
|
||||||
#' \item{ADM1_EN}{Full name in English.}
|
|
||||||
#' \item{ADM1_FR}{Full name in French.}
|
|
||||||
#' \item{ADM1_HT}{Full name in Haitian Creole.}
|
|
||||||
#' \item{ADM0_EN}{Country name in English.}
|
|
||||||
#' \item{ADM0_FR}{Country name in French.}
|
|
||||||
#' \item{ADM0_HT}{Country name in Haitian Creole.}
|
|
||||||
#' \item{ADM0_PC}{Country postal code.}
|
|
||||||
#' \item{geometry}{Multipolygon geometry.}
|
|
||||||
#' }
|
|
||||||
"indicator_admin1"
|
|
||||||
|
|
||||||
|
|
||||||
#' Haïti admin 1 lines shapefile.
|
|
||||||
#'
|
|
||||||
#' A multiline shapefile of Haiti's admin 1.
|
|
||||||
#'
|
|
||||||
#' @format A sf multiline object with 10 features and 8 fields:
|
|
||||||
#' \describe{
|
|
||||||
#' \item{ADM1_EN}{Full name in English.}
|
|
||||||
#' \item{ADM1_FR}{Full name in French.}
|
|
||||||
#' \item{ADM1_HT}{Full name in Haitian Creole.}
|
|
||||||
#' \item{ADM0_EN}{Country name in English.}
|
|
||||||
#' \item{ADM0_FR}{Country name in French.}
|
|
||||||
#' \item{ADM0_HT}{Country name in Haitian Creole.}
|
|
||||||
#' \item{ADM0_PCODE}{Country postal code.}
|
|
||||||
#' \item{geometry}{Multiline geometry.}
|
|
||||||
#' }
|
|
||||||
"line_admin1"
|
|
||||||
|
|
||||||
|
|
||||||
#' Haïti border.
|
|
||||||
#'
|
|
||||||
#' A multiline shapefile of Haiti's border.
|
|
||||||
#'
|
|
||||||
#' @format A sf multiline objet with 1 feature and 6 fields:
|
|
||||||
#' \describe{
|
|
||||||
#' \item{fid_1}{fid_1}
|
|
||||||
#' \item{uno}{uno}
|
|
||||||
#' \item{count}{count}
|
|
||||||
#' \item{x_coord}{x_coord}
|
|
||||||
#' \item{y_coord}{y_coord}
|
|
||||||
#' \item{area}{area}
|
|
||||||
#' \item{geometry}{Multiline geometry.}
|
|
||||||
#' }
|
|
||||||
"border_admin0"
|
|
||||||
|
|
||||||
|
|
||||||
#' Haïti frontier with Dominican Republic.
|
|
||||||
#'
|
|
||||||
#' A multiline shapefile of Haiti's frontier with Dominican Republic.
|
|
||||||
#'
|
|
||||||
#' @format A sf multipoint objet with 4 features and 8 fields:
|
|
||||||
#' \describe{
|
|
||||||
#' \item{fid_1}{fid_1}
|
|
||||||
#' \item{objectid}{objectid}
|
|
||||||
#' \item{id}{id}
|
|
||||||
#' \item{fromnode}{fromnode}
|
|
||||||
#' \item{tonode}{tonode}
|
|
||||||
#' \item{leftpolygo}{leftpolygo}
|
|
||||||
#' \item{rightpolygo}{rightpolygo}
|
|
||||||
#' \item{shape_leng}{shape_leng}
|
|
||||||
#' \item{geometry}{Multiline geometry.}
|
|
||||||
#' }
|
|
||||||
"frontier_admin0"
|
|
||||||
107
R/donut.R
|
|
@ -1,107 +0,0 @@
|
||||||
#' @title Simple donut chart (to be used parsimoniously), can be a pie chart
|
|
||||||
#'
|
|
||||||
#' @param df A data frame.
|
|
||||||
#' @param x A character column or coercible as a character column. Will give the donut's fill color.
|
|
||||||
#' @param y A numeric column.
|
|
||||||
#' @param alpha Fill transparency.
|
|
||||||
#' @param x_title The x scale title. Default to NULL.
|
|
||||||
#' @param title Plot title. Default to NULL.
|
|
||||||
#' @param subtitle Plot subtitle. Default to NULL.
|
|
||||||
#' @param caption Plot caption. Default to NULL.
|
|
||||||
#' @param arrange TRUE or FALSE. Arrange by highest percentage first.
|
|
||||||
#' @param hole_size Hole size. Default to 3. If less than 2, back to a pie chart.
|
|
||||||
#' @param add_text TRUE or FALSE. Add the value as text.
|
|
||||||
#' @param add_text_treshold_display Minimum value to add the text label.
|
|
||||||
#' @param add_text_color Text color.
|
|
||||||
#' @param add_text_suffix If percent is FALSE, should we add a suffix to the text label?
|
|
||||||
#' @param theme Whatever theme. Default to theme_reach().
|
|
||||||
#'
|
|
||||||
#' @return A donut chart to be used parsimoniously
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
donut <- function(df,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
alpha = 1,
|
|
||||||
x_title = NULL,
|
|
||||||
title = NULL,
|
|
||||||
subtitle = NULL,
|
|
||||||
caption = NULL,
|
|
||||||
arrange = TRUE,
|
|
||||||
hole_size = 3,
|
|
||||||
add_text = TRUE,
|
|
||||||
add_text_treshold_display = 5, add_text_color = "white", add_text_suffix = "", theme = theme_reach(legend_reverse = TRUE)){
|
|
||||||
|
|
||||||
# Arrange by biggest prop first ?
|
|
||||||
if (arrange) df <- dplyr::arrange(
|
|
||||||
df,
|
|
||||||
{{ y }}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Get levels for scaling
|
|
||||||
lev <- dplyr::pull(df, {{ x }})
|
|
||||||
df <- dplyr::mutate(df, "{{x}}" := factor({{ x }}, levels = lev))
|
|
||||||
|
|
||||||
# Mapping
|
|
||||||
g <- ggplot2::ggplot(
|
|
||||||
df,
|
|
||||||
mapping = ggplot2::aes(
|
|
||||||
x = hole_size,
|
|
||||||
y = {{ y }},
|
|
||||||
fill = {{ x }},
|
|
||||||
color = {{ x }}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add rect
|
|
||||||
g <- g + ggplot2::geom_col(alpha = alpha)
|
|
||||||
|
|
||||||
|
|
||||||
# Add text labels
|
|
||||||
if (add_text) {
|
|
||||||
|
|
||||||
df <- dplyr::mutate(df, y_treshold = ifelse({{ y }} >= add_text_treshold_display, {{ y }}, NA ))
|
|
||||||
|
|
||||||
g <- g +
|
|
||||||
ggplot2::geom_text(
|
|
||||||
data = df,
|
|
||||||
ggplot2::aes(
|
|
||||||
x = hole_size,
|
|
||||||
y = !!rlang::sym("y_treshold"),
|
|
||||||
label = paste0({{ y }}, add_text_suffix)),
|
|
||||||
color = add_text_color,
|
|
||||||
position = ggplot2::position_stack(vjust = 0.5))
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add title, subtitle, caption, x_title, y_title
|
|
||||||
g <- g + ggplot2::labs(
|
|
||||||
title = title,
|
|
||||||
subtitle = subtitle,
|
|
||||||
caption = caption,
|
|
||||||
fill = x_title,
|
|
||||||
color = x_title
|
|
||||||
)
|
|
||||||
|
|
||||||
# Transform to polar coordinates and adjust hole
|
|
||||||
g <- g +
|
|
||||||
ggplot2::coord_polar(
|
|
||||||
theta = "y"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (hole_size >= 2) g <- g + ggplot2::xlim(c(1, hole_size + 0.5)) # Try to remove that to see how to make a pie chart
|
|
||||||
|
|
||||||
# Add theme
|
|
||||||
g <- g + theme
|
|
||||||
|
|
||||||
# No axis
|
|
||||||
g <- g + ggplot2::theme(
|
|
||||||
axis.text = ggplot2::element_blank(),
|
|
||||||
axis.line = ggplot2::element_blank(),
|
|
||||||
axis.ticks = ggplot2::element_blank(),
|
|
||||||
axis.title = ggplot2::element_blank()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
return(g)
|
|
||||||
|
|
||||||
}
|
|
||||||
136
R/dumbbell.R
|
|
@ -22,77 +22,122 @@
|
||||||
#' @param add_text_vjust Vertical adjustment.
|
#' @param add_text_vjust Vertical adjustment.
|
||||||
#' @param add_text_size Text size.
|
#' @param add_text_size Text size.
|
||||||
#' @param add_text_color Text color.
|
#' @param add_text_color Text color.
|
||||||
#' @param theme A ggplot2 theme, default to `theme_reach()`
|
#' @param theme_fun A ggplot2 theme, default to `theme_dumbbell()`
|
||||||
|
#' @param scale_fill_fun A ggplot2 scale_fill function, default to `scale_fill_visualizer_discrete()`
|
||||||
|
#' @param scale_color_fun A ggplot2 scale_color function, default to `scale_color_visualizer_discrete()`
|
||||||
#'
|
#'
|
||||||
#' @return A dumbbell chart.
|
#' @return A dumbbell chart.
|
||||||
#' @export
|
#' @export
|
||||||
#'
|
#'
|
||||||
dumbbell <- function(df,
|
dumbbell <- function(
|
||||||
|
df,
|
||||||
col,
|
col,
|
||||||
group_x,
|
group_x,
|
||||||
group_y,
|
group_y,
|
||||||
point_size = 5,
|
point_size = 5,
|
||||||
point_alpha = 1,
|
point_alpha = 1,
|
||||||
segment_size = 2.5,
|
segment_size = 2.5,
|
||||||
segment_color = cols_reach("main_lt_grey"),
|
segment_color = color("light_blue_grey"),
|
||||||
group_x_title = NULL,
|
group_x_title = NULL,
|
||||||
group_y_title = NULL,
|
group_y_title = NULL,
|
||||||
x_title = NULL,
|
x_title = NULL,
|
||||||
title = NULL,
|
title = NULL,
|
||||||
subtitle = NULL,
|
subtitle = NULL,
|
||||||
caption = NULL,
|
caption = NULL,
|
||||||
line_to_y_axis = TRUE,
|
line_to_y_axis = FALSE,
|
||||||
line_to_y_axis_type = 3,
|
line_to_y_axis_type = 3,
|
||||||
line_to_y_axis_width = 0.5,
|
line_to_y_axis_width = 0.5,
|
||||||
line_to_y_axis_color = cols_reach("main_grey"),
|
line_to_y_axis_color = color("dark_grey"),
|
||||||
add_text = TRUE,
|
add_text = FALSE,
|
||||||
add_text_vjust = 2,
|
add_text_vjust = 2,
|
||||||
add_text_size = 3.5,
|
add_text_size = 3.5,
|
||||||
add_text_color = cols_reach("main_grey"),
|
add_text_color = color("dark_grey"),
|
||||||
theme = theme_reach(palette = "primary")){
|
theme_fun = theme_dumbbell(),
|
||||||
|
scale_fill_fun = scale_fill_visualizer_discrete(),
|
||||||
|
scale_color_fun = scale_color_visualizer_discrete()
|
||||||
|
) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
# df is a data frame
|
||||||
|
checkmate::assert_data_frame(df)
|
||||||
|
|
||||||
|
# col, group_x, group_y are character
|
||||||
|
checkmate::assert_character(col, len = 1)
|
||||||
|
checkmate::assert_character(group_x, len = 1)
|
||||||
|
checkmate::assert_character(group_y, len = 1)
|
||||||
|
|
||||||
|
# col, group_x, group_y are columns in df
|
||||||
|
checkmate::assert_choice(col, colnames(df))
|
||||||
|
checkmate::assert_choice(group_x, colnames(df))
|
||||||
|
checkmate::assert_choice(group_y, colnames(df))
|
||||||
|
|
||||||
|
# Check numeric/logical values
|
||||||
|
checkmate::assert_numeric(point_size, len = 1)
|
||||||
|
checkmate::assert_numeric(point_alpha, lower = 0, upper = 1, len = 1)
|
||||||
|
checkmate::assert_numeric(segment_size, len = 1)
|
||||||
|
checkmate::assert_logical(line_to_y_axis, len = 1)
|
||||||
|
checkmate::assert_numeric(line_to_y_axis_type, len = 1)
|
||||||
|
checkmate::assert_numeric(line_to_y_axis_width, len = 1)
|
||||||
|
checkmate::assert_logical(add_text, len = 1)
|
||||||
|
checkmate::assert_numeric(add_text_vjust, len = 1)
|
||||||
|
checkmate::assert_numeric(add_text_size, len = 1)
|
||||||
|
|
||||||
# Get group keys
|
# Get group keys
|
||||||
group_x_keys <- df |>
|
group_x_keys <- df |>
|
||||||
dplyr::group_by({{ group_x }}) |>
|
dplyr::group_by(!!rlang::sym(group_x)) |>
|
||||||
dplyr::group_keys() |>
|
dplyr::group_keys() |>
|
||||||
dplyr::pull()
|
dplyr::pull()
|
||||||
|
|
||||||
# Check if only two groups
|
# Check if only two groups
|
||||||
if (length(group_x_keys) > 2) rlang::abort("Cannot draw a dumbbell plot for `group_x` with more than 2 groups")
|
if (length(group_x_keys) > 2) {
|
||||||
|
rlang::abort(
|
||||||
|
"Cannot draw a dumbbell plot for `group_x` with more than 2 groups"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
# Pivot long data
|
# Pivot long data
|
||||||
df_pivot <- df |>
|
df_pivot <- df |>
|
||||||
tidyr::pivot_wider(
|
tidyr::pivot_wider(
|
||||||
id_cols = c({{ group_y}}),
|
id_cols = c(!!rlang::sym(group_y)),
|
||||||
values_from = {{ col }},
|
values_from = !!rlang::sym(col),
|
||||||
names_from = {{ group_x }}
|
names_from = !!rlang::sym(group_x)
|
||||||
)
|
)
|
||||||
|
|
||||||
df_pivot <- df_pivot |>
|
df_pivot <- df_pivot |>
|
||||||
dplyr::rowwise() |>
|
dplyr::rowwise() |>
|
||||||
dplyr::mutate(
|
dplyr::mutate(
|
||||||
min = min(!!rlang::sym(group_x_keys[[1]]), !!rlang::sym(group_x_keys[[2]]), na.rm = T),
|
min = min(
|
||||||
max = max(!!rlang::sym(group_x_keys[[1]]), !!rlang::sym(group_x_keys[[2]]), na.rm = T)) |>
|
!!rlang::sym(group_x_keys[[1]]),
|
||||||
|
!!rlang::sym(group_x_keys[[2]]),
|
||||||
|
na.rm = T
|
||||||
|
),
|
||||||
|
max = max(
|
||||||
|
!!rlang::sym(group_x_keys[[1]]),
|
||||||
|
!!rlang::sym(group_x_keys[[2]]),
|
||||||
|
na.rm = T
|
||||||
|
)
|
||||||
|
) |>
|
||||||
dplyr::ungroup() |>
|
dplyr::ungroup() |>
|
||||||
dplyr::mutate(diff = max - min)
|
dplyr::mutate(diff = max - min)
|
||||||
|
|
||||||
g <- ggplot2::ggplot(df_pivot)
|
g <- ggplot2::ggplot(df_pivot)
|
||||||
|
|
||||||
# Add line
|
# Add line
|
||||||
if(line_to_y_axis) {
|
if (line_to_y_axis) {
|
||||||
|
xend <- min(dplyr::pull(df, !!rlang::sym(col)))
|
||||||
xend <- min(dplyr::pull(df, {{ col }}))
|
|
||||||
|
|
||||||
g <- g +
|
g <- g +
|
||||||
ggplot2::geom_segment(
|
ggplot2::geom_segment(
|
||||||
ggplot2::aes(
|
ggplot2::aes(
|
||||||
x = min,
|
x = min,
|
||||||
y = {{ group_y }},
|
y = !!rlang::sym(group_y),
|
||||||
yend = {{ group_y }}),
|
yend = !!rlang::sym(group_y)
|
||||||
|
),
|
||||||
xend = xend,
|
xend = xend,
|
||||||
linetype = line_to_y_axis_type,
|
linetype = line_to_y_axis_type,
|
||||||
size = line_to_y_axis_width,
|
linewidth = line_to_y_axis_width,
|
||||||
color = line_to_y_axis_color)
|
color = line_to_y_axis_color
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add segment
|
# Add segment
|
||||||
|
|
@ -100,10 +145,11 @@ dumbbell <- function(df,
|
||||||
ggplot2::geom_segment(
|
ggplot2::geom_segment(
|
||||||
ggplot2::aes(
|
ggplot2::aes(
|
||||||
x = !!rlang::sym(group_x_keys[[1]]),
|
x = !!rlang::sym(group_x_keys[[1]]),
|
||||||
y = {{ group_y }},
|
y = !!rlang::sym(group_y),
|
||||||
xend = !!rlang::sym(group_x_keys[[2]]),
|
xend = !!rlang::sym(group_x_keys[[2]]),
|
||||||
yend = {{ group_y }}),
|
yend = !!rlang::sym(group_y)
|
||||||
size = segment_size,
|
),
|
||||||
|
linewidth = segment_size,
|
||||||
color = segment_color
|
color = segment_color
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -112,17 +158,18 @@ dumbbell <- function(df,
|
||||||
ggplot2::geom_point(
|
ggplot2::geom_point(
|
||||||
data = df,
|
data = df,
|
||||||
ggplot2::aes(
|
ggplot2::aes(
|
||||||
x = {{ col }},
|
x = !!rlang::sym(col),
|
||||||
y = {{ group_y }},
|
y = !!rlang::sym(group_y),
|
||||||
color = {{ group_x }},
|
color = !!rlang::sym(group_x),
|
||||||
fill = {{ group_x }}
|
fill = !!rlang::sym(group_x)
|
||||||
),
|
),
|
||||||
size = point_size,
|
size = point_size,
|
||||||
alpha = point_alpha
|
alpha = point_alpha
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add title, subtitle, caption, x_title, y_title
|
# Add title, subtitle, caption, x_title, y_title
|
||||||
g <- g + ggplot2::labs(
|
g <- g +
|
||||||
|
ggplot2::labs(
|
||||||
title = title,
|
title = title,
|
||||||
subtitle = subtitle,
|
subtitle = subtitle,
|
||||||
caption = caption,
|
caption = caption,
|
||||||
|
|
@ -133,29 +180,32 @@ dumbbell <- function(df,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add stat labels to points
|
# Add stat labels to points
|
||||||
if(add_text) g <- g +
|
if (add_text) {
|
||||||
|
g <- g +
|
||||||
ggrepel::geom_text_repel(
|
ggrepel::geom_text_repel(
|
||||||
data = df,
|
data = df,
|
||||||
ggplot2::aes(
|
ggplot2::aes(
|
||||||
x = {{ col }},
|
x = !!rlang::sym(col),
|
||||||
y = {{ group_y}},
|
y = !!rlang::sym(group_y),
|
||||||
label = {{ col }}
|
label = !!rlang::sym(col)
|
||||||
),
|
),
|
||||||
vjust = add_text_vjust,
|
vjust = add_text_vjust,
|
||||||
size = add_text_size,
|
size = add_text_size,
|
||||||
color = add_text_color
|
color = add_text_color
|
||||||
)
|
)
|
||||||
|
}
|
||||||
# Expan y axis
|
|
||||||
# g <- g +
|
|
||||||
# ggplot2::scale_y_discrete(
|
|
||||||
# group_y_title,
|
|
||||||
# expand = c(0, 0))
|
|
||||||
|
|
||||||
|
|
||||||
# Add theme
|
# Add theme
|
||||||
g <- g + theme
|
g <- g + theme_fun
|
||||||
|
|
||||||
|
# Add scale fun
|
||||||
|
if (!is.null(scale_fill_fun)) {
|
||||||
|
g <- g + scale_fill_fun
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is.null(scale_color_fun)) {
|
||||||
|
g <- g + scale_color_fun
|
||||||
|
}
|
||||||
|
|
||||||
return(g)
|
return(g)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
100
R/internals.R
|
|
@ -1,95 +1,15 @@
|
||||||
#' @title Abord bad argument
|
# not in
|
||||||
#'
|
`%notin%` <- function(a, b) {
|
||||||
#' @param arg An argument
|
!(a %in% b)
|
||||||
#' @param must What arg must be
|
|
||||||
#' @param not Optional. What arg must not be.
|
|
||||||
#'
|
|
||||||
#' @return A stop statement
|
|
||||||
abort_bad_argument <- function(arg, must, not = NULL) {
|
|
||||||
msg <- glue::glue("`{arg}` must {must}")
|
|
||||||
if (!is.null(not)) {
|
|
||||||
not <- typeof(not)
|
|
||||||
msg <- glue::glue("{msg}; not {not}.")
|
|
||||||
}
|
|
||||||
|
|
||||||
rlang::abort("error_bad_argument",
|
|
||||||
message = msg,
|
|
||||||
arg = arg,
|
|
||||||
must = must,
|
|
||||||
not = not
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# not all in
|
||||||
|
`%notallin%` <- function(a, b) {
|
||||||
#' @title Stop statement "If not in colnames" with colnames
|
!(all(a %in% b))
|
||||||
#'
|
|
||||||
#' @param .tbl A tibble
|
|
||||||
#' @param cols A vector of column names (quoted)
|
|
||||||
#' @param df Provide the tibble name as a character string
|
|
||||||
#' @param arg Default to NULL.
|
|
||||||
#'
|
|
||||||
#' @return A stop statement
|
|
||||||
if_not_in_stop <- function(.tbl, cols, df, arg = NULL){
|
|
||||||
if (is.null(arg)) {
|
|
||||||
msg <- glue::glue("The following column/s is/are missing in `{df}`:")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msg <- glue::glue("The following column/s from `{arg}` is/are missing in `{df}`:")
|
|
||||||
}
|
|
||||||
if (!all(cols %in% colnames(.tbl))) {
|
|
||||||
rlang::abort(
|
|
||||||
c("Missing columns",
|
|
||||||
"*" =
|
|
||||||
paste(
|
|
||||||
msg,
|
|
||||||
paste(
|
|
||||||
subvec_not_in(cols, colnames(.tbl)),
|
|
||||||
collapse = ", ")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# infix for null replacement
|
||||||
|
#' @importFrom rlang `%||%`
|
||||||
#' @title Stop statement "If not in vector"
|
`%ifnullrep%` <- function(a, b) {
|
||||||
#'
|
a %||% b
|
||||||
#' @param vec A vector of character strings
|
|
||||||
#' @param cols A set of character strings
|
|
||||||
#' @param vec_name Provide the vector name as a character string
|
|
||||||
#' @param arg Default to NULL.
|
|
||||||
#'
|
|
||||||
#' @return A stop statement if some elements of vec are not in cols
|
|
||||||
if_vec_not_in_stop <- function(vec, cols, vec_name, arg = NULL){
|
|
||||||
if (is.null(arg)) {
|
|
||||||
msg <- glue::glue("The following element/s is/are missing in `{vec_name}`:")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msg <- glue::glue("The following element/s from `{arg}` is/are missing in `{vec_name}`:")
|
|
||||||
}
|
|
||||||
if (!all(cols %in% vec)) {
|
|
||||||
rlang::abort(
|
|
||||||
c("Missing elements",
|
|
||||||
"*" =
|
|
||||||
paste(
|
|
||||||
msg,
|
|
||||||
paste(
|
|
||||||
subvec_not_in(cols, vec),
|
|
||||||
collapse = ", ")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#' @title Subvec not in
|
|
||||||
#'
|
|
||||||
#' @param vector A vector to subset
|
|
||||||
#' @param set A set-vector
|
|
||||||
#'
|
|
||||||
#' @return A subset of vector not in set
|
|
||||||
subvec_not_in <- function(vector, set){
|
|
||||||
vector[!(vector %in% set)]
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
359
R/lollipop.R
|
|
@ -1,121 +1,326 @@
|
||||||
#' @title Simple bar chart
|
#' @rdname lollipop
|
||||||
|
#'
|
||||||
|
#' @inheritParams lollipop
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
hlollipop <- function(
|
||||||
|
...,
|
||||||
|
flip = TRUE,
|
||||||
|
theme_fun = theme_lollipop(flip = flip)) {
|
||||||
|
lollipop(flip = flip, theme_fun = theme_fun, ...)
|
||||||
|
}
|
||||||
|
|
||||||
|
#' Simple lollipop chart
|
||||||
|
#'
|
||||||
|
#' `lollipop()` is a simple lollipop chart (dots connected to the baseline by a segment) with some customization allowed.
|
||||||
|
#' `hlollipop()` uses `lollipop()` with sane defaults for a horizontal lollipop chart.
|
||||||
#'
|
#'
|
||||||
#' @param df A data frame.
|
#' @param df A data frame.
|
||||||
#' @param x A numeric column.
|
#' @param x A quoted character column or coercible as a character column.
|
||||||
#' @param y A character column or coercible as a character column.
|
#' @param y A quoted numeric column.
|
||||||
#' @param flip TRUE or FALSE. Default to TRUE or horizontal lollipop plot.
|
#' @param group Some quoted grouping categorical column, e.g. administrative areas or population groups.
|
||||||
|
#' @param facet Some quoted grouping categorical column, e.g. administrative areas or population groups.
|
||||||
|
#' @param x_rm_na Remove NAs in x?
|
||||||
|
#' @param y_rm_na Remove NAs in y?
|
||||||
|
#' @param group_rm_na Remove NAs in group?
|
||||||
|
#' @param facet_rm_na Remove NAs in facet?
|
||||||
|
#' @param y_expand Multiplier to expand the y axis.
|
||||||
|
#' @param add_color Add a color to dots (if no grouping).
|
||||||
|
#' @param add_color_guide Should a legend be added?
|
||||||
|
#' @param flip TRUE or FALSE (default). Default to TRUE or horizontal lollipop plot.
|
||||||
#' @param wrap Should x-labels be wrapped? Number of characters.
|
#' @param wrap Should x-labels be wrapped? Number of characters.
|
||||||
#' @param arrange TRUE or FALSE. Arrange by highest percentage first.
|
#' @param alpha Fill transparency for dots.
|
||||||
#' @param point_size Point size.
|
|
||||||
#' @param point_color Point color.
|
|
||||||
#' @param point_alpha Point alpha.
|
|
||||||
#' @param segment_size Segment size.
|
|
||||||
#' @param segment_color Segment color.
|
|
||||||
#' @param segment_alpha Segment alpha.
|
|
||||||
#' @param alpha Fill transparency.
|
|
||||||
#' @param x_title The x scale title. Default to NULL.
|
#' @param x_title The x scale title. Default to NULL.
|
||||||
#' @param y_title The y scale title. Default to NULL.
|
#' @param y_title The y scale title. Default to NULL.
|
||||||
|
#' @param group_title The group legend title. Default to NULL.
|
||||||
#' @param title Plot title. Default to NULL.
|
#' @param title Plot title. Default to NULL.
|
||||||
#' @param subtitle Plot subtitle. Default to NULL.
|
#' @param subtitle Plot subtitle. Default to NULL.
|
||||||
#' @param caption Plot caption. Default to NULL.
|
#' @param caption Plot caption. Default to NULL.
|
||||||
#' @param add_text TRUE or FALSE. Add the y value as text within the bubble.
|
#' @param dot_size The size of the dots.
|
||||||
#' @param add_text_size Text size.
|
#' @param line_size The size/width of the line connecting dots to the baseline.
|
||||||
#' @param add_text_suffix If percent is FALSE, should we add a suffix to the text label?
|
#' @param line_color The color of the line connecting dots to the baseline.
|
||||||
#' @param add_text_color Added text color. Default to white.
|
#' @param dodge_width Width for position dodge when using groups (controls space between grouped lollipops).
|
||||||
#' @param add_text_fontface Added text font face. Default to "bold".
|
#' @param theme_fun Whatever theme function. For no custom theme, use theme_fun = NULL.
|
||||||
#' @param theme Whatever theme. Default to theme_reach().
|
#' @param scale_fill_fun Scale fill function.
|
||||||
|
#' @param scale_color_fun Scale color function.
|
||||||
#'
|
#'
|
||||||
#' @return A bar chart
|
#' @inheritParams reorder_by
|
||||||
|
#'
|
||||||
|
#' @importFrom rlang `:=`
|
||||||
#'
|
#'
|
||||||
#' @export
|
#' @export
|
||||||
lollipop <- function(df,
|
lollipop <- function(
|
||||||
|
df,
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
flip = TRUE,
|
group = "",
|
||||||
|
facet = "",
|
||||||
|
order = "y",
|
||||||
|
x_rm_na = TRUE,
|
||||||
|
y_rm_na = TRUE,
|
||||||
|
group_rm_na = TRUE,
|
||||||
|
facet_rm_na = TRUE,
|
||||||
|
y_expand = 0.1,
|
||||||
|
add_color = color("cat_5_main_1"),
|
||||||
|
add_color_guide = TRUE,
|
||||||
|
flip = FALSE,
|
||||||
wrap = NULL,
|
wrap = NULL,
|
||||||
arrange = TRUE,
|
|
||||||
point_size = 3,
|
|
||||||
point_color = cols_reach("main_red"),
|
|
||||||
point_alpha = 1,
|
|
||||||
segment_size = 1,
|
|
||||||
segment_color = cols_reach("main_grey"),
|
|
||||||
segment_alpha = 1,
|
|
||||||
alpha = 1,
|
alpha = 1,
|
||||||
x_title = NULL,
|
x_title = NULL,
|
||||||
y_title = NULL,
|
y_title = NULL,
|
||||||
|
group_title = NULL,
|
||||||
title = NULL,
|
title = NULL,
|
||||||
subtitle = NULL,
|
subtitle = NULL,
|
||||||
caption = NULL,
|
caption = NULL,
|
||||||
add_text = FALSE,
|
dot_size = 4,
|
||||||
add_text_size = 3,
|
line_size = 0.8,
|
||||||
add_text_suffix = "",
|
line_color = color("dark_grey"),
|
||||||
add_text_color = "white",
|
dodge_width = 0.9,
|
||||||
add_text_fontface = "bold",
|
theme_fun = theme_lollipop(
|
||||||
theme = theme_reach()){
|
flip = flip,
|
||||||
|
axis_text_x_angle = 0,
|
||||||
|
axis_text_x_vjust = 0.5,
|
||||||
|
axis_text_x_hjust = 0.5
|
||||||
|
),
|
||||||
|
scale_fill_fun = scale_fill_visualizer_discrete(),
|
||||||
|
scale_color_fun = scale_color_visualizer_discrete()) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
# df is a data frame
|
||||||
|
checkmate::assert_data_frame(df)
|
||||||
|
|
||||||
# Arrange by biggest prop first ?
|
# x and y and group are character
|
||||||
if (arrange) df <- dplyr::arrange(
|
checkmate::assert_character(x, len = 1)
|
||||||
df,
|
checkmate::assert_character(y, len = 1)
|
||||||
{{ y }}
|
checkmate::assert_character(group, len = 1)
|
||||||
|
checkmate::assert_character(facet, len = 1)
|
||||||
|
|
||||||
|
# x and y are columns in df
|
||||||
|
checkmate::assert_choice(x, colnames(df))
|
||||||
|
checkmate::assert_choice(y, colnames(df))
|
||||||
|
if (group != "") {
|
||||||
|
checkmate::assert_choice(group, colnames(df))
|
||||||
|
}
|
||||||
|
if (facet != "") {
|
||||||
|
checkmate::assert_choice(facet, colnames(df))
|
||||||
|
}
|
||||||
|
|
||||||
|
# x_rm_na, y_rm_na and group_rm_na are logical scalar
|
||||||
|
checkmate::assert_logical(x_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(y_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(group_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(facet_rm_na, len = 1)
|
||||||
|
|
||||||
|
# flip is a logical scalar
|
||||||
|
checkmate::assert_logical(flip, len = 1)
|
||||||
|
|
||||||
|
# dodge_width is a numeric scalar
|
||||||
|
checkmate::assert_numeric(dodge_width, len = 1, lower = 0)
|
||||||
|
|
||||||
|
# wrap is a numeric scalar or NULL
|
||||||
|
if (!is.null(wrap)) {
|
||||||
|
checkmate::assert_numeric(wrap, len = 1, null.ok = TRUE)
|
||||||
|
}
|
||||||
|
|
||||||
|
# alpha is a numeric scalar between 0 and 1
|
||||||
|
checkmate::assert_numeric(alpha, lower = 0, upper = 1, len = 1)
|
||||||
|
|
||||||
|
# dot_size is a numeric scalar
|
||||||
|
checkmate::assert_numeric(dot_size, len = 1)
|
||||||
|
|
||||||
|
# line_size is a numeric scalar
|
||||||
|
checkmate::assert_numeric(line_size, len = 1)
|
||||||
|
|
||||||
|
# order is a character scalar in valid choices
|
||||||
|
checkmate::assert_choice(order, c("none", "y", "grouped_y", "x", "grouped_x"))
|
||||||
|
|
||||||
|
# x and y are numeric or character
|
||||||
|
if (class(df[[y]]) %notin% c("integer", "numeric")) {
|
||||||
|
rlang::abort(paste0(y, " must be numeric."))
|
||||||
|
}
|
||||||
|
if (!any(class(df[[x]]) %in% c("character", "factor"))) {
|
||||||
|
rlang::abort(paste0(x, " must be character or factor"))
|
||||||
|
}
|
||||||
|
|
||||||
|
#----- Data wrangling
|
||||||
|
|
||||||
|
# facets over group
|
||||||
|
if (group != "" && facet != "" && group == facet) {
|
||||||
|
rlang::warn("'group' and 'facet' are the same identical.")
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove NAs using base R
|
||||||
|
if (x_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[x]])), ]
|
||||||
|
}
|
||||||
|
if (y_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[y]])), ]
|
||||||
|
}
|
||||||
|
if (group != "" && group_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[group]])), ]
|
||||||
|
}
|
||||||
|
if (facet != "" && facet_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[facet]])), ]
|
||||||
|
}
|
||||||
|
|
||||||
|
# reorder
|
||||||
|
dir_order <- if (flip && order %in% c("x", "grouped_x")) {
|
||||||
|
-1
|
||||||
|
} else if (!flip && order %in% c("x", "grouped_x")) {
|
||||||
|
1
|
||||||
|
} else if (flip) {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
group_order <- if (group != "" || (group == "" && facet == "")) {
|
||||||
|
group
|
||||||
|
} else if (group == "" && facet != "") {
|
||||||
|
facet
|
||||||
|
}
|
||||||
|
df <- reorder_by(
|
||||||
|
df = df,
|
||||||
|
x = x,
|
||||||
|
y = y,
|
||||||
|
group = group_order,
|
||||||
|
order = order,
|
||||||
|
dir_order = dir_order
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get levels for scaling
|
# prepare aes
|
||||||
lev <- dplyr::pull(df, {{ x }})
|
if (group != "") {
|
||||||
df <- dplyr::mutate(df, "{{x}}" := factor({{ x }}, levels = lev))
|
|
||||||
|
|
||||||
# Mapping
|
|
||||||
g <- ggplot2::ggplot(
|
g <- ggplot2::ggplot(
|
||||||
df,
|
df,
|
||||||
mapping = ggplot2::aes(x = {{ x }}, y = {{ y }}, xend = {{ x }}, yend = 0)
|
mapping = ggplot2::aes(
|
||||||
|
x = !!rlang::sym(x),
|
||||||
|
y = !!rlang::sym(y),
|
||||||
|
fill = !!rlang::sym(group),
|
||||||
|
color = !!rlang::sym(group)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
g <- ggplot2::ggplot(
|
||||||
|
df,
|
||||||
|
mapping = ggplot2::aes(
|
||||||
|
x = !!rlang::sym(x),
|
||||||
|
y = !!rlang::sym(y)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# add title, subtitle, caption, x_title, y_title
|
||||||
|
g <- g +
|
||||||
|
ggplot2::labs(
|
||||||
|
title = title,
|
||||||
|
subtitle = subtitle,
|
||||||
|
caption = caption,
|
||||||
|
x = y_title,
|
||||||
|
y = x_title,
|
||||||
|
color = group_title,
|
||||||
|
fill = group_title
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add segment
|
# facets
|
||||||
g <- g + ggplot2::geom_segment(
|
if (facet != "") {
|
||||||
linewidth = segment_size,
|
if (flip) {
|
||||||
alpha = segment_alpha,
|
g <- g +
|
||||||
color = segment_color
|
ggplot2::facet_grid(
|
||||||
|
rows = ggplot2::vars(!!rlang::sym(facet)),
|
||||||
|
scales = "free",
|
||||||
|
space = "free_y"
|
||||||
)
|
)
|
||||||
|
} else {
|
||||||
g <- g + ggplot2::geom_point(
|
g <- g +
|
||||||
size = point_size,
|
ggplot2::facet_grid(
|
||||||
alpha = point_alpha,
|
cols = ggplot2::vars(!!rlang::sym(facet)),
|
||||||
color = point_color
|
scales = "free",
|
||||||
|
space = "free_x"
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add segments and points
|
||||||
|
if (group != "") {
|
||||||
|
# With grouping - use position_dodge for side-by-side display
|
||||||
|
position_dodge_obj <- ggplot2::position_dodge(width = dodge_width)
|
||||||
|
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_linerange(
|
||||||
|
mapping = ggplot2::aes(
|
||||||
|
ymin = 0,
|
||||||
|
ymax = !!rlang::sym(y),
|
||||||
|
group = !!rlang::sym(group)
|
||||||
|
),
|
||||||
|
position = position_dodge_obj,
|
||||||
|
color = line_color,
|
||||||
|
linewidth = line_size
|
||||||
|
) +
|
||||||
|
ggplot2::geom_point(
|
||||||
|
position = position_dodge_obj,
|
||||||
|
size = dot_size,
|
||||||
|
alpha = alpha
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
# Without grouping
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_linerange(
|
||||||
|
mapping = ggplot2::aes(
|
||||||
|
ymin = 0,
|
||||||
|
ymax = !!rlang::sym(y)
|
||||||
|
),
|
||||||
|
color = line_color,
|
||||||
|
linewidth = line_size
|
||||||
|
) +
|
||||||
|
ggplot2::geom_point(
|
||||||
|
size = dot_size,
|
||||||
|
alpha = alpha,
|
||||||
|
color = add_color,
|
||||||
|
fill = add_color
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# wrap labels on the x scale?
|
||||||
if (!is.null(wrap)) {
|
if (!is.null(wrap)) {
|
||||||
g <- g + ggplot2::scale_x_discrete(labels = scales::label_wrap(wrap))
|
g <- g + ggplot2::scale_x_discrete(labels = scales::label_wrap(wrap))
|
||||||
}
|
}
|
||||||
|
|
||||||
# Because a text legend should always be horizontal, especially for an horizontal bar graph
|
# flip coordinates if needed
|
||||||
if (flip){
|
if (flip) {
|
||||||
g <- g + ggplot2::coord_flip()
|
g <- g + ggplot2::coord_flip()
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add text labels
|
# y scale tweaks
|
||||||
if (add_text) {
|
g <- g +
|
||||||
g <- g + ggplot2::geom_text(
|
ggplot2::scale_y_continuous(
|
||||||
ggplot2::aes(
|
# start at 0
|
||||||
label = paste0({{ y }}, add_text_suffix)),
|
expand = ggplot2::expansion(mult = c(0, y_expand)),
|
||||||
size = add_text_size,
|
# remove trailing 0 and choose accuracy of y labels
|
||||||
color = add_text_color,
|
labels = scales::label_number(
|
||||||
fontface = add_text_fontface)
|
accuracy = 0.1,
|
||||||
}
|
drop0trailing = TRUE,
|
||||||
|
big.mark = "",
|
||||||
# Add title, subtitle, caption, x_title, y_title
|
decimal.mark = "."
|
||||||
g <- g + ggplot2::labs(
|
),
|
||||||
title = title,
|
|
||||||
subtitle = subtitle,
|
|
||||||
caption = caption,
|
|
||||||
x = x_title,
|
|
||||||
y = y_title,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# remove guides for legend if !add_color_guide
|
||||||
|
if (!add_color_guide) {
|
||||||
|
g <- g + ggplot2::guides(fill = "none", color = "none")
|
||||||
|
}
|
||||||
|
|
||||||
# Add theme
|
# add theme fun
|
||||||
g <- g + theme
|
if (!is.null(theme_fun)) {
|
||||||
|
g <- g + theme_fun
|
||||||
|
}
|
||||||
|
|
||||||
|
# add scale fun
|
||||||
|
if (!is.null(scale_fill_fun)) {
|
||||||
|
g <- g + scale_fill_fun
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is.null(scale_color_fun)) {
|
||||||
|
g <- g + scale_color_fun
|
||||||
|
}
|
||||||
|
|
||||||
return(g)
|
return(g)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
354
R/map.R
|
|
@ -1,354 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
#' Wrapper around `tmap::tm_polygons()` with sane defaults for plotting indicator values
|
|
||||||
#'
|
|
||||||
#' @param poly Multipolygon shape defined by sf package.
|
|
||||||
#' @param col Numeric attribute to map.
|
|
||||||
#' @param buffer A buffer, either one value or a vector of 4 values (left, bottom, right, top).
|
|
||||||
#' @param n The desire number of classes.
|
|
||||||
#' @param style Method to process the color scale for continuous numerical variables. See `classInt::classIntervals()` for details.
|
|
||||||
#' @param palette Vector of fill colors as hexadecimal values. For REACH color palettes, it is possible to use `pal_reach()`. For now,'palette' must be changed manually, accordingly to the number of drawn classes.
|
|
||||||
#' @param as_count Boolean. When col is a numeric variable, should it be processed as a count variable? For instance, 0, 1-10, 11-20.
|
|
||||||
#' @param color_na Fill color for missing data.
|
|
||||||
#' @param text_na Legend text for missing data.
|
|
||||||
#' @param legend_title Legend title.
|
|
||||||
#' @param legend_text_separator Text separator for classes. E.g. " to " will give 0, 1 to 10, 11 to 20.
|
|
||||||
#' @param border_alpha Transparency of the border.
|
|
||||||
#' @param border_col Color of the border.
|
|
||||||
#' @param lwd Linewidth of the border.
|
|
||||||
#' @param ... Other arguments to pass to `tmap::tm_polygons()`.
|
|
||||||
#'
|
|
||||||
#' @return A tmap layer.
|
|
||||||
#' @export
|
|
||||||
#'
|
|
||||||
add_indicator_layer <- function(
|
|
||||||
poly,
|
|
||||||
col,
|
|
||||||
buffer = NULL,
|
|
||||||
n = 5,
|
|
||||||
style = "pretty",
|
|
||||||
palette = pal_reach("red_5"),
|
|
||||||
as_count = TRUE,
|
|
||||||
color_na = cols_reach("white"),
|
|
||||||
text_na = "Missing data",
|
|
||||||
legend_title = "Proportion (%)",
|
|
||||||
legend_text_separator = " - ",
|
|
||||||
border_alpha = 1,
|
|
||||||
border_col = cols_reach("lt_grey_1"),
|
|
||||||
lwd = 1,
|
|
||||||
...){
|
|
||||||
|
|
||||||
#------ Checks and make valid
|
|
||||||
|
|
||||||
rlang::check_installed("tmap", reason = "Package \"tmap\" needed for `add_indicator_layer()` to work. Please install it.")
|
|
||||||
|
|
||||||
poly <- sf::st_make_valid(poly)
|
|
||||||
|
|
||||||
#------ Other checks
|
|
||||||
|
|
||||||
col_name <- rlang::as_name(rlang::enquo(col))
|
|
||||||
if_not_in_stop(poly, col_name, "poly", "col")
|
|
||||||
|
|
||||||
if (!is.numeric(poly[[col_name]])) rlang::abort(glue::glue("{col_name} is not numeric."))
|
|
||||||
|
|
||||||
|
|
||||||
#------ Prepare data
|
|
||||||
|
|
||||||
if(!is.null(buffer)){ buffer <- buffer_bbox(poly, buffer) } else { buffer <- NULL }
|
|
||||||
|
|
||||||
|
|
||||||
#------ Polygon layer
|
|
||||||
|
|
||||||
layer <- tmap::tm_shape(
|
|
||||||
poly,
|
|
||||||
bbox = buffer
|
|
||||||
) +
|
|
||||||
tmap::tm_polygons(
|
|
||||||
col = col_name,
|
|
||||||
n = n,
|
|
||||||
style = style,
|
|
||||||
palette = palette,
|
|
||||||
as.count = as_count,
|
|
||||||
colorNA = color_na,
|
|
||||||
textNA = text_na,
|
|
||||||
title = legend_title,
|
|
||||||
legend.format = list(text.separator = legend_text_separator),
|
|
||||||
borderl.col = border_col,
|
|
||||||
border.alpha = border_alpha,
|
|
||||||
lwd = lwd,
|
|
||||||
...
|
|
||||||
)
|
|
||||||
|
|
||||||
return(layer)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#' Add admin boundaries (lines) and the legend
|
|
||||||
#'
|
|
||||||
#' @param lines List of multiline shape defined by sf package.
|
|
||||||
#' @param colors Vector of hexadecimal codes. Same order as lines.
|
|
||||||
#' @param labels Vector of labels in the legend. Same order as lines.
|
|
||||||
#' @param lwds Vector of line widths. Same order as lines.
|
|
||||||
#' @param title Legend title.
|
|
||||||
#' @param buffer A buffer, either one value or a vector of 4 values (left, bottom, right, top).
|
|
||||||
#' @param ... Other arguments to pass to each shape in `tmap::tm_lines()`.
|
|
||||||
#'
|
|
||||||
#' @return A tmap layer.
|
|
||||||
#' @export
|
|
||||||
#'
|
|
||||||
add_admin_boundaries <- function(lines, colors, labels, lwds, title = "", buffer = NULL, ...){
|
|
||||||
|
|
||||||
|
|
||||||
#------ Package check
|
|
||||||
|
|
||||||
rlang::check_installed("tmap", reason = "Package \"tmap\" needed for `add_admin_boundaries()` to work. Please install it.")
|
|
||||||
|
|
||||||
|
|
||||||
#------ Check that the length of vectors is identical between arguments
|
|
||||||
|
|
||||||
if(!inherits(lines, "list")) rlang::abort("Please provide a list for lines.")
|
|
||||||
|
|
||||||
ll <- list(lines, colors, labels, lwds)
|
|
||||||
if (!all(sapply(ll,length) == length(ll[[1]]))) rlang::abort("lines, colors, labels, lwds do not all have the same length.")
|
|
||||||
|
|
||||||
|
|
||||||
#------ Make valid
|
|
||||||
|
|
||||||
lines <- lapply(lines, \(x) sf::st_make_valid(x))
|
|
||||||
|
|
||||||
|
|
||||||
#------ Prepare legend
|
|
||||||
legend_lines <- tmap::tm_add_legend("line",
|
|
||||||
title = title,
|
|
||||||
col = colors,
|
|
||||||
lwd = lwds,
|
|
||||||
labels = labels)
|
|
||||||
|
|
||||||
|
|
||||||
#------ Let's go with all line shapes
|
|
||||||
|
|
||||||
if(!is.null(buffer)){ buffer <- buffer_bbox(lines[[1]], buffer) } else { buffer <- NULL }
|
|
||||||
|
|
||||||
|
|
||||||
layers <- tmap::tm_shape(lines[[1]], bbox = buffer) +
|
|
||||||
tmap::tm_lines(lwd = lwds[[1]], col = colors[[1]], ...)
|
|
||||||
|
|
||||||
if (length(lines) == 1) {
|
|
||||||
|
|
||||||
layers <- layers + legend_lines
|
|
||||||
|
|
||||||
return(layers)
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
for(i in 2:length(lines)){
|
|
||||||
|
|
||||||
layers <- layers + tmap::tm_shape(shp = lines[[i]]) + tmap::tm_lines(lwd = lwds[[i]], col = colors[[i]], ...)
|
|
||||||
}
|
|
||||||
|
|
||||||
layers <- layers + legend_lines
|
|
||||||
|
|
||||||
return(layers)
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#' Basic defaults based on `tmap::tm_layout()`
|
|
||||||
#'
|
|
||||||
#' @param title Map title.
|
|
||||||
#' @param legend_position Legend position. Not above the map is a good start.
|
|
||||||
#' @param frame Boolean. Legend frame?
|
|
||||||
#' @param legend_frame Legend frame color.
|
|
||||||
#' @param legend_text_size Legend text size in 'pt'.
|
|
||||||
#' @param legend_title_size Legend title size in 'pt'.
|
|
||||||
#' @param title_size Title text size in 'pt'.
|
|
||||||
#' @param title_fontface Title fontface. Bold if you wanna exemplify a lot what it is about.
|
|
||||||
#' @param title_color Title font color.
|
|
||||||
#' @param fontfamily Overall fontfamily. Leelawadee is your precious.
|
|
||||||
#' @param ... Other arguments to pass to `tmap::tm_layout()`.
|
|
||||||
#'
|
|
||||||
#' @return A tmap layer.
|
|
||||||
#' @export
|
|
||||||
#'
|
|
||||||
add_layout <- function(
|
|
||||||
title = NULL,
|
|
||||||
legend_position = c(0.02, 0.5),
|
|
||||||
frame = FALSE,
|
|
||||||
legend_frame = cols_reach("main_grey"),
|
|
||||||
legend_text_size = 0.6,
|
|
||||||
legend_title_size = 0.8,
|
|
||||||
title_size = 0.9,
|
|
||||||
title_fontface = "bold",
|
|
||||||
title_color = cols_reach("main_grey"),
|
|
||||||
# check.and.fix = TRUE,
|
|
||||||
fontfamily = "Leelawadee",
|
|
||||||
...){
|
|
||||||
|
|
||||||
layout <- tmap::tm_layout(
|
|
||||||
title = title,
|
|
||||||
legend.position = legend_position,
|
|
||||||
legend.frame = legend_frame,
|
|
||||||
frame = FALSE,
|
|
||||||
legend.text.size = legend_text_size,
|
|
||||||
legend.title.size = legend_title_size,
|
|
||||||
title.size = title_size,
|
|
||||||
title.fontface = title_fontface,
|
|
||||||
title.color = title_color,
|
|
||||||
fontfamily = fontfamily,
|
|
||||||
...)
|
|
||||||
|
|
||||||
return(layout)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#' Wrapper around `tmap::tm_text()` with sane defaults for plotting admin labels.
|
|
||||||
#'
|
|
||||||
#' @param point Multipoint shape defined by sf package.
|
|
||||||
#' @param text Text labels column.
|
|
||||||
#' @param size Relative size of the text labels.
|
|
||||||
#' @param fontface Fontface.
|
|
||||||
#' @param fontfamily Fontfamily. Leelawadee is your precious.
|
|
||||||
#' @param shadow Boolean. Add a shadow around text labels. Issue opened on Github to request.
|
|
||||||
#' @param auto_placement Logical that determines whether the labels are placed automatically.
|
|
||||||
#' @param remove_overlap Logical that determines whether the overlapping labels are removed.
|
|
||||||
#' @param ... Other arguments to pass to `tmap::tm_text()`.
|
|
||||||
#'
|
|
||||||
#' @return A tmap layer.
|
|
||||||
#' @export
|
|
||||||
#'
|
|
||||||
add_admin_labels <- function(point,
|
|
||||||
text,
|
|
||||||
size = 0.5,
|
|
||||||
fontface = "bold",
|
|
||||||
fontfamily = "Leelawadee",
|
|
||||||
shadow = TRUE,
|
|
||||||
auto_placement = FALSE,
|
|
||||||
remove_overlap = FALSE,
|
|
||||||
...){
|
|
||||||
|
|
||||||
|
|
||||||
#------ Restrictive sf checks (might not be necessary depending on the desired behaviour)
|
|
||||||
|
|
||||||
rlang::check_installed("tmap", reason = "Package \"tmap\" needed for `add_indicator_layer()` to work. Please install it.")
|
|
||||||
|
|
||||||
point <- sf::st_make_valid(point)
|
|
||||||
|
|
||||||
#------ Other checks
|
|
||||||
|
|
||||||
text_name <- rlang::as_name(rlang::enquo(text))
|
|
||||||
if_not_in_stop(point, text_name, "point", "text")
|
|
||||||
|
|
||||||
#------ Point text layer
|
|
||||||
|
|
||||||
layer <- tmap::tm_shape(point) +
|
|
||||||
tmap::tm_text(text = text_name,
|
|
||||||
size = size,
|
|
||||||
fontface = fontface,
|
|
||||||
fontfamily = fontfamily,
|
|
||||||
shadow = shadow,
|
|
||||||
auto.placement = auto_placement,
|
|
||||||
remove.overlap = remove_overlap,
|
|
||||||
...)
|
|
||||||
|
|
||||||
return(layer)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#' Add a compass
|
|
||||||
#'
|
|
||||||
#' @param text_size Relative font size.
|
|
||||||
#' @param position Position of the compass. Vector of two values, specifying the x and y coordinates.
|
|
||||||
#' @param color_dark Color of the dark parts of the compass.
|
|
||||||
#' @param text_color color of the text.
|
|
||||||
#' @param type Compass type, one of: "arrow", "4star", "8star", "radar", "rose".
|
|
||||||
#' @param ... Other arguments to pass to `tmap::tm_compass()`.
|
|
||||||
#'
|
|
||||||
#' @return A tmap layer.
|
|
||||||
#' @export
|
|
||||||
#'
|
|
||||||
add_compass <- function(text_size = 0.6,
|
|
||||||
position = c("right", 0.8),
|
|
||||||
color_dark = cols_reach("black"),
|
|
||||||
text_color = cols_reach("black"),
|
|
||||||
type = "4star",
|
|
||||||
...){
|
|
||||||
|
|
||||||
compass <- tmap::tm_compass(
|
|
||||||
text.size = text_size,
|
|
||||||
position = position,
|
|
||||||
color.dark = color_dark,
|
|
||||||
type = type,
|
|
||||||
text.color = text_color
|
|
||||||
)
|
|
||||||
|
|
||||||
return(compass)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#' Add a scale bar
|
|
||||||
#'
|
|
||||||
#' @param text_size Relative font size.
|
|
||||||
#' @param position Position of the compass. Vector of two values, specifying the x and y coordinates.
|
|
||||||
#' @param color_dark Color of the dark parts of the compass.
|
|
||||||
#' @param breaks Breaks of the scale bar. If not specified, breaks will be automatically be chosen given the prefered width of the scale bar. Example: c(0, 50, 100).
|
|
||||||
#' @param ... Other arguments to pass to `tmap::tm_compass()`.
|
|
||||||
#'
|
|
||||||
#' @return A tmap layer.
|
|
||||||
#' @export
|
|
||||||
#'
|
|
||||||
add_scale_bar <- function(text_size = 0.6,
|
|
||||||
position = c("left", 0.01),
|
|
||||||
color_dark = cols_reach("black"),
|
|
||||||
breaks = c(0, 50, 100),
|
|
||||||
...){
|
|
||||||
|
|
||||||
scale_bar <- tmap::tm_scale_bar(
|
|
||||||
text.size = text_size,
|
|
||||||
position = position,
|
|
||||||
color.dark = color_dark,
|
|
||||||
breaks = breaks,
|
|
||||||
...
|
|
||||||
)
|
|
||||||
|
|
||||||
return(scale_bar)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#' Do you want to credit someone or some institution?
|
|
||||||
#'
|
|
||||||
#' @param text Text.
|
|
||||||
#' @param size Relative text size.
|
|
||||||
#' @param bg_color Background color.
|
|
||||||
#' @param position Position. Vector of two coordinates. Usually somewhere down.
|
|
||||||
#' @param ... Other arguments to pass to `tmap::tm_credits()`.
|
|
||||||
#'
|
|
||||||
#' @return A tmap layer.
|
|
||||||
#' @export
|
|
||||||
#'
|
|
||||||
add_credits <- function(text, size = 0.4, bg_color = NA, position = c(0.75, 0.02), ...){
|
|
||||||
|
|
||||||
tmap::tm_credits(text,
|
|
||||||
size = size,
|
|
||||||
bg.color = bg_color,
|
|
||||||
position = position,
|
|
||||||
...)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
#' @title Return function to interpolate an AGORA color palette
|
|
||||||
#'
|
|
||||||
#' @param palette Character name of a palette in AGORA palettes
|
|
||||||
#' @param reverse Boolean indicating whether the palette should be reversed
|
|
||||||
#' @param color_ramp_palette Should the output be a `grDevices::colorRampPalette` function or a vector of hex codes? Default to the former with `TRUE`
|
|
||||||
#' @param show_palettes Should the ouput be the set of palettes names to pick from? Default to `FALSE`
|
|
||||||
#' @param ... Additional arguments to pass to colorRampPalette()
|
|
||||||
#'
|
|
||||||
#' @return A color palette
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
pal_agora <- function(palette = "main", reverse = FALSE, color_ramp_palette = FALSE, show_palettes = FALSE, ...) {
|
|
||||||
|
|
||||||
|
|
||||||
palettes_agora <- list(
|
|
||||||
`main` = cols_agora("main_bordeaux", "main_dk_beige", "main_lt_grey", "main_lt_beige"),
|
|
||||||
`primary` = cols_agora("main_bordeaux", "main_dk_beige"),
|
|
||||||
`secondary` = cols_agora( "main_lt_grey", "main_lt_beige")
|
|
||||||
)
|
|
||||||
|
|
||||||
if (show_palettes) return(names(palettes_agora))
|
|
||||||
|
|
||||||
pal <- palettes_agora[[palette]]
|
|
||||||
|
|
||||||
if (reverse) pal <- rev(pal)
|
|
||||||
|
|
||||||
if (color_ramp_palette) {
|
|
||||||
rlang::check_installed("grDevices", reason = "Package \"grDevices\" needed for `pal_agora()` woth 'color_ramp_palette' set to `TRUE` to work. Please install it.")
|
|
||||||
|
|
||||||
pal <- grDevices::colorRampPalette(pal, ...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(pal)
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
#' @title Return function to interpolate a fallback palette base on viridis::magma()
|
|
||||||
#'
|
|
||||||
#' @param reverse Boolean indicating whether the palette should be reversed
|
|
||||||
#' @param color_ramp_palette Should the output be a `grDevices::colorRampPalette` function or a vector of hex codes? Default to the latter with `FALSE`
|
|
||||||
#' @param discrete Boolean. Discrete or not? Default to FALSE.
|
|
||||||
#' @param n Number of colors in the palette. Default to 5. Passe to `viridis::magma()`
|
|
||||||
#' @param ... Other parameters to pass to `grDevices::colorRampPalette()`
|
|
||||||
#'
|
|
||||||
#' @return A color palette
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
pal_fallback <- function(reverse = FALSE,
|
|
||||||
color_ramp_palette = FALSE,
|
|
||||||
discrete = FALSE,
|
|
||||||
n = 5,
|
|
||||||
...){
|
|
||||||
|
|
||||||
pal <- if(discrete) { viridisLite::viridis(n) } else {viridisLite::magma(n)}
|
|
||||||
|
|
||||||
if (reverse) pal <- rev(pal)
|
|
||||||
|
|
||||||
if (color_ramp_palette) {
|
|
||||||
rlang::check_installed("grDevices", reason = "Package \"grDevices\" needed for `pal_fallback()` with 'color_ramp_palette' set to `TRUE` to work. Please install it.")
|
|
||||||
|
|
||||||
pal <- grDevices::colorRampPalette(pal, ...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(pal)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
#' @title Return function to interpolate an IMPACT color palette
|
|
||||||
#'
|
|
||||||
#' @param palette Character name of a palette in IMPACT palettes
|
|
||||||
#' @param reverse Boolean indicating whether the palette should be reversed
|
|
||||||
#' @param color_ramp_palette Should the output be a `grDevices::colorRampPalette` function or a vector of hex codes? Default to the former with `TRUE`
|
|
||||||
#' @param show_palettes Should the ouput be the set of palettes names to pick from? Default to `FALSE`
|
|
||||||
#' @param ... Additional arguments to pass to colorRampPalette()
|
|
||||||
#'
|
|
||||||
#' @return A color palette
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
pal_impact <- function(palette = "main", reverse = FALSE, color_ramp_palette = FALSE, show_palettes = FALSE, ...) {
|
|
||||||
|
|
||||||
|
|
||||||
palettes_impact <- list(
|
|
||||||
`main` = cols_impact("black", "white", "main_blue", "main_grey"),
|
|
||||||
`primary` = cols_impact("black", "white"),
|
|
||||||
`secondary` = cols_impact("main_blue", "main_grey")
|
|
||||||
)
|
|
||||||
|
|
||||||
if (show_palettes) return(names(palettes_impact))
|
|
||||||
|
|
||||||
pal <- palettes_impact[[palette]]
|
|
||||||
|
|
||||||
if (reverse) pal <- rev(pal)
|
|
||||||
|
|
||||||
if (color_ramp_palette) {
|
|
||||||
rlang::check_installed("grDevices", reason = "Package \"grDevices\" needed for `pal_impact()` woth 'color_ramp_palette' set to `TRUE` to work. Please install it.")
|
|
||||||
|
|
||||||
pal <- grDevices::colorRampPalette(pal, ...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(pal)
|
|
||||||
}
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
#' @title Return function to interpolate a REACH color palette
|
|
||||||
#'
|
|
||||||
#' @param palette Character name of a palette in REACH palettes
|
|
||||||
#' @param reverse Boolean indicating whether the palette should be reversed
|
|
||||||
#' @param color_ramp_palette Should the output be a `grDevices::colorRampPalette` function or a vector of hex codes? Default to the former with `TRUE`
|
|
||||||
#' @param show_palettes Should the ouput be the set of palettes names to pick from? Default to `FALSE`
|
|
||||||
#' @param ... Additional arguments to pass to colorRampPalette()
|
|
||||||
#'
|
|
||||||
#' @return A color palette
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
pal_reach <- function(palette = "main", reverse = FALSE, color_ramp_palette = FALSE, show_palettes = FALSE, ...) {
|
|
||||||
|
|
||||||
palettes_reach <- list(
|
|
||||||
`main` = cols_reach("main_grey", "main_red", "main_lt_grey", "main_beige"),
|
|
||||||
`primary` = cols_reach("main_grey", "main_red"),
|
|
||||||
`secondary` = cols_reach("main_lt_grey", "main_beige"),
|
|
||||||
`two_dots` = cols_reach("two_dots_1", "two_dots_2"),
|
|
||||||
`two_dots_flashy` = cols_reach("two_dots_flashy_1", "two_dots_flashy_2"),
|
|
||||||
`red_main` = cols_reach("red_main_1", "red_main_2", "red_main_3", "red_main_4", "red_main_5"),
|
|
||||||
`red_main_5` = cols_reach("red_main_1", "red_main_2", "red_main_3", "red_main_4", "red_main_5"),
|
|
||||||
`red_alt` = cols_reach("red_alt_1", "red_alt_2", "red_alt_3", "red_alt_4", "red_alt_5"),
|
|
||||||
`red_alt_5` = cols_reach("red_alt_1", "red_alt_2", "red_alt_3", "red_alt_4", "red_alt_5"),
|
|
||||||
`iroise` = cols_reach("iroise_1", "iroise_2", "iroise_3", "iroise_4", "iroise_5"),
|
|
||||||
`iroise_5` = cols_reach("iroise_1", "iroise_2", "iroise_3", "iroise_4", "iroise_5"),
|
|
||||||
`discrete_6` = cols_reach("dk_grey", "red_main_1", "main_beige", "red_main_2", "lt_grey_2", "red_4"),
|
|
||||||
`red_2` = cols_reach("red_less_4_1", "red_less_4_3"),
|
|
||||||
`red_3` = cols_reach("red_less_4_1", "red_less_4_2", "red_less_4_3"),
|
|
||||||
`red_4` = cols_reach("red_less_4_1", "red_less_4_2", "red_less_4_3", "red_less_4_4"),
|
|
||||||
`red_5` = cols_reach("red_5_1", "red_5_2", "red_5_3", "red_5_4", "red_5_5"),
|
|
||||||
`red_6` = cols_reach("red_less_7_1", "red_less_2", "red_less_7_3", "red_less_7_4", "red_less_7_5", "red_less_7_6"),
|
|
||||||
`red_7` = cols_reach("red_less_7_1", "red_less_7_2", "red_less_7_3", "red_less_7_4", "red_less_7_5", "red_less_7_6", "red_less_7_7"),
|
|
||||||
`green_2` = cols_reach("green_2_1", "green_2_2"),
|
|
||||||
`green_3` = cols_reach("green_3_1", "green_3_2", "green_3_3"),
|
|
||||||
`green_4` = cols_reach("green_4_1", "green_4_2", "green_4_3", "green_4_4"),
|
|
||||||
`green_5` = cols_reach("green_5_1", "green_5_2", "green_5_3", "green_5_4", "green_5_5"),
|
|
||||||
`green_6` = cols_reach("green_6_1", "green_6_2", "green_6_3", "green_6_4", "green_6_5", "green_6_6"),
|
|
||||||
`green_7` = cols_reach("green_7_1", "green_7_2", "green_7_3", "green_7_4", "green_7_5", "green_7_6", "green_7_7"),
|
|
||||||
`artichoke_2` = cols_reach("artichoke_2_1", "artichoke_2_2"),
|
|
||||||
`artichoke_3` = cols_reach("artichoke_3_1", "artichoke_3_2", "artichoke_3_3"),
|
|
||||||
`artichoke_4` = cols_reach("artichoke_4_1", "artichoke_4_2", "artichoke_4_3", "artichoke_4_4"),
|
|
||||||
`artichoke_5` = cols_reach("artichoke_5_1", "artichoke_5_2", "artichoke_5_3", "artichoke_5_4", "artichoke_5_5"),
|
|
||||||
`artichoke_6` = cols_reach("artichoke_6_1", "artichoke_6_2", "artichoke_6_3", "artichoke_6_4", "artichoke_6_5", "artichoke_6_6"),
|
|
||||||
`artichoke_7` = cols_reach("artichoke_7_1", "artichoke_7_2", "artichoke_7_3", "artichoke_7_4", "artichoke_7_5", "artichoke_7_6", "artichoke_7_7"),
|
|
||||||
`blue_2` = cols_reach("blue_2_1", "blue_2_2"),
|
|
||||||
`blue_3` = cols_reach("blue_3_1", "blue_3_2", "blue_3_3"),
|
|
||||||
`blue_4` = cols_reach("blue_4_1", "blue_4_2", "blue_4_3", "blue_4_4"),
|
|
||||||
`blue_5` = cols_reach("blue_5_1", "blue_5_2", "blue_5_3", "blue_5_4", "blue_5_5"),
|
|
||||||
`blue_6` = cols_reach("blue_6_1", "blue_6_2", "blue_6_3", "blue_6_4", "blue_6_5", "blue_6_6"),
|
|
||||||
`blue_7` = cols_reach("blue_7_1", "blue_7_2", "blue_7_3", "blue_7_4", "blue_7_5", "blue_7_6", "blue_7_7")
|
|
||||||
)
|
|
||||||
|
|
||||||
if (show_palettes) return(names(palettes_reach))
|
|
||||||
|
|
||||||
pal <- palettes_reach[[palette]]
|
|
||||||
|
|
||||||
if (reverse) pal <- rev(pal)
|
|
||||||
|
|
||||||
if (color_ramp_palette) {
|
|
||||||
rlang::check_installed("grDevices", reason = "Package \"grDevices\" needed for `pal_reach()` with 'color_ramp_palette' set to `TRUE` to work. Please install it.")
|
|
||||||
|
|
||||||
pal <- grDevices::colorRampPalette(pal, ...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return(pal)
|
|
||||||
}
|
|
||||||
81
R/palette.R
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
#' @title Interpolate a color palette
|
||||||
|
#'
|
||||||
|
#' @param palette Character name of a palette in palettes
|
||||||
|
#' @param reverse Boolean indicating whether the palette should be reversed
|
||||||
|
#' @param show_palettes Should the ouput be the set of palettes names to pick from? Default to `FALSE`
|
||||||
|
#' @param ... Additional arguments to pass to colorRampPalette()
|
||||||
|
#'
|
||||||
|
#' @return A color palette
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
palette <- function(
|
||||||
|
palette = "cat_5_main",
|
||||||
|
reverse = FALSE,
|
||||||
|
show_palettes = FALSE,
|
||||||
|
...
|
||||||
|
) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
# palette is a character scalar
|
||||||
|
checkmate::assert_character(palette, len = 1)
|
||||||
|
|
||||||
|
# reverse is a logical scalar
|
||||||
|
checkmate::assert_logical(reverse, len = 1)
|
||||||
|
|
||||||
|
# show_palettes is a logical scalar
|
||||||
|
checkmate::assert_logical(show_palettes, len = 1)
|
||||||
|
|
||||||
|
#------ Get colors
|
||||||
|
|
||||||
|
# Define palettes
|
||||||
|
pals <- list(
|
||||||
|
cat_2_yellow = color_pattern("cat_2_yellow"),
|
||||||
|
cat_2_light = color_pattern("cat_2_light"),
|
||||||
|
cat_2_green = color_pattern("cat_2_green"),
|
||||||
|
cat_2_blue = color_pattern("cat_2_blue"),
|
||||||
|
cat_5_main = color_pattern("cat_5_main"),
|
||||||
|
cat_5_ibm = color_pattern("cat_5_ibm"),
|
||||||
|
cat_3_aquamarine = color_pattern("cat_3_aquamarine"),
|
||||||
|
cat_3_tol_high_contrast = color_pattern("cat_3_tol_high_contrast"),
|
||||||
|
cat_8_tol_adapted = color_pattern("cat_8_tol_adapted"),
|
||||||
|
cat_3_custom_1 = c("#003F5C", "#58508D", "#FFA600"),
|
||||||
|
cat_4_custom_1 = c("#003F5C", "#7a5195", "#ef5675", "#ffa600"),
|
||||||
|
cat_5_custom_1 = c("#003F5C", "#58508d", "#bc5090", "#ff6361", "#ffa600"),
|
||||||
|
cat_6_custom_1 = c(
|
||||||
|
"#003F5C",
|
||||||
|
"#444e86",
|
||||||
|
"#955196",
|
||||||
|
"#dd5182",
|
||||||
|
"#ff6e54",
|
||||||
|
"#ffa600"
|
||||||
|
),
|
||||||
|
div_5_orange_blue = color_pattern("div_5_orange_blue"),
|
||||||
|
div_5_green_purple = color_pattern("div_5_green_purple")
|
||||||
|
)
|
||||||
|
|
||||||
|
# Return if show palettes
|
||||||
|
if (show_palettes) {
|
||||||
|
return(names(pals))
|
||||||
|
}
|
||||||
|
|
||||||
|
# palette is in pals
|
||||||
|
if (palette %notin% names(pals)) {
|
||||||
|
rlang::abort(c(
|
||||||
|
"Palette not defined",
|
||||||
|
"*" = glue::glue(
|
||||||
|
"Palette `{palette}` is not defined in the `palettes` list."
|
||||||
|
),
|
||||||
|
"i" = "Use `palette(show_palettes = TRUE)` to see all available palettes."
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
#------ Get palette
|
||||||
|
|
||||||
|
pal <- pals[[palette]]
|
||||||
|
|
||||||
|
if (reverse) {
|
||||||
|
pal <- rev(pal)
|
||||||
|
}
|
||||||
|
|
||||||
|
return(pal)
|
||||||
|
}
|
||||||
79
R/palette_gen.R
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
#' Generate color palettes
|
||||||
|
#'
|
||||||
|
#' [palette_gen()] generates a color palette and let you choose whether continuous or discrete. [palette_gen_categorical()] and [palette_gen_sequential()] generates respectively discrete and continuous palettes.
|
||||||
|
#'
|
||||||
|
#' @param palette Palette name from [palette()].
|
||||||
|
#' @param type "categorical" or "sequential" or "divergent".
|
||||||
|
#' @param direction 1 or -1; should the order of colors be reversed?
|
||||||
|
#' @param ... Additional arguments to pass to [colorRampPalette()] when type is "continuous".
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
palette_gen <- function(palette, type, direction = 1, ...) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
checkmate::assert_string(palette)
|
||||||
|
checkmate::assert_choice(type, c("categorical", "sequential", "divergent"))
|
||||||
|
checkmate::assert_number(direction, lower = -1, upper = 1)
|
||||||
|
checkmate::assert_true(abs(direction) == 1)
|
||||||
|
|
||||||
|
if (type == "categorical") {
|
||||||
|
return(palette_gen_categorical(palette = palette, direction = direction))
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type %in% c("sequential", "divergent")) {
|
||||||
|
return(palette_gen_sequential(
|
||||||
|
palette = palette,
|
||||||
|
direction = direction,
|
||||||
|
...
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#' @rdname palette_gen
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
palette_gen_categorical <- function(palette = "cat_5_main", direction = 1) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
checkmate::assert_string(palette)
|
||||||
|
checkmate::assert_number(direction, lower = -1, upper = 1)
|
||||||
|
checkmate::assert_true(abs(direction) == 1)
|
||||||
|
|
||||||
|
pal <- palette(palette)
|
||||||
|
|
||||||
|
f <- function(n) {
|
||||||
|
if (is.null(n)) {
|
||||||
|
n <- length(pal)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n > length(pal)) {
|
||||||
|
rlang::warn("Not enough colors in this palette!")
|
||||||
|
}
|
||||||
|
|
||||||
|
pal <- if (direction == 1) pal else rev(pal)
|
||||||
|
|
||||||
|
pal <- pal[1:n]
|
||||||
|
|
||||||
|
return(pal)
|
||||||
|
}
|
||||||
|
|
||||||
|
return(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname palette_gen
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
palette_gen_sequential <- function(palette = "cat_5_main", direction = 1, ...) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
checkmate::assert_string(palette)
|
||||||
|
checkmate::assert_number(direction, lower = -1, upper = 1)
|
||||||
|
checkmate::assert_true(abs(direction) == 1)
|
||||||
|
|
||||||
|
pal <- palette(palette)
|
||||||
|
|
||||||
|
pal <- if (direction == 1) pal else rev(pal)
|
||||||
|
|
||||||
|
grDevices::colorRampPalette(pal, ...)
|
||||||
|
}
|
||||||
207
R/point.R
|
|
@ -1,10 +1,18 @@
|
||||||
#' @title Simple point chart
|
#' @title Simple scatterplot
|
||||||
#'
|
#'
|
||||||
#' @param df A data frame.
|
#' @param df A data frame.
|
||||||
#' @param x A numeric column.
|
#' @param x A quoted numeric column.
|
||||||
#' @param y A character column or coercible as a character column.
|
#' @param y A quoted numeric column.
|
||||||
#' @param group Some grouping categorical column, e.g. administrative areas or population groups.
|
#' @param group Some quoted grouping categorical column, e.g. administrative areas or population groups.
|
||||||
#' @param flip TRUE or FALSE. Default to TRUE or horizontal bar plot.
|
#' @param facet Some quoted grouping categorical column.
|
||||||
|
#' @param facet_scales Character. Either "free" (default) or "fixed" for facet scales.
|
||||||
|
#' @param x_rm_na Remove NAs in x?
|
||||||
|
#' @param y_rm_na Remove NAs in y?
|
||||||
|
#' @param group_rm_na Remove NAs in group?
|
||||||
|
#' @param facet_rm_na Remove NAs in facet?
|
||||||
|
#' @param add_color Add a color to points (if no grouping).
|
||||||
|
#' @param add_color_guide Should a legend be added?
|
||||||
|
#' @param flip TRUE or FALSE.
|
||||||
#' @param alpha Fill transparency.
|
#' @param alpha Fill transparency.
|
||||||
#' @param size Point size.
|
#' @param size Point size.
|
||||||
#' @param x_title The x scale title. Default to NULL.
|
#' @param x_title The x scale title. Default to NULL.
|
||||||
|
|
@ -13,31 +21,125 @@
|
||||||
#' @param title Plot title. Default to NULL.
|
#' @param title Plot title. Default to NULL.
|
||||||
#' @param subtitle Plot subtitle. Default to NULL.
|
#' @param subtitle Plot subtitle. Default to NULL.
|
||||||
#' @param caption Plot caption. Default to NULL.
|
#' @param caption Plot caption. Default to NULL.
|
||||||
#' @param theme Whatever theme. Default to theme_reach().
|
#' @param theme_fun Whatever theme. Default to theme_point(). NULL if no theming needed.
|
||||||
#'
|
#'
|
||||||
#' @return A bar chart
|
#' @inheritParams scale_color_visualizer_discrete
|
||||||
#'
|
#'
|
||||||
#' @export
|
#' @export
|
||||||
point <- function(df, x, y, group = NULL, flip = TRUE, alpha = 1, size = 1, x_title = NULL, y_title = NULL, group_title = NULL, title = NULL, subtitle = NULL, caption = NULL, theme = theme_reach()){
|
point <- function(
|
||||||
|
df,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
group = "",
|
||||||
|
facet = "",
|
||||||
|
facet_scales = "free",
|
||||||
|
x_rm_na = TRUE,
|
||||||
|
y_rm_na = TRUE,
|
||||||
|
group_rm_na = TRUE,
|
||||||
|
facet_rm_na = TRUE,
|
||||||
|
add_color = color("cat_5_main_1"),
|
||||||
|
add_color_guide = TRUE,
|
||||||
|
flip = TRUE,
|
||||||
|
alpha = 1,
|
||||||
|
size = 2,
|
||||||
|
x_title = NULL,
|
||||||
|
y_title = NULL,
|
||||||
|
group_title = NULL,
|
||||||
|
title = NULL,
|
||||||
|
subtitle = NULL,
|
||||||
|
caption = NULL,
|
||||||
|
theme_fun = theme_point(),
|
||||||
|
scale_fill_fun = scale_fill_visualizer_discrete(),
|
||||||
|
scale_color_fun = scale_color_visualizer_discrete()
|
||||||
|
) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
# To do :
|
# df is a data frame
|
||||||
# - automate bar width and text size, or at least give the flexibility and still center text
|
checkmate::assert_data_frame(df)
|
||||||
# - add facet possibility
|
|
||||||
|
|
||||||
# Prepare group, x and y names
|
# x and y and group are character
|
||||||
# if (is.null(x_title)) x_title <- rlang::as_name(rlang::enquo(x))
|
checkmate::assert_character(x, len = 1)
|
||||||
# if (is.null(y_title)) y_title <- rlang::as_name(rlang::enquo(y))
|
checkmate::assert_character(y, len = 1)
|
||||||
# if (is.null(group_title)) group_title <- rlang::as_name(rlang::enquo(group))
|
checkmate::assert_character(group, len = 1)
|
||||||
|
|
||||||
# Mapping
|
# x and y are columns in df
|
||||||
|
checkmate::assert_choice(x, colnames(df))
|
||||||
|
checkmate::assert_choice(y, colnames(df))
|
||||||
|
if (group != "") {
|
||||||
|
checkmate::assert_choice(group, colnames(df))
|
||||||
|
}
|
||||||
|
|
||||||
|
# x_rm_na, y_rm_na and group_rm_na are logical scalar
|
||||||
|
checkmate::assert_logical(x_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(y_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(group_rm_na, len = 1)
|
||||||
|
checkmate::assert_logical(facet_rm_na, len = 1)
|
||||||
|
|
||||||
|
# facet_scales is a character scalar in c("free", "fixed")
|
||||||
|
checkmate::assert_choice(facet_scales, c("free", "fixed"))
|
||||||
|
|
||||||
|
# flip is a logical scalar
|
||||||
|
checkmate::assert_logical(flip, len = 1)
|
||||||
|
|
||||||
|
# alpha is a numeric scalar between 0 and 1
|
||||||
|
checkmate::assert_numeric(alpha, lower = 0, upper = 1, len = 1)
|
||||||
|
|
||||||
|
# size is a numeric scalar
|
||||||
|
checkmate::assert_numeric(size, len = 1)
|
||||||
|
|
||||||
|
# x and y are numeric
|
||||||
|
if (!any(c("numeric", "integer") %in% class(df[[x]]))) {
|
||||||
|
rlang::abort(paste0(x, " must be numeric."))
|
||||||
|
}
|
||||||
|
if (!any(c("numeric", "integer") %in% class(df[[y]]))) {
|
||||||
|
rlang::abort(paste0(y, " must be numeric."))
|
||||||
|
}
|
||||||
|
|
||||||
|
#----- Data wrangling
|
||||||
|
|
||||||
|
# facets over group
|
||||||
|
if (group != "" && facet != "" && group == facet) {
|
||||||
|
rlang::warn("'group' and 'facet' are the same identical.")
|
||||||
|
}
|
||||||
|
|
||||||
|
# remove NAs using base R
|
||||||
|
if (x_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[x]])), ]
|
||||||
|
}
|
||||||
|
if (y_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[y]])), ]
|
||||||
|
}
|
||||||
|
if (group != "" && group_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[group]])), ]
|
||||||
|
}
|
||||||
|
if (facet != "" && facet_rm_na) {
|
||||||
|
df <- df[!(is.na(df[[facet]])), ]
|
||||||
|
}
|
||||||
|
|
||||||
|
# prepare aes
|
||||||
|
if (group != "") {
|
||||||
g <- ggplot2::ggplot(
|
g <- ggplot2::ggplot(
|
||||||
df,
|
df,
|
||||||
mapping = ggplot2::aes(x = {{ x }}, y = {{ y }}, fill = {{ group }}, color = {{ group }}
|
mapping = ggplot2::aes(
|
||||||
|
x = !!rlang::sym(x),
|
||||||
|
y = !!rlang::sym(y),
|
||||||
|
fill = !!rlang::sym(group),
|
||||||
|
color = !!rlang::sym(group)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
} else {
|
||||||
|
g <- ggplot2::ggplot(
|
||||||
|
df,
|
||||||
|
mapping = ggplot2::aes(
|
||||||
|
x = !!rlang::sym(x),
|
||||||
|
y = !!rlang::sym(y)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
# Add title, subtitle, caption, x_title, y_title
|
# add title, subtitle, caption, x_title, y_title
|
||||||
g <- g + ggplot2::labs(
|
g <- g +
|
||||||
|
ggplot2::labs(
|
||||||
title = title,
|
title = title,
|
||||||
subtitle = subtitle,
|
subtitle = subtitle,
|
||||||
caption = caption,
|
caption = caption,
|
||||||
|
|
@ -47,35 +149,64 @@ point <- function(df, x, y, group = NULL, flip = TRUE, alpha = 1, size = 1, x_ti
|
||||||
fill = group_title
|
fill = group_title
|
||||||
)
|
)
|
||||||
|
|
||||||
width <- 0.5
|
# facets
|
||||||
dodge_width <- 0.5
|
# facets
|
||||||
|
if (facet != "") {
|
||||||
|
if (flip) {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::facet_grid(
|
||||||
|
rows = ggplot2::vars(!!rlang::sym(facet)),
|
||||||
|
scales = facet_scales,
|
||||||
|
space = if (facet_scales == "free") "free_y" else "fixed"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::facet_grid(
|
||||||
|
cols = ggplot2::vars(!!rlang::sym(facet)),
|
||||||
|
scales = facet_scales,
|
||||||
|
space = if (facet_scales == "free") "free_x" else "fixed"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Should the graph use position_fill?
|
# Should the graph use position_fill?
|
||||||
g <- g + ggplot2::geom_point(
|
if (group != "") {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_point(
|
||||||
alpha = alpha,
|
alpha = alpha,
|
||||||
size = size
|
size = size
|
||||||
)
|
)
|
||||||
|
} else {
|
||||||
|
g <- g +
|
||||||
|
ggplot2::geom_point(
|
||||||
|
alpha = alpha,
|
||||||
|
size = size,
|
||||||
|
color = add_color
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
# Labels to percent and expand scale
|
if (flip) {
|
||||||
# if (percent) {
|
|
||||||
# g <- g + ggplot2::scale_y_continuous(
|
|
||||||
# labels = scales::label_percent(
|
|
||||||
# accuracy = 1,
|
|
||||||
# decimal.mark = ",",
|
|
||||||
# suffix = " %"),
|
|
||||||
# expand = c(0.01, 0.1)
|
|
||||||
# )
|
|
||||||
# } else {
|
|
||||||
# g <- g + ggplot2::scale_y_continuous(expand = c(0.01, 0.1))
|
|
||||||
# }
|
|
||||||
|
|
||||||
# # Because a text legend should always be horizontal, especially for an horizontal bar graph
|
|
||||||
if (flip){
|
|
||||||
g <- g + ggplot2::coord_flip()
|
g <- g + ggplot2::coord_flip()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Remove guides for legend if !add_color_guide
|
||||||
|
if (!add_color_guide) {
|
||||||
|
g <- g + ggplot2::guides(fill = "none", color = "none")
|
||||||
|
}
|
||||||
|
|
||||||
# Add theme
|
# Add theme
|
||||||
g <- g + theme
|
if (!is.null(theme_fun)) {
|
||||||
|
g <- g + theme_fun
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add scale fun
|
||||||
|
if (!is.null(scale_fill_fun)) {
|
||||||
|
g <- g + scale_fill_fun
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is.null(scale_color_fun)) {
|
||||||
|
g <- g + scale_color_fun
|
||||||
|
}
|
||||||
|
|
||||||
return(g)
|
return(g)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
108
R/reorder_by.R
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
#' Reorder a Data Frame
|
||||||
|
#'
|
||||||
|
#' @param df A data frame to be reordered.
|
||||||
|
#' @param x A character scalar specifying the column to be reordered.
|
||||||
|
#' @param y A character scalar specifying the column to order by if ordering by values.
|
||||||
|
#' @param group A character scalar specifying the grouping column (optional).
|
||||||
|
#' @param order A character scalar specifying the order type (one of "none", "y", "grouped"). See details.
|
||||||
|
#' @param dir_order A logical scalar specifying whether to flip the order.
|
||||||
|
#'
|
||||||
|
#' @details Ordering takes the following possible values:
|
||||||
|
#'
|
||||||
|
#' * "none": No reordering.
|
||||||
|
#' * "y": Order by values of y.
|
||||||
|
#' * "grouped_y": Order by values of y and group.
|
||||||
|
#' * "x": Order alphabetically by x.
|
||||||
|
#' * "grouped_x": Order alphabetically by x and group.
|
||||||
|
#'
|
||||||
|
#'
|
||||||
|
#' @return The reordered data frame.
|
||||||
|
#'
|
||||||
|
#' @examples
|
||||||
|
#' # Example usage
|
||||||
|
#' df <- data.frame(col1 = c("b", "a", "c"), col2 = c(10, 25, 3))
|
||||||
|
#' reorder_by(df, "col1", "col2")
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
reorder_by <- function(df, x, y, group = "", order = "y", dir_order = 1) {
|
||||||
|
#------ Checks
|
||||||
|
|
||||||
|
# df is a data frame
|
||||||
|
checkmate::assert_data_frame(df)
|
||||||
|
|
||||||
|
# x and y are character scalar and in df
|
||||||
|
checkmate::assert_character(x, len = 1)
|
||||||
|
checkmate::assert_character(y, len = 1)
|
||||||
|
checkmate::assert_subset(x, colnames(df))
|
||||||
|
checkmate::assert_subset(y, colnames(df))
|
||||||
|
|
||||||
|
# group is character scalar and in df if not empty
|
||||||
|
checkmate::assert_character(group, len = 1)
|
||||||
|
if (group != "") {
|
||||||
|
checkmate::assert_subset(group, colnames(df))
|
||||||
|
}
|
||||||
|
|
||||||
|
# order is a character scalar in c("none", "y", "grouped")
|
||||||
|
checkmate::assert_choice(order, c("none", "y", "grouped_y", "x", "grouped_x"))
|
||||||
|
|
||||||
|
# dir_order is 1 or -1 (numeric scalar)
|
||||||
|
checkmate::assert_subset(dir_order, c(1, -1))
|
||||||
|
|
||||||
|
# Convert dir_order to decreasing logical flag
|
||||||
|
dir_order_lgl <- (dir_order == -1)
|
||||||
|
|
||||||
|
#------ Reorder
|
||||||
|
|
||||||
|
# droplevels first
|
||||||
|
if (is.factor(df[[x]])) {
|
||||||
|
df[[x]] <- droplevels(df[[x]])
|
||||||
|
}
|
||||||
|
|
||||||
|
# reording options
|
||||||
|
if (order == "y") {
|
||||||
|
# Order by values of y
|
||||||
|
df <- df[order(df[[y]], decreasing = dir_order_lgl), ]
|
||||||
|
df[[x]] <- forcats::fct_inorder(df[[x]])
|
||||||
|
} else if (order == "grouped_y" && group != "") {
|
||||||
|
# Order by group first, then by values of y
|
||||||
|
df <- df[
|
||||||
|
order(
|
||||||
|
df[[group]],
|
||||||
|
df[[y]],
|
||||||
|
decreasing = c(FALSE, dir_order_lgl),
|
||||||
|
method = "radix"
|
||||||
|
),
|
||||||
|
]
|
||||||
|
df[[x]] <- forcats::fct_inorder(df[[x]])
|
||||||
|
} else if (order == "grouped_y" && group == "") {
|
||||||
|
# Fallback to ordering by y if group is empty
|
||||||
|
rlang::warn("Group is empty. Ordering by y only.")
|
||||||
|
df <- df[order(df[[y]], decreasing = dir_order_lgl), ]
|
||||||
|
df[[x]] <- forcats::fct_inorder(df[[x]])
|
||||||
|
} else if (order == "x") {
|
||||||
|
# Order alphabetically by x
|
||||||
|
df <- df[order(df[[x]], decreasing = dir_order_lgl), ]
|
||||||
|
df[[x]] <- forcats::fct_inorder(df[[x]])
|
||||||
|
} else if (order == "grouped_x" && group != "") {
|
||||||
|
# Order by group first, then alphabetically by x
|
||||||
|
df <- df[
|
||||||
|
order(
|
||||||
|
df[[group]],
|
||||||
|
df[[x]],
|
||||||
|
decreasing = c(FALSE, dir_order_lgl),
|
||||||
|
method = "radix"
|
||||||
|
),
|
||||||
|
]
|
||||||
|
df[[x]] <- forcats::fct_inorder(df[[x]])
|
||||||
|
} else if (order == "grouped_x" && group == "") {
|
||||||
|
# Fallback to ordering by x if group is empty
|
||||||
|
rlang::warn("Group is empty. Ordering by x only.")
|
||||||
|
df <- df[order(df[[x]], decreasing = dir_order_lgl), ]
|
||||||
|
df[[x]] <- forcats::fct_inorder(df[[x]])
|
||||||
|
}
|
||||||
|
|
||||||
|
# Reset row names
|
||||||
|
rownames(df) <- NULL
|
||||||
|
|
||||||
|
return(df)
|
||||||
|
}
|
||||||
324
R/scale.R
|
|
@ -1,119 +1,41 @@
|
||||||
#' Color scale constructor for REACH or AGORA colors
|
#' Scale constructors for fill and colors
|
||||||
|
#'
|
||||||
|
#' This function is based on [palette()]. If palette is NULL, the used palette will be magma from gpplot2's viridis scale constructors.
|
||||||
|
#'
|
||||||
|
#' @inheritParams palette_gen
|
||||||
#'
|
#'
|
||||||
#' @param initiative Either "reach" or "agora" or "default".
|
|
||||||
#' @param palette Palette name from `pal_reach()` or `pal_agora()`.
|
|
||||||
#' @param discrete Boolean indicating whether color aesthetic is discrete or not.
|
|
||||||
#' @param reverse Boolean indicating whether the palette should be reversed.
|
|
||||||
#' @param reverse_guide Boolean indicating whether the guide should be reversed.
|
#' @param reverse_guide Boolean indicating whether the guide should be reversed.
|
||||||
#' @param ... Additional arguments passed to discrete_scale() or
|
#' @param ... Additional arguments passed to [ggplot2::discrete_scale()] if discrete or [ggplot2::scale_fill_gradient()] if continuous.
|
||||||
#' scale_fill_gradient(), used respectively when discrete is TRUE or FALSE.
|
|
||||||
#'
|
|
||||||
#' @return A color scale for ggplot
|
|
||||||
#'
|
#'
|
||||||
#' @export
|
#' @export
|
||||||
scale_color <- function(initiative = "reach", palette = "main", discrete = TRUE, reverse = FALSE, reverse_guide = TRUE, ...) {
|
scale_color_visualizer_discrete <- function(
|
||||||
|
palette = "cat_5_main",
|
||||||
if (initiative == "reach") {
|
direction = 1,
|
||||||
|
reverse_guide = TRUE,
|
||||||
pal <- pal_reach(palette)
|
title_position = NULL,
|
||||||
|
...
|
||||||
if (is.null(pal)) {
|
) {
|
||||||
|
if (!(is.null(palette))) {
|
||||||
pal <- pal_fallback(
|
|
||||||
reverse = reverse,
|
|
||||||
discrete = discrete,
|
|
||||||
color_ramp_palette = TRUE)
|
|
||||||
|
|
||||||
rlang::warn(
|
|
||||||
c(
|
|
||||||
paste0("There is no palette '", palette, "' for the selected initiative. Fallback to pal_fallback()."),
|
|
||||||
"i" = paste0("Use `pal_reach(show_palettes = TRUE)` to see the list of available palettes.")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (discrete) palette <- "viridis" else palette <- "magma"
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
pal <- pal_reach(
|
|
||||||
palette = palette,
|
|
||||||
reverse = reverse,
|
|
||||||
color_ramp_palette = TRUE,
|
|
||||||
show_palettes = FALSE
|
|
||||||
)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (initiative == "agora") {
|
|
||||||
|
|
||||||
pal <- pal_agora(palette)
|
|
||||||
|
|
||||||
if (is.null(pal)) {
|
|
||||||
|
|
||||||
pal <- pal_fallback(
|
|
||||||
reverse = reverse,
|
|
||||||
discrete = discrete,
|
|
||||||
color_ramp_palette = TRUE)
|
|
||||||
|
|
||||||
rlang::warn(
|
|
||||||
c(
|
|
||||||
paste0("There is no palette '", palette, "' for the selected initiative. Fallback to pal_fallback()."),
|
|
||||||
"i" = paste0("Use `pal_reach(show_palettes = TRUE)` to see the list of available palettes.")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (discrete) palette <- "viridis" else palette <- "magma"
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
pal <- pal_agora(
|
|
||||||
palette = palette,
|
|
||||||
reverse = reverse,
|
|
||||||
color_ramp_palette = TRUE,
|
|
||||||
show_palettes = FALSE
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (initiative == "default") {
|
|
||||||
|
|
||||||
pal <- pal_fallback(
|
|
||||||
reverse = reverse,
|
|
||||||
discrete = discrete,
|
|
||||||
color_ramp_palette = TRUE)
|
|
||||||
|
|
||||||
if (discrete) palette <- "viridis" else palette <- "magma"
|
|
||||||
|
|
||||||
} else {
|
|
||||||
rlang::abort(
|
|
||||||
c(
|
|
||||||
paste0("There is no initiative '", initiative, "."),
|
|
||||||
"i" = paste0("initiative should be either 'reach', 'agora' or 'default'")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (discrete) {
|
|
||||||
ggplot2::discrete_scale(
|
ggplot2::discrete_scale(
|
||||||
"colour",
|
"color",
|
||||||
paste0(initiative, "_", palette),
|
palette = palette_gen(palette, "categorical", direction),
|
||||||
palette = pal,
|
|
||||||
guide = ggplot2::guide_legend(
|
guide = ggplot2::guide_legend(
|
||||||
title.position = "top",
|
title.position = title_position,
|
||||||
draw.ulim = TRUE,
|
draw.ulim = TRUE,
|
||||||
draw.llim = TRUE,
|
draw.llim = TRUE,
|
||||||
ticks.colour = "#F1F3F5",
|
# ticks.colour = "#F1F3F5",
|
||||||
reverse = reverse_guide
|
reverse = reverse_guide
|
||||||
),
|
),
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
ggplot2::scale_color_gradientn(
|
ggplot2::scale_colour_viridis_d(
|
||||||
colours = pal(256),
|
direction = direction,
|
||||||
guide = ggplot2::guide_colorbar(
|
guide = ggplot2::guide_legend(
|
||||||
title.position = "top",
|
title.position = title_position,
|
||||||
draw.ulim = TRUE,
|
draw.ulim = TRUE,
|
||||||
draw.llim = TRUE,
|
draw.llim = TRUE,
|
||||||
ticks.colour = "#F1F3F5",
|
# ticks.colour = "#F1F3F5",
|
||||||
reverse = reverse_guide
|
reverse = reverse_guide
|
||||||
),
|
),
|
||||||
...
|
...
|
||||||
|
|
@ -121,128 +43,118 @@ scale_color <- function(initiative = "reach", palette = "main", discrete = TRUE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#' @rdname scale_color_visualizer_discrete
|
||||||
|
|
||||||
#' Fill scale constructor for REACH or AGORA colors
|
|
||||||
#'
|
|
||||||
#' @param initiative Either "reach" or "agora" or "default".
|
|
||||||
#' @param palette Palette name from `pal_reach()` or `pal_agora()`.
|
|
||||||
#' @param discrete Boolean indicating whether color aesthetic is discrete or not.
|
|
||||||
#' @param reverse Boolean indicating whether the palette should be reversed.
|
|
||||||
#' @param reverse_guide Boolean indicating whether the guide should be reversed.
|
|
||||||
#' @param ... Additional arguments passed to discrete_scale() or
|
|
||||||
#' scale_fill_gradient(), used respectively when discrete is TRUE or FALSE.
|
|
||||||
#'
|
|
||||||
#' @return A fill scale for ggplot.
|
|
||||||
#'
|
#'
|
||||||
#' @export
|
#' @export
|
||||||
scale_fill <- function(initiative = "reach", palette = "main", discrete = TRUE, reverse = FALSE, reverse_guide = TRUE, ...) {
|
scale_fill_visualizer_discrete <- function(
|
||||||
|
palette = "cat_5_main",
|
||||||
|
direction = 1,
|
||||||
if (initiative == "reach") {
|
reverse_guide = TRUE,
|
||||||
|
title_position = NULL,
|
||||||
pal <- pal_reach(palette)
|
...
|
||||||
|
) {
|
||||||
if (is.null(pal)) {
|
if (!(is.null(palette))) {
|
||||||
|
|
||||||
pal <- pal_fallback(
|
|
||||||
reverse = reverse,
|
|
||||||
discrete = discrete,
|
|
||||||
color_ramp_palette = TRUE)
|
|
||||||
|
|
||||||
rlang::warn(
|
|
||||||
c(
|
|
||||||
paste0("There is no palette '", palette, "' for the selected initiative. Fallback to pal_fallback()."),
|
|
||||||
"i" = paste0("Use `pal_reach(show_palettes = TRUE)` to see the list of available palettes.")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (discrete) palette <- "viridis" else palette <- "magma"
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
pal <- pal_reach(
|
|
||||||
palette = palette,
|
|
||||||
reverse = reverse,
|
|
||||||
color_ramp_palette = TRUE,
|
|
||||||
show_palettes = FALSE
|
|
||||||
)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (initiative == "agora") {
|
|
||||||
|
|
||||||
pal <- pal_agora(palette)
|
|
||||||
|
|
||||||
if (is.null(pal)) {
|
|
||||||
|
|
||||||
pal <- pal_fallback(
|
|
||||||
reverse = reverse,
|
|
||||||
discrete = discrete,
|
|
||||||
color_ramp_palette = TRUE)
|
|
||||||
|
|
||||||
rlang::warn(
|
|
||||||
c(
|
|
||||||
paste0("There is no palette '", palette, "' for the selected initiative. Fallback to pal_fallback()."),
|
|
||||||
"i" = paste0("Use `pal_reach(show_palettes = TRUE)` to see the list of available palettes.")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (discrete) palette <- "viridis" else palette <- "magma"
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
pal <- pal_agora(
|
|
||||||
palette = palette,
|
|
||||||
reverse = reverse,
|
|
||||||
color_ramp_palette = TRUE,
|
|
||||||
show_palettes = FALSE
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (initiative == "default") {
|
|
||||||
|
|
||||||
pal <- pal_fallback(
|
|
||||||
reverse = reverse,
|
|
||||||
discrete = discrete,
|
|
||||||
color_ramp_palette = TRUE)
|
|
||||||
|
|
||||||
if (discrete) palette <- "viridis" else palette <- "magma"
|
|
||||||
|
|
||||||
} else {
|
|
||||||
rlang::abort(
|
|
||||||
c(
|
|
||||||
paste0("There is no initiative '", initiative, "."),
|
|
||||||
"i" = paste0("initiative should be either 'reach', 'agora' or 'default'")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (discrete) {
|
|
||||||
ggplot2::discrete_scale(
|
ggplot2::discrete_scale(
|
||||||
"fill",
|
"fill",
|
||||||
paste0(initiative, "_", palette),
|
palette = palette_gen(palette, "categorical", direction),
|
||||||
palette = pal,
|
|
||||||
guide = ggplot2::guide_legend(
|
guide = ggplot2::guide_legend(
|
||||||
title.position = "top",
|
title.position = title_position,
|
||||||
draw.ulim = TRUE,
|
draw.ulim = TRUE,
|
||||||
draw.llim = TRUE,
|
draw.llim = TRUE,
|
||||||
ticks.colour = "#F1F3F5",
|
# ticks.colour = "#F1F3F5",
|
||||||
reverse = reverse_guide
|
reverse = reverse_guide
|
||||||
),
|
),
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
ggplot2::scale_color_gradientn(
|
ggplot2::scale_fill_viridis_d(
|
||||||
colours = pal(256),
|
direction = direction,
|
||||||
guide = ggplot2::guide_colorbar(
|
guide = ggplot2::guide_legend(
|
||||||
title.position = "top",
|
title.position = title_position,
|
||||||
draw.ulim = TRUE,
|
draw.ulim = TRUE,
|
||||||
draw.llim = TRUE,
|
draw.llim = TRUE,
|
||||||
ticks.colour = "#F1F3F5",
|
# ticks.colour = "#F1F3F5",
|
||||||
reverse = reverse_guide
|
reverse = reverse_guide
|
||||||
),
|
),
|
||||||
...
|
...
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#' @rdname scale_color_visualizer_discrete
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
scale_fill_visualizer_continuous <- function(
|
||||||
|
palette = "seq_5_main",
|
||||||
|
direction = 1,
|
||||||
|
reverse_guide = TRUE,
|
||||||
|
title_position = NULL,
|
||||||
|
...
|
||||||
|
) {
|
||||||
|
if (!(is.null(palette))) {
|
||||||
|
pal <- palette_gen(palette, "continuous", direction)
|
||||||
|
|
||||||
|
ggplot2::scale_fill_gradientn(
|
||||||
|
colors = pal(256),
|
||||||
|
guide = ggplot2::guide_colorbar(
|
||||||
|
title.position = title_position,
|
||||||
|
draw.ulim = TRUE,
|
||||||
|
draw.llim = TRUE,
|
||||||
|
# ticks.colour = "#F1F3F5",
|
||||||
|
reverse = reverse_guide
|
||||||
|
),
|
||||||
|
...
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
ggplot2::scale_fill_viridis_c(
|
||||||
|
option = "magma",
|
||||||
|
guide = ggplot2::guide_colorbar(
|
||||||
|
title.position = title_position,
|
||||||
|
draw.ulim = TRUE,
|
||||||
|
draw.llim = TRUE,
|
||||||
|
# ticks.colour = "#F1F3F5",
|
||||||
|
reverse = reverse_guide
|
||||||
|
),
|
||||||
|
...
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#' @rdname scale_color_visualizer_discrete
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
scale_color_visualizer_continuous <- function(
|
||||||
|
palette = "seq_5_main",
|
||||||
|
direction = 1,
|
||||||
|
reverse_guide = TRUE,
|
||||||
|
title_position = NULL,
|
||||||
|
...
|
||||||
|
) {
|
||||||
|
if (!(is.null(palette))) {
|
||||||
|
pal <- palette_gen(palette, "continuous", direction)
|
||||||
|
|
||||||
|
ggplot2::scale_fill_gradientn(
|
||||||
|
colors = pal(256),
|
||||||
|
guide = ggplot2::guide_colorbar(
|
||||||
|
title.position = title_position,
|
||||||
|
draw.ulim = TRUE,
|
||||||
|
draw.llim = TRUE,
|
||||||
|
# ticks.colour = "#F1F3F5",
|
||||||
|
reverse = reverse_guide
|
||||||
|
),
|
||||||
|
...
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
ggplot2::scale_colour_viridis_c(
|
||||||
|
option = "magma",
|
||||||
|
guide = ggplot2::guide_colorbar(
|
||||||
|
title.position = title_position,
|
||||||
|
draw.ulim = TRUE,
|
||||||
|
draw.llim = TRUE,
|
||||||
|
# ticks.colour = "#F1F3F5",
|
||||||
|
reverse = reverse_guide
|
||||||
|
),
|
||||||
|
....
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
95
R/theme_bar.R
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
#' Custom Theme for Bar Charts
|
||||||
|
#'
|
||||||
|
#' @return A custom theme object.
|
||||||
|
#'
|
||||||
|
#' @rdname theme_default
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
theme_bar <- function(
|
||||||
|
flip = TRUE,
|
||||||
|
add_text = FALSE,
|
||||||
|
axis_text_x_angle = 0,
|
||||||
|
axis_text_x_vjust = 0.5,
|
||||||
|
axis_text_x_hjust = 0.5
|
||||||
|
) {
|
||||||
|
# If add_text is TRUE, flip is FALSE
|
||||||
|
if (!flip && !add_text) {
|
||||||
|
par_axis_text_font_face <- "plain"
|
||||||
|
par_axis_x <- TRUE
|
||||||
|
par_axis_y <- TRUE
|
||||||
|
par_axis_line_y <- FALSE
|
||||||
|
par_axis_ticks_y <- TRUE
|
||||||
|
par_axis_text_y <- TRUE
|
||||||
|
par_axis_line_x <- TRUE
|
||||||
|
par_axis_ticks_x <- TRUE
|
||||||
|
par_axis_text_x <- TRUE
|
||||||
|
par_grid_major_y <- TRUE
|
||||||
|
par_grid_major_x <- FALSE
|
||||||
|
par_grid_minor_y <- TRUE
|
||||||
|
par_grid_minor_x <- FALSE
|
||||||
|
} else if (flip && !add_text) {
|
||||||
|
par_axis_text_font_face <- "plain"
|
||||||
|
par_axis_x <- TRUE
|
||||||
|
par_axis_y <- TRUE
|
||||||
|
par_axis_line_y <- TRUE
|
||||||
|
par_axis_ticks_y <- TRUE
|
||||||
|
par_axis_text_y <- TRUE
|
||||||
|
par_axis_line_x <- FALSE
|
||||||
|
par_axis_ticks_x <- TRUE
|
||||||
|
par_axis_text_x <- TRUE
|
||||||
|
par_grid_major_y <- FALSE
|
||||||
|
par_grid_major_x <- TRUE
|
||||||
|
par_grid_minor_y <- FALSE
|
||||||
|
par_grid_minor_x <- TRUE
|
||||||
|
} else if (!flip && add_text) {
|
||||||
|
par_axis_text_font_face <- "bold"
|
||||||
|
par_axis_x <- TRUE
|
||||||
|
par_axis_y <- TRUE
|
||||||
|
par_axis_line_y <- FALSE
|
||||||
|
par_axis_ticks_y <- FALSE
|
||||||
|
par_axis_text_y <- FALSE
|
||||||
|
par_axis_line_x <- FALSE
|
||||||
|
par_axis_ticks_x <- TRUE
|
||||||
|
par_axis_text_x <- TRUE
|
||||||
|
par_grid_major_y <- FALSE
|
||||||
|
par_grid_major_x <- FALSE
|
||||||
|
par_grid_minor_y <- FALSE
|
||||||
|
par_grid_minor_x <- FALSE
|
||||||
|
} else if (flip && add_text) {
|
||||||
|
par_axis_text_font_face <- "bold"
|
||||||
|
par_axis_x <- TRUE
|
||||||
|
par_axis_y <- TRUE
|
||||||
|
par_axis_line_y <- FALSE
|
||||||
|
par_axis_ticks_y <- TRUE
|
||||||
|
par_axis_text_y <- TRUE
|
||||||
|
par_axis_line_x <- FALSE
|
||||||
|
par_axis_ticks_x <- FALSE
|
||||||
|
par_axis_text_x <- FALSE
|
||||||
|
par_grid_major_y <- FALSE
|
||||||
|
par_grid_major_x <- FALSE
|
||||||
|
par_grid_minor_y <- FALSE
|
||||||
|
par_grid_minor_x <- FALSE
|
||||||
|
}
|
||||||
|
|
||||||
|
# Theme
|
||||||
|
t <- theme_default(
|
||||||
|
axis_text_font_face = par_axis_text_font_face,
|
||||||
|
axis_x = par_axis_x,
|
||||||
|
axis_y = par_axis_y,
|
||||||
|
grid_major_y = par_grid_major_y,
|
||||||
|
grid_major_x = par_grid_major_x,
|
||||||
|
grid_minor_y = par_grid_minor_y,
|
||||||
|
grid_minor_x = par_grid_minor_x,
|
||||||
|
axis_text_y = par_axis_text_y,
|
||||||
|
axis_line_y = par_axis_line_y,
|
||||||
|
axis_ticks_y = par_axis_ticks_y,
|
||||||
|
axis_text_x = par_axis_text_x,
|
||||||
|
axis_line_x = par_axis_line_x,
|
||||||
|
axis_ticks_x = par_axis_ticks_x,
|
||||||
|
axis_text_x_angle = axis_text_x_angle,
|
||||||
|
axis_text_x_vjust = axis_text_x_vjust,
|
||||||
|
axis_text_x_hjust = axis_text_x_hjust
|
||||||
|
)
|
||||||
|
|
||||||
|
return(t)
|
||||||
|
}
|
||||||
385
R/theme_default.R
Normal file
|
|
@ -0,0 +1,385 @@
|
||||||
|
#' ggplot2 theme wrapper with fonts and colors
|
||||||
|
#'
|
||||||
|
#' @param font_family The font family for all plot's texts. Default to "Segoe UI".
|
||||||
|
#' @param title_size The size of the title. Defaults to 12.
|
||||||
|
#' @param title_color Title color.
|
||||||
|
#' @param title_font_face Title font face. Default to "bold". Font face ("plain", "italic", "bold", "bold.italic").
|
||||||
|
#' @param title_hjust Title horizontal justification. Default to NULL. Use 0.5 to center the title.
|
||||||
|
#' @param title_font_family Title font family. Default to "Roboto Condensed".
|
||||||
|
#' @param text_size The size of all text other than the title, subtitle and caption. Defaults to 10.
|
||||||
|
#' @param text_color Text color.
|
||||||
|
#' @param text_font_face Text font face. Default to "bold". Font face ("plain", "italic", "bold", "bold.italic").
|
||||||
|
#' @param panel_background_color The color for the panel background color. Default to white.
|
||||||
|
#' @param panel_border Boolean. Plot a panel border? Default to FALSE.
|
||||||
|
#' @param panel_border_color A color. Default to REACH main grey.
|
||||||
|
#' @param legend_position Position of the legend; Default to "right". Can take "right", "left", "top", "bottom" or "none".
|
||||||
|
#' @param legend_direction Direction of the legend. Default to "vertical". Can take "vertical" or "horizontal".
|
||||||
|
#' @param legend_justification In addition to legend_direction, place the legend. Can take "left", "bottom", "center", "right", "top".
|
||||||
|
#' @param legend_title_size Legend title size.
|
||||||
|
#' @param legend_title_color Legend title color.
|
||||||
|
#' @param legend_title_font_face Legend title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
||||||
|
#' @param legend_text_size Legend text size.
|
||||||
|
#' @param legend_text_color Legend text color.
|
||||||
|
#' @param legend_text_font_face Legend text font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
||||||
|
#' @param legend_reverse Reverse the color in the guide? Default to TRUE.
|
||||||
|
#' @param title_size The size of the legend title. Defaults to 11.
|
||||||
|
#' @param title_color Legend title color.
|
||||||
|
#' @param title_font_face Legend title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
||||||
|
#' @param title_position_to_plot TRUE or FALSE. Positioning to plot or to panel?
|
||||||
|
#' @param axis_x Boolean. Do you need x-axis?
|
||||||
|
#' @param axis_y Boolean. Do you need y-axis?
|
||||||
|
#' @param axis_text_size Axis text size.
|
||||||
|
#' @param axis_text_color Axis text color.
|
||||||
|
#' @param axis_text_font_face Axis text font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
||||||
|
#' @param axis_text_x Boolean. Do you need the text for the x-axis?
|
||||||
|
#' @param axis_line_x Boolean. Do you need the line for the x-axis?
|
||||||
|
#' @param axis_ticks_x Boolean. Do you need the line for the x-axis?
|
||||||
|
#' @param axis_text_x_angle Angle for the x-axis text.
|
||||||
|
#' @param axis_text_x_vjust Vertical adjustment for the x-axis text.
|
||||||
|
#' @param axis_text_x_hjust Vertical adjustment for the x-axis text.
|
||||||
|
#' @param axis_text_y Boolean. Do you need the text for the y-axis?
|
||||||
|
#' @param axis_line_y Boolean. Do you need the line for the y-axis?
|
||||||
|
#' @param axis_ticks_y Boolean. Do you need the line for the y-axis?
|
||||||
|
#' @param axis_title_size Axis title size.
|
||||||
|
#' @param axis_title_color Axis title color.
|
||||||
|
#' @param axis_title_font_face Axis title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
||||||
|
#' @param grid_major_x Boolean. Do you need major grid lines for x-axis?
|
||||||
|
#' @param grid_major_y Boolean. Do you need major grid lines for y-axis?
|
||||||
|
#' @param grid_major_x_size Major X line size.
|
||||||
|
#' @param grid_major_y_size Major Y line size.
|
||||||
|
#' @param grid_major_color Major grid lines color.
|
||||||
|
#' @param grid_minor_x Boolean. Do you need minor grid lines for x-axis?
|
||||||
|
#' @param grid_minor_y Boolean. Do you need minor grid lines for y-axis?
|
||||||
|
#' @param grid_minor_x_size Minor X line size.
|
||||||
|
#' @param grid_minor_y_size Minor Y line size.
|
||||||
|
#' @param grid_minor_color Minor grid lines color.
|
||||||
|
#' @param caption_position_to_plot TRUE or FALSE. Positioning to plot or to panel?
|
||||||
|
#' @param ... Additional arguments passed to [ggplot2::theme()].
|
||||||
|
#'
|
||||||
|
#'
|
||||||
|
#' @description Give some reach colors and fonts to a ggplot.
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
theme_default <- function(
|
||||||
|
title_font_family = "Carlito",
|
||||||
|
title_size = 20,
|
||||||
|
title_color = color("dark_grey"),
|
||||||
|
title_font_face = "bold",
|
||||||
|
title_hjust = NULL,
|
||||||
|
title_position_to_plot = TRUE,
|
||||||
|
subtitle_font_family = "Carlito",
|
||||||
|
subtitle_size = 16,
|
||||||
|
subtitle_color = color("dark_grey"),
|
||||||
|
subtitle_font_face = "plain",
|
||||||
|
subtitle_hjust = NULL,
|
||||||
|
text_font_family = "Carlito",
|
||||||
|
text_size = 14,
|
||||||
|
text_color = color("dark_grey"),
|
||||||
|
text_font_face = "plain",
|
||||||
|
panel_background_color = "#FFFFFF",
|
||||||
|
panel_border = FALSE,
|
||||||
|
panel_border_color = color("dark_grey"),
|
||||||
|
legend_position = "top",
|
||||||
|
legend_direction = "horizontal",
|
||||||
|
legend_justification = "center",
|
||||||
|
legend_reverse = TRUE,
|
||||||
|
legend_title_size = 14,
|
||||||
|
legend_title_color = color("dark_grey"),
|
||||||
|
legend_title_font_face = "plain",
|
||||||
|
legend_title_font_family = "Carlito",
|
||||||
|
legend_text_size = 14,
|
||||||
|
legend_text_color = color("dark_grey"),
|
||||||
|
legend_text_font_face = "plain",
|
||||||
|
legend_text_font_family = "Carlito",
|
||||||
|
facet_size = 15,
|
||||||
|
facet_color = color("dark_grey"),
|
||||||
|
facet_font_face = "bold",
|
||||||
|
facet_font_family = "Carlito",
|
||||||
|
facet_bg_color = color("lighter_grey"),
|
||||||
|
axis_x = TRUE,
|
||||||
|
axis_y = TRUE,
|
||||||
|
axis_text_x = TRUE,
|
||||||
|
axis_line_x = FALSE,
|
||||||
|
axis_ticks_x = FALSE,
|
||||||
|
axis_text_y = TRUE,
|
||||||
|
axis_line_y = TRUE,
|
||||||
|
axis_ticks_y = TRUE,
|
||||||
|
axis_text_font_family = "Carlito",
|
||||||
|
axis_text_size = 14,
|
||||||
|
axis_text_color = color("dark_grey"),
|
||||||
|
axis_text_font_face = "plain",
|
||||||
|
axis_title_size = 15,
|
||||||
|
axis_title_color = color("dark_grey"),
|
||||||
|
axis_title_font_face = "plain",
|
||||||
|
axis_text_x_angle = 0,
|
||||||
|
axis_text_x_vjust = 0.5,
|
||||||
|
axis_text_x_hjust = 0.5,
|
||||||
|
grid_major_x = TRUE,
|
||||||
|
grid_major_y = FALSE,
|
||||||
|
grid_major_color = color("dark_grey"),
|
||||||
|
grid_major_x_size = 0.1,
|
||||||
|
grid_major_y_size = 0.1,
|
||||||
|
grid_minor_x = TRUE,
|
||||||
|
grid_minor_y = FALSE,
|
||||||
|
grid_minor_color = color("dark_grey"),
|
||||||
|
grid_minor_x_size = 0.05,
|
||||||
|
grid_minor_y_size = 0.05,
|
||||||
|
caption_font_family = "Carlito",
|
||||||
|
caption_font_face = "plain",
|
||||||
|
caption_position_to_plot = TRUE,
|
||||||
|
caption_size = 12,
|
||||||
|
caption_color = color("dark_grey"),
|
||||||
|
...
|
||||||
|
) {
|
||||||
|
# Basic simple theme
|
||||||
|
theme <- ggplot2::theme_minimal()
|
||||||
|
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
# # Text - design
|
||||||
|
text = ggplot2::element_text(
|
||||||
|
family = text_font_family,
|
||||||
|
color = text_color,
|
||||||
|
size = text_size,
|
||||||
|
face = text_font_face
|
||||||
|
),
|
||||||
|
# Default legend to right position
|
||||||
|
legend.position = legend_position,
|
||||||
|
# Defaut legend to vertical direction
|
||||||
|
legend.direction = legend_direction,
|
||||||
|
# Text sizes
|
||||||
|
axis.text = ggplot2::element_text(
|
||||||
|
size = axis_text_size,
|
||||||
|
family = axis_text_font_family,
|
||||||
|
face = axis_text_font_face,
|
||||||
|
color = axis_text_color
|
||||||
|
),
|
||||||
|
axis.title = ggplot2::element_text(
|
||||||
|
size = axis_title_size,
|
||||||
|
family = axis_text_font_family,
|
||||||
|
face = axis_title_font_face,
|
||||||
|
color = axis_title_color
|
||||||
|
),
|
||||||
|
# # Wrap title
|
||||||
|
plot.title = ggtext::element_textbox_simple(
|
||||||
|
hjust = title_hjust,
|
||||||
|
family = title_font_family,
|
||||||
|
color = title_color,
|
||||||
|
size = title_size,
|
||||||
|
face = title_font_face,
|
||||||
|
width = grid::unit(0.9, "npc"),
|
||||||
|
margin = ggplot2::margin(b = 10)
|
||||||
|
),
|
||||||
|
plot.subtitle = ggtext::element_textbox_simple(
|
||||||
|
hjust = title_hjust,
|
||||||
|
family = subtitle_font_family,
|
||||||
|
color = subtitle_color,
|
||||||
|
size = subtitle_size,
|
||||||
|
face = subtitle_font_face,
|
||||||
|
margin = ggplot2::margin(t = 5, b = 10)
|
||||||
|
),
|
||||||
|
plot.caption = ggtext::element_textbox_simple(
|
||||||
|
size = caption_size,
|
||||||
|
face = caption_font_face,
|
||||||
|
family = caption_font_family,
|
||||||
|
color = caption_color,
|
||||||
|
margin = ggplot2::margin(t = 10)
|
||||||
|
),
|
||||||
|
legend.title = ggplot2::element_text(
|
||||||
|
size = legend_title_size,
|
||||||
|
face = legend_title_font_face,
|
||||||
|
family = legend_title_font_family,
|
||||||
|
color = legend_title_color
|
||||||
|
),
|
||||||
|
legend.text = ggplot2::element_text(
|
||||||
|
size = legend_text_size,
|
||||||
|
face = legend_text_font_face,
|
||||||
|
family = legend_text_font_family,
|
||||||
|
color = legend_text_color
|
||||||
|
),
|
||||||
|
axis.text.x = ggplot2::element_text(
|
||||||
|
angle = axis_text_x_angle,
|
||||||
|
vjust = axis_text_x_vjust,
|
||||||
|
hjust = axis_text_x_hjust
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Position of title
|
||||||
|
if (title_position_to_plot) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
plot.title.position = "plot"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (caption_position_to_plot) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
plot.caption.position = "plot"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
# Position of caption
|
||||||
|
|
||||||
|
# Axis lines ?
|
||||||
|
if (axis_x & axis_y) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.line = ggplot2::element_line(color = text_color)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_x) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.line.x = ggplot2::element_blank(),
|
||||||
|
axis.ticks.x = ggplot2::element_blank(),
|
||||||
|
axis.text.x = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_y) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.line.y = ggplot2::element_blank(),
|
||||||
|
axis.ticks.y = ggplot2::element_blank(),
|
||||||
|
axis.text.y = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_line_x) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.line.x = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_ticks_x) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.ticks.x = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_text_x) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.text.x = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_line_y) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.line.y = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_ticks_y) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.ticks.y = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!axis_text_y) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
axis.text.y = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# X - major grid lines
|
||||||
|
if (!grid_major_x) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.major.x = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.major.x = ggplot2::element_line(
|
||||||
|
color = grid_major_color,
|
||||||
|
linewidth = grid_major_x_size
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Y - major grid lines
|
||||||
|
if (!grid_major_y) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.major.y = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.major.y = ggplot2::element_line(
|
||||||
|
color = grid_major_color,
|
||||||
|
linewidth = grid_major_y_size
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# X - minor grid lines
|
||||||
|
if (!grid_minor_x) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.minor.x = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.minor.x = ggplot2::element_line(
|
||||||
|
color = grid_minor_color,
|
||||||
|
linewidth = grid_minor_x_size
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Y - minor grid lines
|
||||||
|
if (!grid_minor_y) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.minor.y = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.grid.minor.y = ggplot2::element_line(
|
||||||
|
color = grid_minor_color,
|
||||||
|
linewidth = grid_minor_y_size
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if (!panel_border) {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.border = ggplot2::element_blank()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
panel.border = ggplot2::element_rect(color = panel_background_color)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add facet title text size
|
||||||
|
theme <- theme +
|
||||||
|
ggplot2::theme(
|
||||||
|
strip.text = ggplot2::element_text(
|
||||||
|
size = facet_size,
|
||||||
|
family = facet_font_family,
|
||||||
|
face = facet_font_face,
|
||||||
|
color = facet_color
|
||||||
|
),
|
||||||
|
strip.background = ggplot2::element_rect(
|
||||||
|
fill = facet_bg_color,
|
||||||
|
linewidth = 0
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Other parameters
|
||||||
|
theme <- theme + ggplot2::theme(...)
|
||||||
|
|
||||||
|
return(theme)
|
||||||
|
}
|
||||||
13
R/theme_dumbbell.R
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#' @title Dumbbell Theme
|
||||||
|
|
||||||
|
#' @description Theme for dumbbell charts based on theme_default.
|
||||||
|
#'
|
||||||
|
#' @rdname theme_default
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
theme_dumbbell <- function() {
|
||||||
|
theme_default(
|
||||||
|
axis_line_x = TRUE,
|
||||||
|
grid_
|
||||||
|
)
|
||||||
|
}
|
||||||
65
R/theme_lollipop.R
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
#' Custom Theme for Lollipop Charts
|
||||||
|
#'
|
||||||
|
#' @return A custom theme object.
|
||||||
|
#'
|
||||||
|
#' @rdname theme_default
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
theme_lollipop <- function(
|
||||||
|
flip = TRUE,
|
||||||
|
axis_text_x_angle = 0,
|
||||||
|
axis_text_x_vjust = 0.5,
|
||||||
|
axis_text_x_hjust = 0.5) {
|
||||||
|
# Set parameters based on flip
|
||||||
|
if (!flip) {
|
||||||
|
par_axis_text_font_face <- "plain"
|
||||||
|
par_axis_x <- TRUE
|
||||||
|
par_axis_y <- TRUE
|
||||||
|
par_axis_line_y <- FALSE
|
||||||
|
par_axis_ticks_y <- TRUE
|
||||||
|
par_axis_text_y <- TRUE
|
||||||
|
par_axis_line_x <- TRUE
|
||||||
|
par_axis_ticks_x <- TRUE
|
||||||
|
par_axis_text_x <- TRUE
|
||||||
|
par_grid_major_y <- TRUE
|
||||||
|
par_grid_major_x <- FALSE
|
||||||
|
par_grid_minor_y <- TRUE
|
||||||
|
par_grid_minor_x <- FALSE
|
||||||
|
} else if (flip) {
|
||||||
|
par_axis_text_font_face <- "plain"
|
||||||
|
par_axis_x <- TRUE
|
||||||
|
par_axis_y <- TRUE
|
||||||
|
par_axis_line_y <- TRUE
|
||||||
|
par_axis_ticks_y <- TRUE
|
||||||
|
par_axis_text_y <- TRUE
|
||||||
|
par_axis_line_x <- FALSE
|
||||||
|
par_axis_ticks_x <- TRUE
|
||||||
|
par_axis_text_x <- TRUE
|
||||||
|
par_grid_major_y <- FALSE
|
||||||
|
par_grid_major_x <- TRUE
|
||||||
|
par_grid_minor_y <- FALSE
|
||||||
|
par_grid_minor_x <- TRUE
|
||||||
|
}
|
||||||
|
|
||||||
|
# Theme
|
||||||
|
t <- theme_default(
|
||||||
|
axis_text_font_face = par_axis_text_font_face,
|
||||||
|
axis_x = par_axis_x,
|
||||||
|
axis_y = par_axis_y,
|
||||||
|
grid_major_y = par_grid_major_y,
|
||||||
|
grid_major_x = par_grid_major_x,
|
||||||
|
grid_minor_y = par_grid_minor_y,
|
||||||
|
grid_minor_x = par_grid_minor_x,
|
||||||
|
axis_text_y = par_axis_text_y,
|
||||||
|
axis_line_y = par_axis_line_y,
|
||||||
|
axis_ticks_y = par_axis_ticks_y,
|
||||||
|
axis_text_x = par_axis_text_x,
|
||||||
|
axis_line_x = par_axis_line_x,
|
||||||
|
axis_ticks_x = par_axis_ticks_x,
|
||||||
|
axis_text_x_angle = axis_text_x_angle,
|
||||||
|
axis_text_x_vjust = axis_text_x_vjust,
|
||||||
|
axis_text_x_hjust = axis_text_x_hjust
|
||||||
|
)
|
||||||
|
|
||||||
|
return(t)
|
||||||
|
}
|
||||||
31
R/theme_point.R
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
#' Custom Theme for Point Charts
|
||||||
|
#'
|
||||||
|
#' @param flip Logical. Whether the plot is flipped (horizontal).
|
||||||
|
#' @param axis_text_x_angle Angle for x-axis text.
|
||||||
|
#' @param axis_text_x_vjust Vertical justification for x-axis text.
|
||||||
|
#' @param axis_text_x_hjust Horizontal justification for x-axis text.
|
||||||
|
#'
|
||||||
|
#' @rdname theme_default
|
||||||
|
#'
|
||||||
|
#' @return A custom theme object.
|
||||||
|
#'
|
||||||
|
#' @export
|
||||||
|
theme_point <- function() {
|
||||||
|
t <- theme_default(
|
||||||
|
axis_text_font_face = "plain",
|
||||||
|
axis_x = TRUE,
|
||||||
|
axis_y = TRUE,
|
||||||
|
grid_major_y = TRUE,
|
||||||
|
grid_major_x = TRUE,
|
||||||
|
grid_minor_y = FALSE,
|
||||||
|
grid_minor_x = FALSE,
|
||||||
|
axis_text_x = TRUE,
|
||||||
|
axis_line_x = TRUE,
|
||||||
|
axis_ticks_x = TRUE,
|
||||||
|
axis_text_x_angle = 0,
|
||||||
|
axis_text_x_vjust = 0.5,
|
||||||
|
axis_text_x_hjust = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
return(t)
|
||||||
|
}
|
||||||
290
R/theme_reach.R
|
|
@ -1,290 +0,0 @@
|
||||||
#' @title ggplot2 theme with REACH color palettes
|
|
||||||
#'
|
|
||||||
#' @param initiative Either "reach" or "default".
|
|
||||||
#' @param palette Palette name from 'pal_reach()'.
|
|
||||||
#' @param discrete Boolean indicating whether color aesthetic is discrete or not.
|
|
||||||
#' @param reverse Boolean indicating whether the palette should be reversed.
|
|
||||||
#' @param font_family The font family for all plot's texts. Default to "Segoe UI".
|
|
||||||
#' @param title_size The size of the title. Defaults to 12.
|
|
||||||
#' @param title_color Title color.
|
|
||||||
#' @param title_font_face Title font face. Default to "bold". Font face ("plain", "italic", "bold", "bold.italic").
|
|
||||||
#' @param title_hjust Title horizontal justification. Default to NULL. Use 0.5 to center the title.
|
|
||||||
#' @param text_size The size of all text other than the title, subtitle and caption. Defaults to 10.
|
|
||||||
#' @param text_color Text color.
|
|
||||||
#' @param text_font_face Text font face. Default to "bold". Font face ("plain", "italic", "bold", "bold.italic").
|
|
||||||
#' @param panel_background_color The color for the panel background color. Default to white.
|
|
||||||
#' @param panel_border Boolean. Plot a panel border? Default to FALSE.
|
|
||||||
#' @param panel_border_color A color. Default to REACH main grey.
|
|
||||||
#' @param legend_position Position of the legend; Default to "right". Can take "right", "left", "top", "bottom" or "none".
|
|
||||||
#' @param legend_direction Direction of the legend. Default to "vertical". Can take "vertical" or "horizontal".
|
|
||||||
#' @param legend_title_size Legend title size.
|
|
||||||
#' @param legend_title_color Legend title color.
|
|
||||||
#' @param legend_title_font_face Legend title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
|
||||||
#' @param legend_text_size Legend text size.
|
|
||||||
#' @param legend_text_color Legend text color.
|
|
||||||
#' @param legend_text_font_face Legend text font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
|
||||||
#' @param legend_reverse Reverse the color in the guide? Default to TRUE.
|
|
||||||
#' @param title_size The size of the legend title. Defaults to 11.
|
|
||||||
#' @param title_color Legend title color.
|
|
||||||
#' @param title_font_face Legend title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
|
||||||
#' @param title_position_to_plot TRUE or FALSE. Positioning to plot or to panel?
|
|
||||||
#' @param axis_x Boolean. Do you need x-axis?
|
|
||||||
#' @param axis_y Boolean. Do you need y-axis?
|
|
||||||
#' @param axis_text_size Axis text size.
|
|
||||||
#' @param axis_text_color Axis text color.
|
|
||||||
#' @param axis_text_font_face Axis text font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
|
||||||
#' @param axis_text_x_angle Angle for the x-axis text.
|
|
||||||
#' @param axis_text_x_vjust Vertical adjustment for the x-axis text.
|
|
||||||
#' @param axis_text_x_hjust Vertical adjustment for the x-axis text.
|
|
||||||
#' @param axis_title_size Axis title size.
|
|
||||||
#' @param axis_title_color Axis title color.
|
|
||||||
#' @param axis_title_font_face Axis title font face. Default to "plain". Font face ("plain", "italic", "bold", "bold.italic").
|
|
||||||
#' @param grid_major_x Boolean. Do you need major grid lines for x-axis?
|
|
||||||
#' @param grid_major_y Boolean. Do you need major grid lines for y-axis?
|
|
||||||
#' @param grid_major_x_size Major X line size.
|
|
||||||
#' @param grid_major_y_size Major Y line size.
|
|
||||||
#' @param grid_major_color Major grid lines color.
|
|
||||||
#' @param grid_minor_x Boolean. Do you need minor grid lines for x-axis?
|
|
||||||
#' @param grid_minor_y Boolean. Do you need minor grid lines for y-axis?
|
|
||||||
#' @param grid_minor_x_size Minor X line size.
|
|
||||||
#' @param grid_minor_y_size Minor Y line size.
|
|
||||||
#' @param grid_minor_color Minor grid lines color.
|
|
||||||
#' @param caption_position_to_plot TRUE or FALSE. Positioning to plot or to panel?
|
|
||||||
#' @param ... Additional arguments passed to `ggplot2::gg_theme()`.
|
|
||||||
#'
|
|
||||||
#'
|
|
||||||
#' @description Give some reach colors and fonts to a ggplot.
|
|
||||||
#'
|
|
||||||
#' @return The base REACH theme
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
theme_reach <- function(
|
|
||||||
initiative = "reach",
|
|
||||||
palette = "main",
|
|
||||||
discrete = TRUE,
|
|
||||||
reverse = FALSE,
|
|
||||||
font_family = "Segoe UI",
|
|
||||||
title_size = 12,
|
|
||||||
title_color = cols_reach("main_grey"),
|
|
||||||
title_font_face = "bold",
|
|
||||||
title_hjust = NULL,
|
|
||||||
title_position_to_plot = TRUE,
|
|
||||||
text_size = 10,
|
|
||||||
text_color = cols_reach("main_grey"),
|
|
||||||
text_font_face = "plain",
|
|
||||||
panel_background_color = "#FFFFFF",
|
|
||||||
panel_border = FALSE,
|
|
||||||
panel_border_color = cols_reach("main_grey"),
|
|
||||||
legend_position = "right",
|
|
||||||
legend_direction = "vertical",
|
|
||||||
legend_reverse = TRUE,
|
|
||||||
legend_title_size = 11,
|
|
||||||
legend_title_color = cols_reach("main_grey"),
|
|
||||||
legend_title_font_face = "plain",
|
|
||||||
legend_text_size = 10,
|
|
||||||
legend_text_color = cols_reach("main_grey"),
|
|
||||||
legend_text_font_face = "plain",
|
|
||||||
axis_x = TRUE,
|
|
||||||
axis_y = TRUE,
|
|
||||||
axis_text_size = 10,
|
|
||||||
axis_text_color = cols_reach("main_grey"),
|
|
||||||
axis_text_font_face = "plain",
|
|
||||||
axis_title_size = 11,
|
|
||||||
axis_title_color = cols_reach("main_grey"),
|
|
||||||
axis_title_font_face = "bold",
|
|
||||||
axis_text_x_angle = 0,
|
|
||||||
axis_text_x_vjust = 0.5,
|
|
||||||
axis_text_x_hjust = 0.5,
|
|
||||||
grid_major_x = FALSE,
|
|
||||||
grid_major_y = FALSE,
|
|
||||||
grid_major_color = cols_reach("main_lt_grey"),
|
|
||||||
grid_major_x_size = 0.1,
|
|
||||||
grid_major_y_size = 0.1,
|
|
||||||
grid_minor_x = FALSE,
|
|
||||||
grid_minor_y = FALSE,
|
|
||||||
grid_minor_color = cols_reach("main_lt_grey"),
|
|
||||||
grid_minor_x_size = 0.05,
|
|
||||||
grid_minor_y_size = 0.05,
|
|
||||||
caption_position_to_plot = TRUE,
|
|
||||||
...
|
|
||||||
) {
|
|
||||||
|
|
||||||
# To do :
|
|
||||||
# - add facet theming
|
|
||||||
|
|
||||||
if (!initiative %in% c("reach", "default"))
|
|
||||||
rlang::abort(
|
|
||||||
c(
|
|
||||||
paste0("There is no initiative '", initiative, " to be used with theme_reach()."),
|
|
||||||
"i" = paste0("initiative should be either 'reach' or 'default'")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Basic simple theme
|
|
||||||
# theme_reach <- ggplot2::theme_bw()
|
|
||||||
|
|
||||||
theme_reach <- ggplot2::theme(
|
|
||||||
# Title - design
|
|
||||||
title = ggplot2::element_text(
|
|
||||||
family = font_family,
|
|
||||||
color = title_color,
|
|
||||||
size = title_size,
|
|
||||||
face = title_font_face
|
|
||||||
),
|
|
||||||
# Text - design
|
|
||||||
text = ggplot2::element_text(
|
|
||||||
family = font_family,
|
|
||||||
color = text_color,
|
|
||||||
size = text_size,
|
|
||||||
face = text_font_face
|
|
||||||
),
|
|
||||||
# Default legend to right position
|
|
||||||
legend.position = legend_position,
|
|
||||||
# Defaut legend to vertical direction
|
|
||||||
legend.direction = legend_direction,
|
|
||||||
# set panel background color
|
|
||||||
panel.background = ggplot2::element_rect(
|
|
||||||
fill = panel_background_color
|
|
||||||
),
|
|
||||||
# Remove background for legend key
|
|
||||||
legend.key = ggplot2::element_blank(),
|
|
||||||
# Text sizes
|
|
||||||
axis.text = ggplot2::element_text(
|
|
||||||
size = axis_text_size,
|
|
||||||
family = font_family,
|
|
||||||
face = axis_text_font_face,
|
|
||||||
color = axis_text_color
|
|
||||||
),
|
|
||||||
axis.title = ggplot2::element_text(
|
|
||||||
size = axis_title_size,
|
|
||||||
family = font_family,
|
|
||||||
face = axis_title_font_face,
|
|
||||||
color = axis_title_color),
|
|
||||||
# Wrap title
|
|
||||||
plot.title = ggtext::element_textbox(
|
|
||||||
hjust = title_hjust
|
|
||||||
),
|
|
||||||
plot.subtitle = ggtext::element_textbox(
|
|
||||||
hjust = title_hjust
|
|
||||||
),
|
|
||||||
plot.caption = ggtext::element_textbox(),
|
|
||||||
legend.title = ggplot2::element_text(
|
|
||||||
size = legend_title_size,
|
|
||||||
face = legend_title_font_face,
|
|
||||||
family = font_family,
|
|
||||||
color = legend_title_color),
|
|
||||||
legend.text = ggplot2::element_text(
|
|
||||||
size = legend_text_size,
|
|
||||||
face = legend_text_font_face,
|
|
||||||
family = font_family,
|
|
||||||
color = legend_text_color
|
|
||||||
),
|
|
||||||
axis.text.x = ggplot2::element_text(
|
|
||||||
angle = axis_text_x_angle,
|
|
||||||
vjust = axis_text_x_vjust,
|
|
||||||
hjust = axis_text_x_hjust
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Position of title
|
|
||||||
if (title_position_to_plot) theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
plot.title.position = "plot"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (caption_position_to_plot) theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
plot.caption.position = "plot"
|
|
||||||
)
|
|
||||||
# Position of caption
|
|
||||||
|
|
||||||
# Axis lines ?
|
|
||||||
if (axis_x & axis_y) {
|
|
||||||
theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
axis.line = ggplot2::element_line(color = text_color))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!axis_x) {
|
|
||||||
theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
axis.line.x = ggplot2::element_blank(),
|
|
||||||
axis.ticks.x = ggplot2::element_blank(),
|
|
||||||
axis.text.x = ggplot2::element_blank())
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!axis_y) {
|
|
||||||
theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
axis.line.y = ggplot2::element_blank(),
|
|
||||||
axis.ticks.y = ggplot2::element_blank(),
|
|
||||||
axis.text.y = ggplot2::element_blank())
|
|
||||||
}
|
|
||||||
|
|
||||||
# X - major grid lines
|
|
||||||
if (!grid_major_x) theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.major.x = ggplot2::element_blank()
|
|
||||||
) else theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.major.x = ggplot2::element_line(
|
|
||||||
color = grid_major_color,
|
|
||||||
linewidth = grid_major_x_size)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Y - major grid lines
|
|
||||||
if (!grid_major_y) theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.major.y = ggplot2::element_blank()
|
|
||||||
) else theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.major.y = ggplot2::element_line(
|
|
||||||
color = grid_major_color,
|
|
||||||
linewidth = grid_major_y_size)
|
|
||||||
)
|
|
||||||
|
|
||||||
# X - minor grid lines
|
|
||||||
if (!grid_minor_x) theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.minor.x = ggplot2::element_blank()
|
|
||||||
) else theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.minor.x = ggplot2::element_line(
|
|
||||||
color = grid_minor_color,
|
|
||||||
linewidth = grid_minor_x_size)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Y - minor grid lines
|
|
||||||
if (!grid_minor_y) theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.minor.y = ggplot2::element_blank()
|
|
||||||
) else theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.grid.minor.y = ggplot2::element_line(
|
|
||||||
color = grid_minor_color,
|
|
||||||
linewidth = grid_minor_y_size)
|
|
||||||
)
|
|
||||||
if (!panel_border) theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.border = ggplot2::element_blank()
|
|
||||||
) else theme_reach <- theme_reach +
|
|
||||||
ggplot2::theme(
|
|
||||||
panel.border = ggplot2::element_rect(color = panel_background_color)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# Other parameters
|
|
||||||
theme_reach <- theme_reach + ggplot2::theme(...)
|
|
||||||
|
|
||||||
# Add reach color palettes by default
|
|
||||||
# (reversed guide is defaulted to TRUE for natural reading)
|
|
||||||
theme_reach <- list(
|
|
||||||
theme_reach,
|
|
||||||
scale_color(initiative = initiative, palette = palette, discrete = discrete, reverse = reverse, reverse_guide = legend_reverse),
|
|
||||||
scale_fill(initiative = initiative, palette = palette, discrete = discrete, reverse = reverse, reverse_guide = legend_reverse)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
return(theme_reach)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -2,6 +2,5 @@
|
||||||
"_PACKAGE"
|
"_PACKAGE"
|
||||||
|
|
||||||
## usethis namespace: start
|
## usethis namespace: start
|
||||||
#' @importFrom rlang :=
|
|
||||||
## usethis namespace: end
|
## usethis namespace: end
|
||||||
NULL
|
NULL
|
||||||
|
|
|
||||||
74
R/waffle.R
|
|
@ -1,74 +0,0 @@
|
||||||
#' @title Simple waffle chart
|
|
||||||
#'
|
|
||||||
#' @param df A data frame.
|
|
||||||
#' @param x A character column or coercible as a character column. Will give the waffle's fill color.
|
|
||||||
#' @param y A numeric column (if plotting proportion, make sure to have percentages between 0 and 100 and not 0 and 1).
|
|
||||||
#' @param n_rows Number of rows. Default to 10.
|
|
||||||
#' @param size Width of the separator between blocks (defaults to 2).
|
|
||||||
#' @param x_title The x scale title. Default to NULL.
|
|
||||||
#' @param x_lab The x scale caption. Default to NULL.
|
|
||||||
#' @param title Plot title. Default to NULL.
|
|
||||||
#' @param subtitle Plot subtitle. Default to NULL.
|
|
||||||
#' @param caption Plot caption. Default to NULL.
|
|
||||||
#' @param arrange TRUE or FALSE. Arrange by highest percentage first.
|
|
||||||
#' @param theme Whatever theme. Default to theme_reach().
|
|
||||||
#'
|
|
||||||
#' @return A waffle chart
|
|
||||||
#'
|
|
||||||
#' @export
|
|
||||||
waffle <- function(df,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
n_rows = 10,
|
|
||||||
size = 2,
|
|
||||||
x_title = NULL,
|
|
||||||
x_lab = NULL,
|
|
||||||
title = NULL,
|
|
||||||
subtitle = NULL,
|
|
||||||
caption = NULL,
|
|
||||||
arrange = TRUE,
|
|
||||||
theme = theme_reach(
|
|
||||||
axis_x = FALSE,
|
|
||||||
axis_y = FALSE,
|
|
||||||
legend_position = "bottom",
|
|
||||||
legend_direction = "horizontal",
|
|
||||||
title_hjust = 0.5)){
|
|
||||||
|
|
||||||
# A basic and not robust check
|
|
||||||
# - add check between 0 and 1
|
|
||||||
|
|
||||||
# Arrange by biggest prop first ?
|
|
||||||
if (arrange) df <- dplyr::arrange(
|
|
||||||
df,
|
|
||||||
dplyr::desc({{ y }})
|
|
||||||
)
|
|
||||||
|
|
||||||
# Mutate to 100
|
|
||||||
# df <- dplyr::mutate(df, "{{y}}" := {{ y }} * 100)
|
|
||||||
|
|
||||||
# Prepare named vector
|
|
||||||
values <- stats::setNames(dplyr::pull(df, {{ y }}), dplyr::pull(df, {{ x }}))
|
|
||||||
|
|
||||||
# Make plot
|
|
||||||
g <- waffle::waffle(values, xlab = x_lab, rows = n_rows, size = size)
|
|
||||||
|
|
||||||
# Add title, subtitle, caption, x_title, y_title
|
|
||||||
g <- g + ggplot2::labs(
|
|
||||||
title = title,
|
|
||||||
subtitle = subtitle,
|
|
||||||
caption = caption,
|
|
||||||
fill = x_title,
|
|
||||||
color = x_title
|
|
||||||
)
|
|
||||||
|
|
||||||
# Basic theme
|
|
||||||
# g <- g +
|
|
||||||
# hrbrthemes::theme_ipsum() #+
|
|
||||||
# waffle::theme_enhance_waffle()
|
|
||||||
|
|
||||||
# Add theme
|
|
||||||
g <- g + theme
|
|
||||||
|
|
||||||
return(g)
|
|
||||||
|
|
||||||
}
|
|
||||||
315
README.Rmd
|
|
@ -16,20 +16,19 @@ knitr::opts_chunk$set(
|
||||||
dev.args = list(type = "cairo")
|
dev.args = list(type = "cairo")
|
||||||
)
|
)
|
||||||
|
|
||||||
desc = read.dcf('DESCRIPTION')
|
desc <- read.dcf("DESCRIPTION")
|
||||||
desc = setNames(as.list(desc), colnames(desc))
|
desc <- setNames(as.list(desc), colnames(desc))
|
||||||
```
|
```
|
||||||
|
|
||||||
# `r desc$Package` <img src="man/figures/logo.png" align="right" alt="" width="120"/>
|
# `r desc$Package` <img src="man/figures/logo.png" align="right" width="120"/>
|
||||||
|
|
||||||
> `r desc$Title`
|
> `r desc$Title`
|
||||||
|
|
||||||
`visualizeR` proposes some utils to get REACH and AGORA colors, ready-to-go color palettes, and a few visualization functions (horizontal hist graph for instance).
|
`visualizeR` proposes some utils to sane colors, ready-to-go color palettes, and a few visualization functions.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
You can install the last version of visualizeR from
|
You can install the last version of visualizeR from [GitHub](https://github.com/) with:
|
||||||
[GitHub](https://github.com/) with:
|
|
||||||
|
|
||||||
```{r, eval = FALSE}
|
```{r, eval = FALSE}
|
||||||
# install.packages("devtools")
|
# install.packages("devtools")
|
||||||
|
|
@ -40,42 +39,39 @@ devtools::install_github("gnoblet/visualizeR", build_vignettes = TRUE)
|
||||||
|
|
||||||
Roadmap is as follows:
|
Roadmap is as follows:
|
||||||
|
|
||||||
- [X] Add IMPACT's colors
|
- [ ] Full revamp of core functions (colors, pattern, incl. adding test and pre-commit structures)
|
||||||
- [X] Add all color palettes from the internal documentation
|
- [ ] Add other types of plots:
|
||||||
- [ ] There remains to be added more-than-7-color palettes and black color palettes
|
- [ ] Dumbell
|
||||||
- [X] Add new types of visualization (e.g. dumbbell plot, lollipop plot, etc.)
|
- [ ] Waffle
|
||||||
- [X] Use examples
|
- [ ] Donut
|
||||||
- [ ] Add some ease-map functions
|
- [ ] Alluvial
|
||||||
- [ ] Add some interactive functions (maps and graphs)
|
|
||||||
- [ ] Consolidate and make errors transparent
|
|
||||||
|
|
||||||
## Request
|
## Request
|
||||||
|
|
||||||
Please, do not hesitate to pull request any new viz or colors or color palettes, or to email request any change (guillaume.noblet@reach-initiative.org or gnoblet@zaclys.net).
|
Please, do not hesitate to pull request any new viz or colors or color palettes, or to email request any change ([gnoblet\@zaclys.net](mailto:gnoblet@zaclys.net){.email}).
|
||||||
|
|
||||||
## Colors
|
## Colors
|
||||||
|
|
||||||
Color palettes for REACH, AGORA and IMPACT are available. Functions to access colors and palettes are `cols_initiative()` or `pal_initiative()`. For now, the initiative with the most colors and color palettes is REACH. Feel free to pull requests new AGORA and IMPACT colors.
|
Functions to access colors and palettes are `color()` or `palette()`. Feel free to pull request new colors.
|
||||||
|
|
||||||
```{r example-colors, eval = TRUE}
|
```{r example-colors, eval = TRUE}
|
||||||
library(visualizeR)
|
library(visualizeR)
|
||||||
|
|
||||||
# Get all saved REACH colors, named
|
# Get all saved colors, named
|
||||||
cols_reach(unnamed = F)[1:10]
|
color(unname = F)[1:10]
|
||||||
|
|
||||||
# Extract a color palette as hexadecimal codes and reversed
|
# Extract a color palette as hexadecimal codes and reversed
|
||||||
pal_reach(palette = "main", reversed = TRUE, color_ramp_palette = FALSE)
|
palette(palette = "cat_5_main", reversed = TRUE, color_ramp_palette = FALSE)
|
||||||
|
|
||||||
# Get all color palettes names
|
# Get all color palettes names
|
||||||
pal_reach(show_palettes = T)
|
palette(show_palettes = TRUE)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Charts
|
## Charts
|
||||||
|
|
||||||
### Example 1: Bar chart, already REACH themed
|
### Example 1: Bar chart
|
||||||
|
|
||||||
```{r example-bar-chart, out.width = "65%", eval = TRUE}
|
```{r example-bar-chart, out.width = '65%', eval = TRUE}
|
||||||
library(visualizeR)
|
|
||||||
library(palmerpenguins)
|
library(palmerpenguins)
|
||||||
library(dplyr)
|
library(dplyr)
|
||||||
|
|
||||||
|
|
@ -83,42 +79,49 @@ df <- penguins |>
|
||||||
group_by(island, species) |>
|
group_by(island, species) |>
|
||||||
summarize(
|
summarize(
|
||||||
mean_bl = mean(bill_length_mm, na.rm = T),
|
mean_bl = mean(bill_length_mm, na.rm = T),
|
||||||
mean_fl = mean(flipper_length_mm, na.rm = T)) |>
|
mean_fl = mean(flipper_length_mm, na.rm = T)
|
||||||
|
) |>
|
||||||
|
ungroup()
|
||||||
|
|
||||||
|
df_island <- penguins |>
|
||||||
|
group_by(island) |>
|
||||||
|
summarize(
|
||||||
|
mean_bl = mean(bill_length_mm, na.rm = T),
|
||||||
|
mean_fl = mean(flipper_length_mm, na.rm = T)
|
||||||
|
) |>
|
||||||
ungroup()
|
ungroup()
|
||||||
|
|
||||||
# Simple bar chart by group with some alpha transparency
|
# Simple bar chart by group with some alpha transparency
|
||||||
bar(df, island, mean_bl, species, percent = FALSE, alpha = 0.6, x_title = "Mean of bill length")
|
bar(df, "island", "mean_bl", "species", x_title = "Mean of bill length", title = "Mean of bill length by island and species")
|
||||||
|
|
||||||
# Using another color palette through `theme_reach()` and changing scale to percent
|
# Flipped / Horizontal
|
||||||
bar(df, island,mean_bl, species, percent = TRUE, theme = theme_reach(palette = "artichoke_3"))
|
hbar(df, "island", "mean_bl", "species", x_title = "Mean of bill length", title = "Mean of bill length by island and species")
|
||||||
|
|
||||||
# Not flipped, with text added, group_title, no y-axis and no bold for legend
|
# Facetted
|
||||||
bar(df, island, mean_bl, species, group_title = "Species", flip = FALSE, add_text = TRUE, add_text_suffix = "%", percent = FALSE, theme = theme_reach(text_font_face = "plain", axis_y = FALSE))
|
bar(df, "island", "mean_bl", facet = "species", x_title = "Mean of bill length", title = "Mean of bill length by island and species", add_color_guide = FALSE)
|
||||||
|
|
||||||
|
# Flipped, with text, smaller width, and caption
|
||||||
|
hbar(df = df_island, x = "island", y = "mean_bl", title = "Mean of bill length by island", add_text = T, width = 0.6, add_text_suffix = "mm", add_text_expand_limit = 1.3, add_color_guide = FALSE, caption = "Data: palmerpenguins package.")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example 2: Point chart, already REACH themed
|
### Example 2: Scatterplot
|
||||||
|
|
||||||
At this stage, `point_reach()` only supports categorical grouping colors with the `group` arg.
|
```{r example-point-chart, out.width = '65%', eval = TRUE}
|
||||||
|
# Simple scatterplot
|
||||||
|
point(penguins, "bill_length_mm", "flipper_length_mm")
|
||||||
|
|
||||||
```{r example-point-chart, out.width = "65%", eval = TRUE}
|
# Scatterplot with grouping colors, greater dot size, some transparency
|
||||||
|
point(penguins, "bill_length_mm", "flipper_length_mm", "island", group_title = "Island", alpha = 0.6, size = 3, title = "Bill vs. flipper length", , add_color_guide = FALSE)
|
||||||
|
|
||||||
# Simple point chart
|
# Facetted scatterplot by island
|
||||||
point(penguins, bill_length_mm, flipper_length_mm)
|
point(penguins, "bill_length_mm", "flipper_length_mm", "species", "island", "fixed", group_title = "Species", title = "Bill vs. flipper length by species and island", add_color_guide = FALSE)
|
||||||
|
|
||||||
# Point chart with grouping colors, greater dot size, some transparency, reversed color palette
|
|
||||||
point(penguins, bill_length_mm, flipper_length_mm, island, alpha = 0.6, size = 3, theme = theme_reach(reverse = TRUE))
|
|
||||||
|
|
||||||
# Using another color palettes
|
|
||||||
point(penguins, bill_length_mm, flipper_length_mm, island, size = 1.5, x_title = "Bill", y_title = "Flipper", title = "Length (mm)", theme = theme_reach(palette = "artichoke_3", text_font_face = , grid_major_x = TRUE, title_position_to_plot = FALSE))
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Example 3: Dumbbell plot
|
||||||
### Example 3: Dumbbell plot, REACH themed
|
|
||||||
|
|
||||||
Remember to ensure that your data are in the long format and you only have two groups on the x-axis; for instance, IDP and returnee and no NA values.
|
Remember to ensure that your data are in the long format and you only have two groups on the x-axis; for instance, IDP and returnee and no NA values.
|
||||||
|
|
||||||
```{r example-dumbbell-plot, out.width = "65%", eval = TRUE}
|
```{r example-dumbbell-plot, out.width = '65%', eval = TRUE}
|
||||||
# Prepare long data
|
# Prepare long data
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
admin1 = rep(letters[1:8], 2),
|
admin1 = rep(letters[1:8], 2),
|
||||||
|
|
@ -127,31 +130,23 @@ df <- tibble::tibble(
|
||||||
) |>
|
) |>
|
||||||
dplyr::mutate(stat = round(stat, 0))
|
dplyr::mutate(stat = round(stat, 0))
|
||||||
|
|
||||||
# Example, adding a parameter to `theme_reach()` passed on `ggplot2::theme()` to align legend title
|
|
||||||
|
|
||||||
dumbbell(df,
|
|
||||||
stat,
|
|
||||||
setting,
|
# dumbbell(
|
||||||
admin1,
|
# df,
|
||||||
title = "% of HHs that reported open defecation as sanitation facility",
|
# 'stat',
|
||||||
group_y_title = "Admin 1",
|
# 'setting',
|
||||||
group_x_title = "Setting",
|
# 'admin1',
|
||||||
theme = theme_reach(legend_position = "bottom",
|
# title = '% of HHs that reported open defecation as sanitation facility',
|
||||||
legend_direction = "horizontal",
|
# group_y_title = 'Admin 1',
|
||||||
legend_title_font_face = "bold",
|
# group_x_title = 'Setting'
|
||||||
palette = "primary",
|
# )
|
||||||
title_position_to_plot = FALSE,
|
|
||||||
legend.title.align = 0.5)) +
|
|
||||||
# Change legend title position (could be included as part of the function)
|
|
||||||
ggplot2::guides(
|
|
||||||
color = ggplot2::guide_legend(title.position = "left"),
|
|
||||||
fill = ggplot2::guide_legend(title.position = "left")
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example 4: donut chart, REACH themed (to used once, not twice)
|
### Example 4: donut chart
|
||||||
```{r example-donut-plot, out.width = "65%", warning = FALSE}
|
|
||||||
|
|
||||||
|
```{r example-donut-plot, out.width = '65%', warning = FALSE}
|
||||||
# Some summarized data: % of HHs by displacement status
|
# Some summarized data: % of HHs by displacement status
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
status = c("Displaced", "Non displaced", "Returnee", "Don't know/Prefer not to say"),
|
status = c("Displaced", "Non displaced", "Returnee", "Don't know/Prefer not to say"),
|
||||||
|
|
@ -159,136 +154,138 @@ df <- tibble::tibble(
|
||||||
)
|
)
|
||||||
|
|
||||||
# Donut
|
# Donut
|
||||||
donut(df,
|
# donut(df,
|
||||||
status,
|
# status,
|
||||||
percentage,
|
# percentage,
|
||||||
hole_size = 3,
|
# hole_size = 3,
|
||||||
add_text_suffix = "%",
|
# add_text_suffix = '%',
|
||||||
add_text_color = cols_reach("dk_grey"),
|
# add_text_color = color('dark_grey'),
|
||||||
add_text_treshold_display = 5,
|
# add_text_treshold_display = 5,
|
||||||
x_title = "Displacement status",
|
# x_title = 'Displacement status',
|
||||||
title = "% of HHs by displacement status",
|
# title = '% of HHs by displacement status'
|
||||||
theme = theme_reach(legend_reverse = TRUE))
|
# )
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Example 5: Waffle chart
|
||||||
|
|
||||||
### Example 5: waffle chart
|
```{r example-waffle-plot, out.width = '65%', warning = FALSE}
|
||||||
```{r example-waffle-plot, out.width = "65%", warning = FALSE}
|
|
||||||
#
|
#
|
||||||
waffle(df, status, percentage, x_title = "A caption", title = "A title", subtitle = "A subtitle")
|
# waffle(df, status, percentage, x_title = 'A caption', title = 'A title', subtitle = 'A subtitle')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Example 6: Alluvial chart
|
||||||
|
|
||||||
### Example 6: alluvial chart, REACH themed
|
```{r example-alluvial-plot, out.width = '65%', warning = FALSE}
|
||||||
```{r example-alluvial-plot, out.width = "65%", warning = FALSE}
|
|
||||||
|
|
||||||
# Some summarized data: % of HHs by self-reported status of displacement in 2021 and in 2022
|
# Some summarized data: % of HHs by self-reported status of displacement in 2021 and in 2022
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
status_from = c(rep("Displaced", 4),
|
status_from = c(
|
||||||
|
rep("Displaced", 4),
|
||||||
rep("Non displaced", 4),
|
rep("Non displaced", 4),
|
||||||
rep("Returnee", 4),
|
rep("Returnee", 4),
|
||||||
rep("Dnk/Pnts", 4)),
|
rep("Dnk/Pnts", 4)
|
||||||
|
),
|
||||||
status_to = c("Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts"),
|
status_to = c("Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts"),
|
||||||
percentage = c(20, 8, 18, 1, 12, 21, 0, 2, 0, 3, 12, 1, 0, 0, 1, 1)
|
percentage = c(20, 8, 18, 1, 12, 21, 0, 2, 0, 3, 12, 1, 0, 0, 1, 1)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Alluvial, here the group is the status for 2021
|
# Alluvial, here the group is the status for 2021
|
||||||
|
|
||||||
alluvial(df,
|
# alluvial(df,
|
||||||
status_from,
|
# status_from,
|
||||||
status_to,
|
# status_to,
|
||||||
percentage,
|
# percentage,
|
||||||
status_from,
|
# status_from,
|
||||||
from_levels = c("Displaced", "Non displaced", "Returnee", "Dnk/Pnts"),
|
# from_levels = c("Displaced", "Non displaced", "Returnee", "Dnk/Pnts"),
|
||||||
alpha = 0.8,
|
# alpha = 0.8,
|
||||||
group_title = "Status for 2021",
|
# group_title = "Status for 2021",
|
||||||
title = "% of HHs by self-reported status from 2021 to 2022",
|
# title = "% of HHs by self-reported status from 2021 to 2022"
|
||||||
theme = theme_reach(
|
# )
|
||||||
axis_y = FALSE,
|
|
||||||
legend_position = "none"))
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example 7: lollipop chart
|
### Example 7: Lollipop chart
|
||||||
```{r example-lollipop-chart, out.width = "65%", warning = FALSE}
|
|
||||||
|
```{r example-lollipop-chart, out.width = "65%", warning = FALSE, eval = TRUE}
|
||||||
library(tidyr)
|
library(tidyr)
|
||||||
# Prepare long data
|
# Prepare long data
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
admin1 = replicate(15, sample(letters, 8)) |> t() |> as.data.frame() |> unite("admin1", sep = "") |> dplyr::pull(admin1),
|
admin1 = replicate(15, sample(letters, 8)) |> t() |> as.data.frame() |> unite("admin1", sep = "") |> dplyr::pull(admin1),
|
||||||
stat = rnorm(15, mean = 50, sd = 15)) |>
|
stat = rnorm(15, mean = 50, sd = 15)
|
||||||
|
) |>
|
||||||
dplyr::mutate(stat = round(stat, 0))
|
dplyr::mutate(stat = round(stat, 0))
|
||||||
|
|
||||||
# Make lollipop plot, REACH themed, vertical with 45 degrees angle X-labels
|
# Simple vertical lollipop chart
|
||||||
lollipop(df,
|
lollipop(
|
||||||
admin1,
|
df = df,
|
||||||
stat,
|
x = "admin1",
|
||||||
arrange = FALSE,
|
y = "stat",
|
||||||
add_text = FALSE,
|
|
||||||
flip = FALSE,
|
flip = FALSE,
|
||||||
|
dot_size = 3,
|
||||||
y_title = "% of HHs",
|
y_title = "% of HHs",
|
||||||
x_title = "Admin 1",
|
x_title = "Admin 1",
|
||||||
title = "% of HHs that reported having received a humanitarian assistance",
|
title = "% of HHs that received humanitarian assistance"
|
||||||
theme = theme_reach(axis_text_x_angle = 45,
|
)
|
||||||
grid_major_y = TRUE,
|
|
||||||
grid_major_y_size = 0.2,
|
|
||||||
grid_major_x = TRUE,
|
|
||||||
grid_minor_y = TRUE))
|
|
||||||
|
|
||||||
# Horizontal, greater point size, arranged by value, no grid, and text labels added
|
# Horizontal lollipop chart with custom colors
|
||||||
lollipop(df,
|
hlollipop(
|
||||||
admin1,
|
df = df,
|
||||||
stat,
|
x = "admin1",
|
||||||
arrange = TRUE,
|
y = "stat",
|
||||||
point_size = 10,
|
dot_size = 4,
|
||||||
point_color = cols_reach("main_beige"),
|
line_size = 1,
|
||||||
segment_size = 2,
|
add_color = color("cat_5_main_2"),
|
||||||
add_text = TRUE,
|
line_color = color("cat_5_main_4"),
|
||||||
add_text_suffix = "%",
|
|
||||||
y_title = "% of HHs",
|
y_title = "% of HHs",
|
||||||
x_title = "Admin 1",
|
x_title = "Admin 1",
|
||||||
title = "% of HHs that reported having received a humanitarian assistance in the 12 months prior to the assessment",
|
title = "% of HHs that received humanitarian assistance"
|
||||||
theme = theme_reach(title_position_to_plot = FALSE))
|
)
|
||||||
|
|
||||||
|
# Create data for grouped lollipop - using set.seed for reproducibility
|
||||||
|
set.seed(123)
|
||||||
|
df_grouped <- tibble::tibble(
|
||||||
|
admin1 = rep(c("A", "B", "C", "D", "E", "F"), 2),
|
||||||
|
group = rep(c("Group A", "Group B"), each = 6),
|
||||||
|
stat = c(rnorm(6, mean = 40, sd = 10), rnorm(6, mean = 60, sd = 10))
|
||||||
|
) |>
|
||||||
|
dplyr::mutate(stat = round(stat, 0))
|
||||||
|
|
||||||
|
# Grouped lollipop chart with proper side-by-side positioning
|
||||||
|
lollipop(
|
||||||
|
df = df_grouped,
|
||||||
|
x = "admin1",
|
||||||
|
y = "stat",
|
||||||
|
group = "group",
|
||||||
|
order = "grouped_y",
|
||||||
|
dodge_width = 0.8, # Control spacing between grouped lollipops
|
||||||
|
dot_size = 3.5,
|
||||||
|
line_size = 0.8,
|
||||||
|
y_title = "Value",
|
||||||
|
x_title = "Category",
|
||||||
|
title = "True side-by-side grouped lollipop chart"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Horizontal grouped lollipop chart
|
||||||
|
hlollipop(
|
||||||
|
df = df_grouped,
|
||||||
|
x = "admin1",
|
||||||
|
y = "stat",
|
||||||
|
group = "group",
|
||||||
|
dodge_width = 0.7, # Narrower spacing for horizontal orientation
|
||||||
|
dot_size = 3.5,
|
||||||
|
line_size = 0.8,
|
||||||
|
y_title = "Category",
|
||||||
|
x_title = "Value",
|
||||||
|
title = "Horizontal side-by-side grouped lollipop chart"
|
||||||
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Lollipop Chart Features
|
||||||
|
|
||||||
## Maps
|
Lollipop charts offer several advantages:
|
||||||
|
|
||||||
```{r example-map, out.width = "50%"}
|
- Clean visualization of point data with connecting lines to a baseline
|
||||||
|
- True side-by-side grouped display for easy comparison between categories
|
||||||
|
- Each lollipop maintains its position from dot to baseline
|
||||||
|
- Customizable appearance with parameters for dot size, line width, and colors
|
||||||
|
- The `dodge_width` parameter controls spacing between grouped lollipops
|
||||||
|
|
||||||
# Add indicator layer
|
The side-by-side positioning for grouped lollipops makes them visually distinct from dumbbell plots, which typically connect related points on the same line.
|
||||||
# - based on "pretty" classes and title "Proportion (%)"
|
|
||||||
# - buffer to add a 10% around the bounding box
|
|
||||||
map <- add_indicator_layer(
|
|
||||||
indicator_admin1,
|
|
||||||
opn_dfc,
|
|
||||||
buffer = 0.1) +
|
|
||||||
# Layout - some defaults - add the map title
|
|
||||||
add_layout("% of HH that reported open defecation as sanitation facility") +
|
|
||||||
# Admin boundaries as list of shape files (lines) and colors, line widths and labels as vectors
|
|
||||||
add_admin_boundaries(
|
|
||||||
lines = list(line_admin1, border_admin0, frontier_admin0),
|
|
||||||
colors = cols_reach("main_lt_grey", "dk_grey", "black"),
|
|
||||||
lwds = c(0.5, 2, 3),
|
|
||||||
labels = c("Department", "Country", "Dominican Rep. frontier"),
|
|
||||||
title = "Administrative boundaries") +
|
|
||||||
# Add text labels - centered on admin 1 centroids
|
|
||||||
add_admin_labels(centroid_admin1, ADM1_FR_UPPER) +
|
|
||||||
# Add a compass
|
|
||||||
add_compass() +
|
|
||||||
# Add a scale bar
|
|
||||||
add_scale_bar() +
|
|
||||||
# Add credits
|
|
||||||
add_credits("Admin. boundaries. : CNIGS \nCoord. system: GCS WGS 1984")
|
|
||||||
```
|
|
||||||
|
|
||||||
```{r map-save, eval = TRUE, include = FALSE, echo = TRUE}
|
|
||||||
tmap::tmap_save(map,
|
|
||||||
"man/figures/README-example-map.png",
|
|
||||||
height = 4.5,
|
|
||||||
width = 6
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||

|
|
||||||
|
|
|
||||||
363
README.md
|
|
@ -1,13 +1,12 @@
|
||||||
|
|
||||||
<!-- README.md is generated from README.Rmd. Please edit that file -->
|
<!-- README.md is generated from README.Rmd. Please edit that file -->
|
||||||
|
|
||||||
# visualizeR <img src="man/figures/logo.png" align="right" alt="" width="120"/>
|
# visualizeR <img src="man/figures/logo.png" align="right" width="120"/>
|
||||||
|
|
||||||
> What a color\! What a viz\!
|
> What a color! What a viz!
|
||||||
|
|
||||||
`visualizeR` proposes some utils to get REACH and AGORA colors,
|
`visualizeR` proposes some utils to sane colors, ready-to-go color
|
||||||
ready-to-go color palettes, and a few visualization functions
|
palettes, and a few visualization functions.
|
||||||
(horizontal hist graph for instance).
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
|
@ -16,71 +15,62 @@ You can install the last version of visualizeR from
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
# install.packages("devtools")
|
# install.packages("devtools")
|
||||||
devtools::install_github("gnoblet/visualizeR", build_vignettes = TRUE)
|
devtools::install_github('gnoblet/visualizeR', build_vignettes = TRUE)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
||||||
Roadmap is as follows:
|
Roadmap is as follows:
|
||||||
|
|
||||||
- \[X\] Add IMPACT’s colors
|
- [ ] Full revamp of core functions (colors, pattern, incl. adding test
|
||||||
- \[X\] Add all color palettes from the internal documentation
|
and pre-commit structures)
|
||||||
- \[ \] There remains to be added more-than-7-color palettes and black
|
- [ ] Add other types of plots:
|
||||||
color palettes
|
- [ ] Dumbell
|
||||||
- \[X\] Add new types of visualization (e.g. dumbbell plot, lollipop
|
- [ ] Waffle
|
||||||
plot, etc.)
|
- [ ] Donut
|
||||||
- \[X\] Use examples
|
- [ ] Alluvial
|
||||||
- \[ \] Add some ease-map functions
|
|
||||||
- \[ \] Add some interactive functions (maps and graphs)
|
|
||||||
- \[ \] Consolidate and make errors transparent
|
|
||||||
|
|
||||||
## Request
|
## Request
|
||||||
|
|
||||||
Please, do not hesitate to pull request any new viz or colors or color
|
Please, do not hesitate to pull request any new viz or colors or color
|
||||||
palettes, or to email request any change
|
palettes, or to email request any change (<gnoblet@zaclys.net>).
|
||||||
(<guillaume.noblet@reach-initiative.org> or <gnoblet@zaclys.net>).
|
|
||||||
|
|
||||||
## Colors
|
## Colors
|
||||||
|
|
||||||
Color palettes for REACH, AGORA and IMPACT are available. Functions to
|
Functions to access colors and palettes are `color()` or `palette()`.
|
||||||
access colors and palettes are `cols_initiative()` or
|
Feel free to pull request new colors.
|
||||||
`pal_initiative()`. For now, the initiative with the most colors and
|
|
||||||
color palettes is REACH. Feel free to pull requests new AGORA and IMPACT
|
|
||||||
colors.
|
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
library(visualizeR)
|
library(visualizeR)
|
||||||
|
|
||||||
# Get all saved REACH colors, named
|
# Get all saved colors, named
|
||||||
cols_reach(unnamed = F)[1:10]
|
color(unname = F)[1:10]
|
||||||
#> white black main_grey main_red main_lt_grey main_beige
|
#> white lighter_grey light_grey dark_grey light_blue_grey
|
||||||
#> "#FFFFFF" "#000000" "#58585A" "#EE5859" "#C7C8CA" "#D2CBB8"
|
#> "#FFFFFF" "#F5F5F5" "#E3E3E3" "#464647" "#B3C6D1"
|
||||||
#> iroise_1 iroise_2 iroise_3 iroise_4
|
#> grey black cat_2_yellow_1 cat_2_yellow_2 cat_2_light_1
|
||||||
#> "#DFECEF" "#B1D7E0" "#699DA3" "#236A7A"
|
#> "#71716F" "#000000" "#ffc20a" "#0c7bdc" "#fefe62"
|
||||||
|
|
||||||
# Extract a color palette as hexadecimal codes and reversed
|
# Extract a color palette as hexadecimal codes and reversed
|
||||||
pal_reach(palette = "main", reversed = TRUE, color_ramp_palette = FALSE)
|
palette(palette = 'cat_5_main', reversed = TRUE, color_ramp_palette = FALSE)
|
||||||
#> [1] "#58585A" "#EE5859" "#C7C8CA" "#D2CBB8"
|
#> [1] "#083d77" "#4ecdc4" "#f4c095" "#b47eb3" "#ffd5ff"
|
||||||
|
|
||||||
# Get all color palettes names
|
# Get all color palettes names
|
||||||
pal_reach(show_palettes = T)
|
palette(show_palettes = TRUE)
|
||||||
#> [1] "main" "primary" "secondary" "two_dots"
|
#> [1] "cat_2_yellow" "cat_2_light"
|
||||||
#> [5] "two_dots_flashy" "red_main" "red_main_5" "red_alt"
|
#> [3] "cat_2_green" "cat_2_blue"
|
||||||
#> [9] "red_alt_5" "iroise" "iroise_5" "discrete_6"
|
#> [5] "cat_5_main" "cat_5_ibm"
|
||||||
#> [13] "red_2" "red_3" "red_4" "red_5"
|
#> [7] "cat_3_aquamarine" "cat_3_tol_high_contrast"
|
||||||
#> [17] "red_6" "red_7" "green_2" "green_3"
|
#> [9] "cat_8_tol_adapted" "cat_3_custom_1"
|
||||||
#> [21] "green_4" "green_5" "green_6" "green_7"
|
#> [11] "cat_4_custom_1" "cat_5_custom_1"
|
||||||
#> [25] "artichoke_2" "artichoke_3" "artichoke_4" "artichoke_5"
|
#> [13] "cat_6_custom_1" "div_5_orange_blue"
|
||||||
#> [29] "artichoke_6" "artichoke_7" "blue_2" "blue_3"
|
#> [15] "div_5_green_purple"
|
||||||
#> [33] "blue_4" "blue_5" "blue_6" "blue_7"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Charts
|
## Charts
|
||||||
|
|
||||||
### Example 1: Bar chart, already REACH themed
|
### Example 1: Bar chart
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
library(visualizeR)
|
|
||||||
library(palmerpenguins)
|
library(palmerpenguins)
|
||||||
library(dplyr)
|
library(dplyr)
|
||||||
|
|
||||||
|
|
@ -88,61 +78,74 @@ df <- penguins |>
|
||||||
group_by(island, species) |>
|
group_by(island, species) |>
|
||||||
summarize(
|
summarize(
|
||||||
mean_bl = mean(bill_length_mm, na.rm = T),
|
mean_bl = mean(bill_length_mm, na.rm = T),
|
||||||
mean_fl = mean(flipper_length_mm, na.rm = T)) |>
|
mean_fl = mean(flipper_length_mm, na.rm = T)
|
||||||
|
) |>
|
||||||
|
ungroup()
|
||||||
|
|
||||||
|
df_island <- penguins |>
|
||||||
|
group_by(island) |>
|
||||||
|
summarize(
|
||||||
|
mean_bl = mean(bill_length_mm, na.rm = T),
|
||||||
|
mean_fl = mean(flipper_length_mm, na.rm = T)
|
||||||
|
) |>
|
||||||
ungroup()
|
ungroup()
|
||||||
|
|
||||||
# Simple bar chart by group with some alpha transparency
|
# Simple bar chart by group with some alpha transparency
|
||||||
bar(df, island, mean_bl, species, percent = FALSE, alpha = 0.6, x_title = "Mean of bill length")
|
bar(df, 'island', 'mean_bl', 'species', x_title = 'Mean of bill length', title = 'Mean of bill length by island and species')
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-bar-chart-1.png" width="65%" />
|
<img src="man/figures/README-example-bar-chart-1.png" width="65%" />
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Using another color palette through `theme_reach()` and changing scale to percent
|
# Flipped / Horizontal
|
||||||
bar(df, island,mean_bl, species, percent = TRUE, theme = theme_reach(palette = "artichoke_3"))
|
hbar(df, 'island', 'mean_bl', 'species', x_title = 'Mean of bill length', title = 'Mean of bill length by island and species')
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-bar-chart-2.png" width="65%" />
|
<img src="man/figures/README-example-bar-chart-2.png" width="65%" />
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Not flipped, with text added, group_title, no y-axis and no bold for legend
|
# Facetted
|
||||||
bar(df, island, mean_bl, species, group_title = "Species", flip = FALSE, add_text = TRUE, add_text_suffix = "%", percent = FALSE, theme = theme_reach(text_font_face = "plain", axis_y = FALSE))
|
bar(df, 'island', 'mean_bl', facet = 'species', x_title = 'Mean of bill length', title = 'Mean of bill length by island and species', add_color_guide = FALSE)
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-bar-chart-3.png" width="65%" />
|
<img src="man/figures/README-example-bar-chart-3.png" width="65%" />
|
||||||
|
|
||||||
### Example 2: Point chart, already REACH themed
|
|
||||||
|
|
||||||
At this stage, `point_reach()` only supports categorical grouping colors
|
|
||||||
with the `group` arg.
|
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Simple point chart
|
# Flipped, with text, smaller width, and caption
|
||||||
point(penguins, bill_length_mm, flipper_length_mm)
|
hbar(df = df_island, x = 'island', y = 'mean_bl', title = 'Mean of bill length by island', add_text = T, width = 0.6, add_text_suffix = 'mm', add_text_expand_limit = 1.3, add_color_guide = FALSE, caption = "Data: palmerpenguins package.")
|
||||||
|
```
|
||||||
|
|
||||||
|
<img src="man/figures/README-example-bar-chart-4.png" width="65%" />
|
||||||
|
|
||||||
|
### Example 2: Scatterplot
|
||||||
|
|
||||||
|
``` r
|
||||||
|
# Simple scatterplot
|
||||||
|
point(penguins, 'bill_length_mm', 'flipper_length_mm')
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-point-chart-1.png" width="65%" />
|
<img src="man/figures/README-example-point-chart-1.png" width="65%" />
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Point chart with grouping colors, greater dot size, some transparency, reversed color palette
|
# Scatterplot with grouping colors, greater dot size, some transparency
|
||||||
point(penguins, bill_length_mm, flipper_length_mm, island, alpha = 0.6, size = 3, theme = theme_reach(reverse = TRUE))
|
point(penguins, 'bill_length_mm', 'flipper_length_mm', 'island', group_title = 'Island', alpha = 0.6, size = 3, title = 'Bill vs. flipper length', , add_color_guide = FALSE)
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-point-chart-2.png" width="65%" />
|
<img src="man/figures/README-example-point-chart-2.png" width="65%" />
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Using another color palettes
|
# Facetted scatterplot by island
|
||||||
point(penguins, bill_length_mm, flipper_length_mm, island, size = 1.5, x_title = "Bill", y_title = "Flipper", title = "Length (mm)", theme = theme_reach(palette = "artichoke_3", text_font_face = , grid_major_x = TRUE, title_position_to_plot = FALSE))
|
point(penguins, 'bill_length_mm', 'flipper_length_mm', 'species', 'island', 'fixed', group_title = 'Species', title = 'Bill vs. flipper length by species and island', add_color_guide = FALSE)
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-point-chart-3.png" width="65%" />
|
<img src="man/figures/README-example-point-chart-3.png" width="65%" />
|
||||||
|
|
||||||
### Example 3: Dumbbell plot, REACH themed
|
### Example 3: Dumbbell plot
|
||||||
|
|
||||||
Remember to ensure that your data are in the long format and you only
|
Remember to ensure that your data are in the long format and you only
|
||||||
have two groups on the x-axis; for instance, IDP and returnee and no NA
|
have two groups on the x-axis; for instance, IDP and returnee and no NA
|
||||||
|
|
@ -152,179 +155,187 @@ values.
|
||||||
# Prepare long data
|
# Prepare long data
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
admin1 = rep(letters[1:8], 2),
|
admin1 = rep(letters[1:8], 2),
|
||||||
setting = c(rep(c("Rural", "Urban"), 4), rep(c("Urban", "Rural"), 4)),
|
setting = c(rep(c('Rural', 'Urban'), 4), rep(c('Urban', 'Rural'), 4)),
|
||||||
stat = rnorm(16, mean = 50, sd = 18)
|
stat = rnorm(16, mean = 50, sd = 18)
|
||||||
) |>
|
) |>
|
||||||
dplyr::mutate(stat = round(stat, 0))
|
dplyr::mutate(stat = round(stat, 0))
|
||||||
|
|
||||||
# Example, adding a parameter to `theme_reach()` passed on `ggplot2::theme()` to align legend title
|
|
||||||
|
|
||||||
dumbbell(df,
|
|
||||||
stat,
|
|
||||||
setting,
|
# dumbbell(
|
||||||
admin1,
|
# df,
|
||||||
title = "% of HHs that reported open defecation as sanitation facility",
|
# 'stat',
|
||||||
group_y_title = "Admin 1",
|
# 'setting',
|
||||||
group_x_title = "Setting",
|
# 'admin1',
|
||||||
theme = theme_reach(legend_position = "bottom",
|
# title = '% of HHs that reported open defecation as sanitation facility',
|
||||||
legend_direction = "horizontal",
|
# group_y_title = 'Admin 1',
|
||||||
legend_title_font_face = "bold",
|
# group_x_title = 'Setting'
|
||||||
palette = "primary",
|
# )
|
||||||
title_position_to_plot = FALSE,
|
|
||||||
legend.title.align = 0.5)) +
|
|
||||||
# Change legend title position (could be included as part of the function)
|
|
||||||
ggplot2::guides(
|
|
||||||
color = ggplot2::guide_legend(title.position = "left"),
|
|
||||||
fill = ggplot2::guide_legend(title.position = "left")
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-dumbbell-plot-1.png" width="65%" />
|
### Example 4: donut chart
|
||||||
|
|
||||||
### Example 4: donut chart, REACH themed (to used once, not twice)
|
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Some summarized data: % of HHs by displacement status
|
# Some summarized data: % of HHs by displacement status
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
status = c("Displaced", "Non displaced", "Returnee", "Don't know/Prefer not to say"),
|
status = c('Displaced', 'Non displaced', 'Returnee', 'Don\'t know/Prefer not to say'),
|
||||||
percentage = c(18, 65, 12, 3)
|
percentage = c(18, 65, 12, 3)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Donut
|
# Donut
|
||||||
donut(df,
|
# donut(df,
|
||||||
status,
|
# status,
|
||||||
percentage,
|
# percentage,
|
||||||
hole_size = 3,
|
# hole_size = 3,
|
||||||
add_text_suffix = "%",
|
# add_text_suffix = '%',
|
||||||
add_text_color = cols_reach("dk_grey"),
|
# add_text_color = color('dark_grey'),
|
||||||
add_text_treshold_display = 5,
|
# add_text_treshold_display = 5,
|
||||||
x_title = "Displacement status",
|
# x_title = 'Displacement status',
|
||||||
title = "% of HHs by displacement status",
|
# title = '% of HHs by displacement status'
|
||||||
theme = theme_reach(legend_reverse = TRUE))
|
# )
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-donut-plot-1.png" width="65%" />
|
### Example 5: Waffle chart
|
||||||
|
|
||||||
### Example 5: waffle chart
|
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
#
|
#
|
||||||
waffle(df, status, percentage, x_title = "A caption", title = "A title", subtitle = "A subtitle")
|
# waffle(df, status, percentage, x_title = 'A caption', title = 'A title', subtitle = 'A subtitle')
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-waffle-plot-1.png" width="65%" />
|
### Example 6: Alluvial chart
|
||||||
|
|
||||||
### Example 6: alluvial chart, REACH themed
|
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Some summarized data: % of HHs by self-reported status of displacement in 2021 and in 2022
|
# Some summarized data: % of HHs by self-reported status of displacement in 2021 and in 2022
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
status_from = c(rep("Displaced", 4),
|
status_from = c(
|
||||||
rep("Non displaced", 4),
|
rep('Displaced', 4),
|
||||||
rep("Returnee", 4),
|
rep('Non displaced', 4),
|
||||||
rep("Dnk/Pnts", 4)),
|
rep('Returnee', 4),
|
||||||
status_to = c("Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts", "Displaced", "Non displaced", "Returnee", "Dnk/Pnts"),
|
rep('Dnk/Pnts', 4)
|
||||||
|
),
|
||||||
|
status_to = c('Displaced', 'Non displaced', 'Returnee', 'Dnk/Pnts', 'Displaced', 'Non displaced', 'Returnee', 'Dnk/Pnts', 'Displaced', 'Non displaced', 'Returnee', 'Dnk/Pnts', 'Displaced', 'Non displaced', 'Returnee', 'Dnk/Pnts'),
|
||||||
percentage = c(20, 8, 18, 1, 12, 21, 0, 2, 0, 3, 12, 1, 0, 0, 1, 1)
|
percentage = c(20, 8, 18, 1, 12, 21, 0, 2, 0, 3, 12, 1, 0, 0, 1, 1)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Alluvial, here the group is the status for 2021
|
# Alluvial, here the group is the status for 2021
|
||||||
|
|
||||||
alluvial(df,
|
# alluvial(df,
|
||||||
status_from,
|
# status_from,
|
||||||
status_to,
|
# status_to,
|
||||||
percentage,
|
# percentage,
|
||||||
status_from,
|
# status_from,
|
||||||
from_levels = c("Displaced", "Non displaced", "Returnee", "Dnk/Pnts"),
|
# from_levels = c("Displaced", "Non displaced", "Returnee", "Dnk/Pnts"),
|
||||||
alpha = 0.8,
|
# alpha = 0.8,
|
||||||
group_title = "Status for 2021",
|
# group_title = "Status for 2021",
|
||||||
title = "% of HHs by self-reported status from 2021 to 2022",
|
# title = "% of HHs by self-reported status from 2021 to 2022"
|
||||||
theme = theme_reach(
|
# )
|
||||||
axis_y = FALSE,
|
|
||||||
legend_position = "none"))
|
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-alluvial-plot-1.png" width="65%" />
|
### Example 7: Lollipop chart
|
||||||
|
|
||||||
### Example 7: lollipop chart
|
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
library(tidyr)
|
library(tidyr)
|
||||||
# Prepare long data
|
# Prepare long data
|
||||||
df <- tibble::tibble(
|
df <- tibble::tibble(
|
||||||
admin1 = replicate(15, sample(letters, 8)) |> t() |> as.data.frame() |> unite("admin1", sep = "") |> dplyr::pull(admin1),
|
admin1 = replicate(15, sample(letters, 8)) |> t() |> as.data.frame() |> unite("admin1", sep = "") |> dplyr::pull(admin1),
|
||||||
stat = rnorm(15, mean = 50, sd = 15)) |>
|
stat = rnorm(15, mean = 50, sd = 15)
|
||||||
|
) |>
|
||||||
dplyr::mutate(stat = round(stat, 0))
|
dplyr::mutate(stat = round(stat, 0))
|
||||||
|
|
||||||
# Make lollipop plot, REACH themed, vertical with 45 degrees angle X-labels
|
# Simple vertical lollipop chart
|
||||||
lollipop(df,
|
lollipop(
|
||||||
admin1,
|
df = df,
|
||||||
stat,
|
x = "admin1",
|
||||||
arrange = FALSE,
|
y = "stat",
|
||||||
add_text = FALSE,
|
|
||||||
flip = FALSE,
|
flip = FALSE,
|
||||||
|
dot_size = 3,
|
||||||
y_title = "% of HHs",
|
y_title = "% of HHs",
|
||||||
x_title = "Admin 1",
|
x_title = "Admin 1",
|
||||||
title = "% of HHs that reported having received a humanitarian assistance",
|
title = "% of HHs that received humanitarian assistance"
|
||||||
theme = theme_reach(axis_text_x_angle = 45,
|
)
|
||||||
grid_major_y = TRUE,
|
|
||||||
grid_major_y_size = 0.2,
|
|
||||||
grid_major_x = TRUE,
|
|
||||||
grid_minor_y = TRUE))
|
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-lollipop-chart-1.png" width="65%" />
|
<img src="man/figures/README-example-lollipop-chart-1.png" width="65%" />
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Horizontal, greater point size, arranged by value, no grid, and text labels added
|
# Horizontal lollipop chart with custom colors
|
||||||
lollipop(df,
|
hlollipop(
|
||||||
admin1,
|
df = df,
|
||||||
stat,
|
x = "admin1",
|
||||||
arrange = TRUE,
|
y = "stat",
|
||||||
point_size = 10,
|
dot_size = 4,
|
||||||
point_color = cols_reach("main_beige"),
|
line_size = 1,
|
||||||
segment_size = 2,
|
add_color = color("cat_5_main_2"),
|
||||||
add_text = TRUE,
|
line_color = color("cat_5_main_4"),
|
||||||
add_text_suffix = "%",
|
|
||||||
y_title = "% of HHs",
|
y_title = "% of HHs",
|
||||||
x_title = "Admin 1",
|
x_title = "Admin 1",
|
||||||
title = "% of HHs that reported having received a humanitarian assistance in the 12 months prior to the assessment",
|
title = "% of HHs that received humanitarian assistance"
|
||||||
theme = theme_reach(title_position_to_plot = FALSE))
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
<img src="man/figures/README-example-lollipop-chart-2.png" width="65%" />
|
<img src="man/figures/README-example-lollipop-chart-2.png" width="65%" />
|
||||||
|
|
||||||
## Maps
|
``` r
|
||||||
|
|
||||||
|
# Create data for grouped lollipop - using set.seed for reproducibility
|
||||||
|
set.seed(123)
|
||||||
|
df_grouped <- tibble::tibble(
|
||||||
|
admin1 = rep(c("A", "B", "C", "D", "E", "F"), 2),
|
||||||
|
group = rep(c("Group A", "Group B"), each = 6),
|
||||||
|
stat = c(rnorm(6, mean = 40, sd = 10), rnorm(6, mean = 60, sd = 10))
|
||||||
|
) |>
|
||||||
|
dplyr::mutate(stat = round(stat, 0))
|
||||||
|
|
||||||
|
# Grouped lollipop chart with proper side-by-side positioning
|
||||||
|
lollipop(
|
||||||
|
df = df_grouped,
|
||||||
|
x = "admin1",
|
||||||
|
y = "stat",
|
||||||
|
group = "group",
|
||||||
|
dodge_width = 0.8, # Control spacing between grouped lollipops
|
||||||
|
dot_size = 3.5,
|
||||||
|
line_size = 0.8,
|
||||||
|
y_title = "Value",
|
||||||
|
x_title = "Category",
|
||||||
|
title = "True side-by-side grouped lollipop chart"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
<img src="man/figures/README-example-lollipop-chart-3.png" width="65%" />
|
||||||
|
|
||||||
``` r
|
``` r
|
||||||
|
|
||||||
# Add indicator layer
|
# Horizontal grouped lollipop chart
|
||||||
# - based on "pretty" classes and title "Proportion (%)"
|
hlollipop(
|
||||||
# - buffer to add a 10% around the bounding box
|
df = df_grouped,
|
||||||
map <- add_indicator_layer(
|
x = "admin1",
|
||||||
indicator_admin1,
|
y = "stat",
|
||||||
opn_dfc,
|
group = "group",
|
||||||
buffer = 0.1) +
|
dodge_width = 0.7, # Narrower spacing for horizontal orientation
|
||||||
# Layout - some defaults - add the map title
|
dot_size = 3.5,
|
||||||
add_layout("% of HH that reported open defecation as sanitation facility") +
|
line_size = 0.8,
|
||||||
# Admin boundaries as list of shape files (lines) and colors, line widths and labels as vectors
|
y_title = "Category",
|
||||||
add_admin_boundaries(
|
x_title = "Value",
|
||||||
lines = list(line_admin1, border_admin0, frontier_admin0),
|
title = "Horizontal side-by-side grouped lollipop chart"
|
||||||
colors = cols_reach("main_lt_grey", "dk_grey", "black"),
|
)
|
||||||
lwds = c(0.5, 2, 3),
|
|
||||||
labels = c("Department", "Country", "Dominican Rep. frontier"),
|
|
||||||
title = "Administrative boundaries") +
|
|
||||||
# Add text labels - centered on admin 1 centroids
|
|
||||||
add_admin_labels(centroid_admin1, ADM1_FR_UPPER) +
|
|
||||||
# Add a compass
|
|
||||||
add_compass() +
|
|
||||||
# Add a scale bar
|
|
||||||
add_scale_bar() +
|
|
||||||
# Add credits
|
|
||||||
add_credits("Admin. boundaries. : CNIGS \nCoord. system: GCS WGS 1984")
|
|
||||||
```
|
```
|
||||||
|
|
||||||

|
|
||||||
|
## Lollipop Chart Features
|
||||||
|
|
||||||
|
Lollipop charts offer several advantages:
|
||||||
|
|
||||||
|
- Clean visualization of point data with connecting lines to a baseline
|
||||||
|
- True side-by-side grouped display for easy comparison between
|
||||||
|
categories
|
||||||
|
- Each lollipop maintains its position from dot to baseline
|
||||||
|
- Customizable appearance with parameters for dot size, line width, and
|
||||||
|
colors
|
||||||
|
- The `dodge_width` parameter controls spacing between grouped lollipops
|
||||||
|
|
||||||
|
The side-by-side positioning for grouped lollipops makes them visually
|
||||||
|
distinct from dumbbell plots, which typically connect related points on
|
||||||
|
the same line.
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
PROJCS["WGS_1984_UTM_Zone_18N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-75.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["m",1.0]]
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
GEOGCS["GCS_unknown",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
|
|
||||||
#------ Border - admin 0
|
|
||||||
border_admin0 <- sf::st_read("data-raw/border_admin0.shp")
|
|
||||||
usethis::use_data(border_admin0, overwrite = TRUE)
|
|
||||||
|
|
||||||
#------ Frontier - admin 0
|
|
||||||
frontier_admin0 <- sf::st_read("data-raw/frontier_admin0.shp")
|
|
||||||
usethis::use_data(frontier_admin0, overwrite = TRUE)
|
|
||||||
|
|
||||||
#------ Line - admin 1
|
|
||||||
line_admin1 <- sf::st_read("data-raw/line_admin1.shp")
|
|
||||||
usethis::use_data(line_admin1, overwrite = TRUE)
|
|
||||||
|
|
||||||
#------ Centroid - admin 1
|
|
||||||
centroid_admin1 <- sf::st_read("data-raw/centroid_admin1.shp") |>
|
|
||||||
dplyr::rename(ADM1_FR_UPPER = ADM1_FR_)
|
|
||||||
usethis::use_data(centroid_admin1, overwrite = TRUE)
|
|
||||||
|
|
||||||
#------ Indicator polygon - admin 1
|
|
||||||
indicator_admin1 <- sf::st_read("data-raw/indicator_admin1.shp")
|
|
||||||
usethis::use_data(indicator_admin1, overwrite = TRUE)
|
|
||||||
45
inst/WORDLIST
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
aut
|
||||||
|
coercible
|
||||||
|
Config
|
||||||
|
cre
|
||||||
|
Customizable
|
||||||
|
donut
|
||||||
|
Donut
|
||||||
|
dplyr
|
||||||
|
Dumbell
|
||||||
|
forcats
|
||||||
|
ggalluvial
|
||||||
|
ggplot
|
||||||
|
ggrepel
|
||||||
|
ggtext
|
||||||
|
github
|
||||||
|
gnoblet
|
||||||
|
grDevices
|
||||||
|
grey
|
||||||
|
Guillaume
|
||||||
|
hlollipop
|
||||||
|
horizonal
|
||||||
|
https
|
||||||
|
IDP
|
||||||
|
io
|
||||||
|
knitr
|
||||||
|
LazyData
|
||||||
|
Noblet
|
||||||
|
pre
|
||||||
|
rio
|
||||||
|
rlang
|
||||||
|
rmarkdown
|
||||||
|
Roadmap
|
||||||
|
Roboto
|
||||||
|
roxygen
|
||||||
|
RoxygenNote
|
||||||
|
Segoe
|
||||||
|
stringr
|
||||||
|
testthat
|
||||||
|
tidyr
|
||||||
|
UI
|
||||||
|
vdiffr
|
||||||
|
VignetteBuilder
|
||||||
|
viridisLite
|
||||||
|
visualizeR
|
||||||
|
zaclys
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/internals.R
|
|
||||||
\name{abort_bad_argument}
|
|
||||||
\alias{abort_bad_argument}
|
|
||||||
\title{Abord bad argument}
|
|
||||||
\usage{
|
|
||||||
abort_bad_argument(arg, must, not = NULL)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{arg}{An argument}
|
|
||||||
|
|
||||||
\item{must}{What arg must be}
|
|
||||||
|
|
||||||
\item{not}{Optional. What arg must not be.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A stop statement
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Abord bad argument
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/map.R
|
|
||||||
\name{add_admin_boundaries}
|
|
||||||
\alias{add_admin_boundaries}
|
|
||||||
\title{Add admin boundaries (lines) and the legend}
|
|
||||||
\usage{
|
|
||||||
add_admin_boundaries(
|
|
||||||
lines,
|
|
||||||
colors,
|
|
||||||
labels,
|
|
||||||
lwds,
|
|
||||||
title = "",
|
|
||||||
buffer = NULL,
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{lines}{List of multiline shape defined by sf package.}
|
|
||||||
|
|
||||||
\item{colors}{Vector of hexadecimal codes. Same order as lines.}
|
|
||||||
|
|
||||||
\item{labels}{Vector of labels in the legend. Same order as lines.}
|
|
||||||
|
|
||||||
\item{lwds}{Vector of line widths. Same order as lines.}
|
|
||||||
|
|
||||||
\item{title}{Legend title.}
|
|
||||||
|
|
||||||
\item{buffer}{A buffer, either one value or a vector of 4 values (left, bottom, right, top).}
|
|
||||||
|
|
||||||
\item{...}{Other arguments to pass to each shape in `tmap::tm_lines()`.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A tmap layer.
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Add admin boundaries (lines) and the legend
|
|
||||||
}
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/map.R
|
|
||||||
\name{add_admin_labels}
|
|
||||||
\alias{add_admin_labels}
|
|
||||||
\title{Wrapper around `tmap::tm_text()` with sane defaults for plotting admin labels.}
|
|
||||||
\usage{
|
|
||||||
add_admin_labels(
|
|
||||||
point,
|
|
||||||
text,
|
|
||||||
size = 0.5,
|
|
||||||
fontface = "bold",
|
|
||||||
fontfamily = "Leelawadee",
|
|
||||||
shadow = TRUE,
|
|
||||||
auto_placement = FALSE,
|
|
||||||
remove_overlap = FALSE,
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{point}{Multipoint shape defined by sf package.}
|
|
||||||
|
|
||||||
\item{text}{Text labels column.}
|
|
||||||
|
|
||||||
\item{size}{Relative size of the text labels.}
|
|
||||||
|
|
||||||
\item{fontface}{Fontface.}
|
|
||||||
|
|
||||||
\item{fontfamily}{Fontfamily. Leelawadee is your precious.}
|
|
||||||
|
|
||||||
\item{shadow}{Boolean. Add a shadow around text labels. Issue opened on Github to request.}
|
|
||||||
|
|
||||||
\item{auto_placement}{Logical that determines whether the labels are placed automatically.}
|
|
||||||
|
|
||||||
\item{remove_overlap}{Logical that determines whether the overlapping labels are removed.}
|
|
||||||
|
|
||||||
\item{...}{Other arguments to pass to `tmap::tm_text()`.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A tmap layer.
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Wrapper around `tmap::tm_text()` with sane defaults for plotting admin labels.
|
|
||||||
}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/map.R
|
|
||||||
\name{add_compass}
|
|
||||||
\alias{add_compass}
|
|
||||||
\title{Add a compass}
|
|
||||||
\usage{
|
|
||||||
add_compass(
|
|
||||||
text_size = 0.6,
|
|
||||||
position = c("right", 0.8),
|
|
||||||
color_dark = cols_reach("black"),
|
|
||||||
text_color = cols_reach("black"),
|
|
||||||
type = "4star",
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{text_size}{Relative font size.}
|
|
||||||
|
|
||||||
\item{position}{Position of the compass. Vector of two values, specifying the x and y coordinates.}
|
|
||||||
|
|
||||||
\item{color_dark}{Color of the dark parts of the compass.}
|
|
||||||
|
|
||||||
\item{text_color}{color of the text.}
|
|
||||||
|
|
||||||
\item{type}{Compass type, one of: "arrow", "4star", "8star", "radar", "rose".}
|
|
||||||
|
|
||||||
\item{...}{Other arguments to pass to `tmap::tm_compass()`.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A tmap layer.
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Add a compass
|
|
||||||
}
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/map.R
|
|
||||||
\name{add_credits}
|
|
||||||
\alias{add_credits}
|
|
||||||
\title{Do you want to credit someone or some institution?}
|
|
||||||
\usage{
|
|
||||||
add_credits(text, size = 0.4, bg_color = NA, position = c(0.75, 0.02), ...)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{text}{Text.}
|
|
||||||
|
|
||||||
\item{size}{Relative text size.}
|
|
||||||
|
|
||||||
\item{bg_color}{Background color.}
|
|
||||||
|
|
||||||
\item{position}{Position. Vector of two coordinates. Usually somewhere down.}
|
|
||||||
|
|
||||||
\item{...}{Other arguments to pass to `tmap::tm_credits()`.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A tmap layer.
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Do you want to credit someone or some institution?
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/map.R
|
|
||||||
\name{add_indicator_layer}
|
|
||||||
\alias{add_indicator_layer}
|
|
||||||
\title{Wrapper around `tmap::tm_polygons()` with sane defaults for plotting indicator values}
|
|
||||||
\usage{
|
|
||||||
add_indicator_layer(
|
|
||||||
poly,
|
|
||||||
col,
|
|
||||||
buffer = NULL,
|
|
||||||
n = 5,
|
|
||||||
style = "pretty",
|
|
||||||
palette = pal_reach("red_5"),
|
|
||||||
as_count = TRUE,
|
|
||||||
color_na = cols_reach("white"),
|
|
||||||
text_na = "Missing data",
|
|
||||||
legend_title = "Proportion (\%)",
|
|
||||||
legend_text_separator = " - ",
|
|
||||||
border_alpha = 1,
|
|
||||||
border_col = cols_reach("lt_grey_1"),
|
|
||||||
lwd = 1,
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{poly}{Multipolygon shape defined by sf package.}
|
|
||||||
|
|
||||||
\item{col}{Numeric attribute to map.}
|
|
||||||
|
|
||||||
\item{buffer}{A buffer, either one value or a vector of 4 values (left, bottom, right, top).}
|
|
||||||
|
|
||||||
\item{n}{The desire number of classes.}
|
|
||||||
|
|
||||||
\item{style}{Method to process the color scale for continuous numerical variables. See `classInt::classIntervals()` for details.}
|
|
||||||
|
|
||||||
\item{palette}{Vector of fill colors as hexadecimal values. For REACH color palettes, it is possible to use `pal_reach()`. For now,'palette' must be changed manually, accordingly to the number of drawn classes.}
|
|
||||||
|
|
||||||
\item{as_count}{Boolean. When col is a numeric variable, should it be processed as a count variable? For instance, 0, 1-10, 11-20.}
|
|
||||||
|
|
||||||
\item{color_na}{Fill color for missing data.}
|
|
||||||
|
|
||||||
\item{text_na}{Legend text for missing data.}
|
|
||||||
|
|
||||||
\item{legend_title}{Legend title.}
|
|
||||||
|
|
||||||
\item{legend_text_separator}{Text separator for classes. E.g. " to " will give 0, 1 to 10, 11 to 20.}
|
|
||||||
|
|
||||||
\item{border_alpha}{Transparency of the border.}
|
|
||||||
|
|
||||||
\item{border_col}{Color of the border.}
|
|
||||||
|
|
||||||
\item{lwd}{Linewidth of the border.}
|
|
||||||
|
|
||||||
\item{...}{Other arguments to pass to `tmap::tm_polygons()`.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A tmap layer.
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Wrapper around `tmap::tm_polygons()` with sane defaults for plotting indicator values
|
|
||||||
}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/map.R
|
|
||||||
\name{add_layout}
|
|
||||||
\alias{add_layout}
|
|
||||||
\title{Basic defaults based on `tmap::tm_layout()`}
|
|
||||||
\usage{
|
|
||||||
add_layout(
|
|
||||||
title = NULL,
|
|
||||||
legend_position = c(0.02, 0.5),
|
|
||||||
frame = FALSE,
|
|
||||||
legend_frame = cols_reach("main_grey"),
|
|
||||||
legend_text_size = 0.6,
|
|
||||||
legend_title_size = 0.8,
|
|
||||||
title_size = 0.9,
|
|
||||||
title_fontface = "bold",
|
|
||||||
title_color = cols_reach("main_grey"),
|
|
||||||
fontfamily = "Leelawadee",
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{title}{Map title.}
|
|
||||||
|
|
||||||
\item{legend_position}{Legend position. Not above the map is a good start.}
|
|
||||||
|
|
||||||
\item{frame}{Boolean. Legend frame?}
|
|
||||||
|
|
||||||
\item{legend_frame}{Legend frame color.}
|
|
||||||
|
|
||||||
\item{legend_text_size}{Legend text size in 'pt'.}
|
|
||||||
|
|
||||||
\item{legend_title_size}{Legend title size in 'pt'.}
|
|
||||||
|
|
||||||
\item{title_size}{Title text size in 'pt'.}
|
|
||||||
|
|
||||||
\item{title_fontface}{Title fontface. Bold if you wanna exemplify a lot what it is about.}
|
|
||||||
|
|
||||||
\item{title_color}{Title font color.}
|
|
||||||
|
|
||||||
\item{fontfamily}{Overall fontfamily. Leelawadee is your precious.}
|
|
||||||
|
|
||||||
\item{...}{Other arguments to pass to `tmap::tm_layout()`.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A tmap layer.
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Basic defaults based on `tmap::tm_layout()`
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/map.R
|
|
||||||
\name{add_scale_bar}
|
|
||||||
\alias{add_scale_bar}
|
|
||||||
\title{Add a scale bar}
|
|
||||||
\usage{
|
|
||||||
add_scale_bar(
|
|
||||||
text_size = 0.6,
|
|
||||||
position = c("left", 0.01),
|
|
||||||
color_dark = cols_reach("black"),
|
|
||||||
breaks = c(0, 50, 100),
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{text_size}{Relative font size.}
|
|
||||||
|
|
||||||
\item{position}{Position of the compass. Vector of two values, specifying the x and y coordinates.}
|
|
||||||
|
|
||||||
\item{color_dark}{Color of the dark parts of the compass.}
|
|
||||||
|
|
||||||
\item{breaks}{Breaks of the scale bar. If not specified, breaks will be automatically be chosen given the prefered width of the scale bar. Example: c(0, 50, 100).}
|
|
||||||
|
|
||||||
\item{...}{Other arguments to pass to `tmap::tm_compass()`.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A tmap layer.
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Add a scale bar
|
|
||||||
}
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/alluvial.R
|
|
||||||
\name{alluvial}
|
|
||||||
\alias{alluvial}
|
|
||||||
\title{Simple alluvial chart}
|
|
||||||
\usage{
|
|
||||||
alluvial(
|
|
||||||
df,
|
|
||||||
from,
|
|
||||||
to,
|
|
||||||
value,
|
|
||||||
group = NULL,
|
|
||||||
alpha = 0.5,
|
|
||||||
from_levels = NULL,
|
|
||||||
value_title = NULL,
|
|
||||||
group_title = NULL,
|
|
||||||
title = NULL,
|
|
||||||
subtitle = NULL,
|
|
||||||
caption = NULL,
|
|
||||||
rect_color = cols_reach("white"),
|
|
||||||
rect_border_color = cols_reach("main_grey"),
|
|
||||||
rect_text_color = cols_reach("main_grey"),
|
|
||||||
theme = theme_reach(axis_y = FALSE, legend_position = "none")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{df}{A data frame.}
|
|
||||||
|
|
||||||
\item{from}{A character column of upstream stratum.}
|
|
||||||
|
|
||||||
\item{to}{A character column of downstream stratum.}
|
|
||||||
|
|
||||||
\item{value}{A numeric column of values.}
|
|
||||||
|
|
||||||
\item{group}{The grouping column to fill the alluvium with.}
|
|
||||||
|
|
||||||
\item{alpha}{Fill transparency. Default to 0.5.}
|
|
||||||
|
|
||||||
\item{from_levels}{Order by given from levels?}
|
|
||||||
|
|
||||||
\item{value_title}{The value/y scale title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{group_title}{The group title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{title}{Plot title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{subtitle}{Plot subtitle. Default to NULL.}
|
|
||||||
|
|
||||||
\item{caption}{Plot caption. Default to NULL.}
|
|
||||||
|
|
||||||
\item{rect_color}{Stratum rectangles' fill color.}
|
|
||||||
|
|
||||||
\item{rect_border_color}{Stratum rectangles' border color.}
|
|
||||||
|
|
||||||
\item{rect_text_color}{Stratum rectangles' text color.}
|
|
||||||
|
|
||||||
\item{theme}{Whatever theme. Default to theme_reach().}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A donut chart to be used parsimoniously
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Simple alluvial chart
|
|
||||||
}
|
|
||||||
87
man/bar.Rd
|
|
@ -1,16 +1,32 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
% Generated by roxygen2: do not edit by hand
|
||||||
% Please edit documentation in R/bar.R
|
% Please edit documentation in R/bar.R
|
||||||
\name{bar}
|
\name{hbar}
|
||||||
|
\alias{hbar}
|
||||||
\alias{bar}
|
\alias{bar}
|
||||||
\title{Simple bar chart}
|
\title{Simple bar chart}
|
||||||
\usage{
|
\usage{
|
||||||
|
hbar(
|
||||||
|
...,
|
||||||
|
flip = TRUE,
|
||||||
|
add_text = FALSE,
|
||||||
|
theme_fun = theme_bar(flip = flip, add_text = add_text)
|
||||||
|
)
|
||||||
|
|
||||||
bar(
|
bar(
|
||||||
df,
|
df,
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
group = NULL,
|
group = "",
|
||||||
flip = TRUE,
|
facet = "",
|
||||||
percent = TRUE,
|
order = "none",
|
||||||
|
x_rm_na = TRUE,
|
||||||
|
y_rm_na = TRUE,
|
||||||
|
group_rm_na = TRUE,
|
||||||
|
facet_rm_na = TRUE,
|
||||||
|
y_expand = 0.1,
|
||||||
|
add_color = color("cat_5_main_1"),
|
||||||
|
add_color_guide = TRUE,
|
||||||
|
flip = FALSE,
|
||||||
wrap = NULL,
|
wrap = NULL,
|
||||||
position = "dodge",
|
position = "dodge",
|
||||||
alpha = 1,
|
alpha = 1,
|
||||||
|
|
@ -20,23 +36,53 @@ bar(
|
||||||
title = NULL,
|
title = NULL,
|
||||||
subtitle = NULL,
|
subtitle = NULL,
|
||||||
caption = NULL,
|
caption = NULL,
|
||||||
|
width = 0.8,
|
||||||
add_text = FALSE,
|
add_text = FALSE,
|
||||||
add_text_suffix = "",
|
add_text_size = 4.5,
|
||||||
theme = theme_reach()
|
add_text_color = color("dark_grey"),
|
||||||
|
add_text_font_face = "bold",
|
||||||
|
add_text_threshold_display = 0.05,
|
||||||
|
add_text_suffix = "\%",
|
||||||
|
add_text_expand_limit = 1.2,
|
||||||
|
add_text_round = 1,
|
||||||
|
theme_fun = theme_bar(flip = flip, add_text = add_text, axis_text_x_angle = 0,
|
||||||
|
axis_text_x_vjust = 0.5, axis_text_x_hjust = 0.5),
|
||||||
|
scale_fill_fun = scale_fill_visualizer_discrete(),
|
||||||
|
scale_color_fun = scale_color_visualizer_discrete()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
|
\item{flip}{TRUE or FALSE (default). Default to TRUE or horizontal bar plot.}
|
||||||
|
|
||||||
|
\item{add_text}{TRUE or FALSE. Add values as text.}
|
||||||
|
|
||||||
|
\item{theme_fun}{Whatever theme function. For no custom theme, use theme_fun = NULL.}
|
||||||
|
|
||||||
\item{df}{A data frame.}
|
\item{df}{A data frame.}
|
||||||
|
|
||||||
\item{x}{A numeric column.}
|
\item{x}{A quoted numeric column.}
|
||||||
|
|
||||||
\item{y}{A character column or coercible as a character column.}
|
\item{y}{A quoted character column or coercible as a character column.}
|
||||||
|
|
||||||
\item{group}{Some grouping categorical column, e.g. administrative areas or population groups.}
|
\item{group}{Some quoted grouping categorical column, e.g. administrative areas or population groups.}
|
||||||
|
|
||||||
\item{flip}{TRUE or FALSE. Default to TRUE or horizontal bar plot.}
|
\item{facet}{Some quoted grouping categorical column, e.g. administrative areas or population groups.}
|
||||||
|
|
||||||
\item{percent}{TRUE or FALSE. Should the x-labels (and text labels if present) be displayed as percentages? Default to TRUE.}
|
\item{order}{A character scalar specifying the order type (one of "none", "y", "grouped"). See details.}
|
||||||
|
|
||||||
|
\item{x_rm_na}{Remove NAs in x?}
|
||||||
|
|
||||||
|
\item{y_rm_na}{Remove NAs in y?}
|
||||||
|
|
||||||
|
\item{group_rm_na}{Remove NAs in group?}
|
||||||
|
|
||||||
|
\item{facet_rm_na}{Remove NAs in facet?}
|
||||||
|
|
||||||
|
\item{y_expand}{Multiplier to expand the y axis.}
|
||||||
|
|
||||||
|
\item{add_color}{Add a color to bars (if no grouping).}
|
||||||
|
|
||||||
|
\item{add_color_guide}{Should a legend be added?}
|
||||||
|
|
||||||
\item{wrap}{Should x-labels be wrapped? Number of characters.}
|
\item{wrap}{Should x-labels be wrapped? Number of characters.}
|
||||||
|
|
||||||
|
|
@ -56,15 +102,22 @@ bar(
|
||||||
|
|
||||||
\item{caption}{Plot caption. Default to NULL.}
|
\item{caption}{Plot caption. Default to NULL.}
|
||||||
|
|
||||||
\item{add_text}{TRUE or FALSE. Add the value as text.}
|
\item{width}{Bar width.}
|
||||||
|
|
||||||
|
\item{add_text_size}{Text size.}
|
||||||
|
|
||||||
|
\item{add_text_color}{Text color.}
|
||||||
|
|
||||||
|
\item{add_text_font_face}{Text font_face.}
|
||||||
|
|
||||||
|
\item{add_text_threshold_display}{Minimum value to add the text label.}
|
||||||
|
|
||||||
\item{add_text_suffix}{If percent is FALSE, should we add a suffix to the text label?}
|
\item{add_text_suffix}{If percent is FALSE, should we add a suffix to the text label?}
|
||||||
|
|
||||||
\item{theme}{Whatever theme. Default to theme_reach().}
|
\item{add_text_expand_limit}{Default to adding 10\% on top of the bar.}
|
||||||
}
|
|
||||||
\value{
|
\item{add_text_round}{Round the text label.}
|
||||||
A bar chart
|
|
||||||
}
|
}
|
||||||
\description{
|
\description{
|
||||||
Simple bar chart
|
`bar()` is a simple bar chart with some customization allowed, in particular the `theme_fun` argument for theming. `hbar()` uses `bar()` with sane defaults for a horizontal bar chart.
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/data.R
|
|
||||||
\docType{data}
|
|
||||||
\name{border_admin0}
|
|
||||||
\alias{border_admin0}
|
|
||||||
\title{Haïti border.}
|
|
||||||
\format{
|
|
||||||
A sf multiline objet with 1 feature and 6 fields:
|
|
||||||
\describe{
|
|
||||||
\item{fid_1}{fid_1}
|
|
||||||
\item{uno}{uno}
|
|
||||||
\item{count}{count}
|
|
||||||
\item{x_coord}{x_coord}
|
|
||||||
\item{y_coord}{y_coord}
|
|
||||||
\item{area}{area}
|
|
||||||
\item{geometry}{Multiline geometry.}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\usage{
|
|
||||||
border_admin0
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
A multiline shapefile of Haiti's border.
|
|
||||||
}
|
|
||||||
\keyword{datasets}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/bbox_buffer.R
|
|
||||||
\name{buffer_bbox}
|
|
||||||
\alias{buffer_bbox}
|
|
||||||
\title{Bbbox buffer}
|
|
||||||
\usage{
|
|
||||||
buffer_bbox(sf_obj, buffer = 0)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{sf_obj}{A `sf` object}
|
|
||||||
|
|
||||||
\item{buffer}{A buffer, either one value or a vector of 4 values (left, bottom, right, top). Default to 0.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A bbox with a buffer
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Bbbox buffer
|
|
||||||
}
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/data.R
|
|
||||||
\docType{data}
|
|
||||||
\name{centroid_admin1}
|
|
||||||
\alias{centroid_admin1}
|
|
||||||
\title{Haïti admin 1 centroids shapefile.}
|
|
||||||
\format{
|
|
||||||
A sf multipoint object with 10 features and 9 fields:
|
|
||||||
\describe{
|
|
||||||
\item{ADM1_PC}{Admin 1 postal code.}
|
|
||||||
\item{ADM1_EN}{Full name in English.}
|
|
||||||
\item{ADM1_FR}{Full name in French.}
|
|
||||||
\item{ADM1_HT}{Full name in Haitian Creole.}
|
|
||||||
\item{ADM0_EN}{Country name in English.}
|
|
||||||
\item{ADM0_FR}{Country name in French.}
|
|
||||||
\item{ADM0_HT}{Country name in Haitian Creole.}
|
|
||||||
\item{ADM0_PC}{Country postal code.}
|
|
||||||
\item{ADM1_FR_UPPER}{Admin 1 French name - uppercase.}
|
|
||||||
\item{geometry}{Multipoint geometry.}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\usage{
|
|
||||||
centroid_admin1
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
A multipoint shapefile of Haiti's admin 1.
|
|
||||||
}
|
|
||||||
\keyword{datasets}
|
|
||||||
19
man/check_vars_in_df.Rd
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
% Generated by roxygen2: do not edit by hand
|
||||||
|
% Please edit documentation in R/checks.R
|
||||||
|
\name{check_vars_in_df}
|
||||||
|
\alias{check_vars_in_df}
|
||||||
|
\title{Check if variables are in data frame}
|
||||||
|
\usage{
|
||||||
|
check_vars_in_df(df, vars)
|
||||||
|
}
|
||||||
|
\arguments{
|
||||||
|
\item{df}{A data frame}
|
||||||
|
|
||||||
|
\item{vars}{A vector of variable names}
|
||||||
|
}
|
||||||
|
\value{
|
||||||
|
A stop statement
|
||||||
|
}
|
||||||
|
\description{
|
||||||
|
Check if variables are in data frame
|
||||||
|
}
|
||||||
33
man/color.Rd
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
% Generated by roxygen2: do not edit by hand
|
||||||
|
% Please edit documentation in R/color.R
|
||||||
|
\name{color}
|
||||||
|
\alias{color}
|
||||||
|
\alias{color_pattern}
|
||||||
|
\title{Helpers to extract defined colors as hex codes}
|
||||||
|
\usage{
|
||||||
|
color(..., unname = TRUE)
|
||||||
|
|
||||||
|
color_pattern(pattern, unname = TRUE)
|
||||||
|
}
|
||||||
|
\arguments{
|
||||||
|
\item{...}{Character names of colors. If NULL returns all colors.}
|
||||||
|
|
||||||
|
\item{unname}{Boolean. Should the output vector be unnamed? Default to `TRUE`.}
|
||||||
|
|
||||||
|
\item{pattern}{Pattern of the start of colors' name.}
|
||||||
|
}
|
||||||
|
\value{
|
||||||
|
Hex codes named or unnamed.
|
||||||
|
}
|
||||||
|
\description{
|
||||||
|
[color()] returns the requested columns, returns NA if absent. [color_pattern()] returns all colors that start with the pattern.
|
||||||
|
}
|
||||||
|
\section{Naming of colors}{
|
||||||
|
|
||||||
|
* All branding colors start with "branding";
|
||||||
|
* All , categorical colors start with ", cat_";
|
||||||
|
* All sequential colors start with "seq_";
|
||||||
|
|
||||||
|
Then, a number indicates the number of colors that belong to the palettes, a string the name of the palette, and, finally, a number the position of the color. E.g., "seq_5_red_4" would be the 4th color of a continuous palettes of 5 colors in the red band. Exception is made for white, light_grey, dark_grey, and black.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/cols_agora.R
|
|
||||||
\name{cols_agora}
|
|
||||||
\alias{cols_agora}
|
|
||||||
\title{Function to extract AGORA colors as hex codes}
|
|
||||||
\usage{
|
|
||||||
cols_agora(..., unnamed = TRUE)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{...}{Character names of reach colors. If NULL returns all colors}
|
|
||||||
|
|
||||||
\item{unnamed}{Should the output vector be unnamed? Default to `TRUE`}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
An hex code or hex codes named or unnamed
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Function to extract AGORA colors as hex codes
|
|
||||||
}
|
|
||||||
\details{
|
|
||||||
This function needs to be modified to add colors
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/cols_impact.R
|
|
||||||
\name{cols_impact}
|
|
||||||
\alias{cols_impact}
|
|
||||||
\title{Function to extract IMPACT colors as hex codes}
|
|
||||||
\usage{
|
|
||||||
cols_impact(..., unnamed = TRUE)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{...}{Character names of reach colors. If NULL returns all colors}
|
|
||||||
|
|
||||||
\item{unnamed}{Should the output vector be unnamed? Default to `TRUE`}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
An hex code or hex codes named or unnamed
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Function to extract IMPACT colors as hex codes
|
|
||||||
}
|
|
||||||
\details{
|
|
||||||
This function needs to be modified to add colors
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/cols_reach.R
|
|
||||||
\name{cols_reach}
|
|
||||||
\alias{cols_reach}
|
|
||||||
\title{Function to extract REACH colors as hex codes}
|
|
||||||
\usage{
|
|
||||||
cols_reach(..., unnamed = TRUE)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{...}{Character names of reach colors. If NULL returns all colors}
|
|
||||||
|
|
||||||
\item{unnamed}{Should the output vector be unnamed? Default to `TRUE`}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
An hex code or hex codes named or unnamed
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Function to extract REACH colors as hex codes
|
|
||||||
}
|
|
||||||
\details{
|
|
||||||
This function needs to be modified to add colors
|
|
||||||
}
|
|
||||||
61
man/donut.Rd
|
|
@ -1,61 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/donut.R
|
|
||||||
\name{donut}
|
|
||||||
\alias{donut}
|
|
||||||
\title{Simple donut chart (to be used parsimoniously), can be a pie chart}
|
|
||||||
\usage{
|
|
||||||
donut(
|
|
||||||
df,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
alpha = 1,
|
|
||||||
x_title = NULL,
|
|
||||||
title = NULL,
|
|
||||||
subtitle = NULL,
|
|
||||||
caption = NULL,
|
|
||||||
arrange = TRUE,
|
|
||||||
hole_size = 3,
|
|
||||||
add_text = TRUE,
|
|
||||||
add_text_treshold_display = 5,
|
|
||||||
add_text_color = "white",
|
|
||||||
add_text_suffix = "",
|
|
||||||
theme = theme_reach(legend_reverse = TRUE)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{df}{A data frame.}
|
|
||||||
|
|
||||||
\item{x}{A character column or coercible as a character column. Will give the donut's fill color.}
|
|
||||||
|
|
||||||
\item{y}{A numeric column.}
|
|
||||||
|
|
||||||
\item{alpha}{Fill transparency.}
|
|
||||||
|
|
||||||
\item{x_title}{The x scale title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{title}{Plot title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{subtitle}{Plot subtitle. Default to NULL.}
|
|
||||||
|
|
||||||
\item{caption}{Plot caption. Default to NULL.}
|
|
||||||
|
|
||||||
\item{arrange}{TRUE or FALSE. Arrange by highest percentage first.}
|
|
||||||
|
|
||||||
\item{hole_size}{Hole size. Default to 3. If less than 2, back to a pie chart.}
|
|
||||||
|
|
||||||
\item{add_text}{TRUE or FALSE. Add the value as text.}
|
|
||||||
|
|
||||||
\item{add_text_treshold_display}{Minimum value to add the text label.}
|
|
||||||
|
|
||||||
\item{add_text_color}{Text color.}
|
|
||||||
|
|
||||||
\item{add_text_suffix}{If percent is FALSE, should we add a suffix to the text label?}
|
|
||||||
|
|
||||||
\item{theme}{Whatever theme. Default to theme_reach().}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A donut chart to be used parsimoniously
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Simple donut chart (to be used parsimoniously), can be a pie chart
|
|
||||||
}
|
|
||||||
|
|
@ -12,22 +12,24 @@ dumbbell(
|
||||||
point_size = 5,
|
point_size = 5,
|
||||||
point_alpha = 1,
|
point_alpha = 1,
|
||||||
segment_size = 2.5,
|
segment_size = 2.5,
|
||||||
segment_color = cols_reach("main_lt_grey"),
|
segment_color = color("light_blue_grey"),
|
||||||
group_x_title = NULL,
|
group_x_title = NULL,
|
||||||
group_y_title = NULL,
|
group_y_title = NULL,
|
||||||
x_title = NULL,
|
x_title = NULL,
|
||||||
title = NULL,
|
title = NULL,
|
||||||
subtitle = NULL,
|
subtitle = NULL,
|
||||||
caption = NULL,
|
caption = NULL,
|
||||||
line_to_y_axis = TRUE,
|
line_to_y_axis = FALSE,
|
||||||
line_to_y_axis_type = 3,
|
line_to_y_axis_type = 3,
|
||||||
line_to_y_axis_width = 0.5,
|
line_to_y_axis_width = 0.5,
|
||||||
line_to_y_axis_color = cols_reach("main_grey"),
|
line_to_y_axis_color = color("dark_grey"),
|
||||||
add_text = TRUE,
|
add_text = FALSE,
|
||||||
add_text_vjust = 2,
|
add_text_vjust = 2,
|
||||||
add_text_size = 3.5,
|
add_text_size = 3.5,
|
||||||
add_text_color = cols_reach("main_grey"),
|
add_text_color = color("dark_grey"),
|
||||||
theme = theme_reach(palette = "primary")
|
theme_fun = theme_dumbbell(),
|
||||||
|
scale_fill_fun = scale_fill_visualizer_discrete(),
|
||||||
|
scale_color_fun = scale_color_visualizer_discrete()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
\arguments{
|
\arguments{
|
||||||
|
|
@ -75,7 +77,11 @@ dumbbell(
|
||||||
|
|
||||||
\item{add_text_color}{Text color.}
|
\item{add_text_color}{Text color.}
|
||||||
|
|
||||||
\item{theme}{A ggplot2 theme, default to `theme_reach()`}
|
\item{theme_fun}{A ggplot2 theme, default to `theme_dumbbell()`}
|
||||||
|
|
||||||
|
\item{scale_fill_fun}{A ggplot2 scale_fill function, default to `scale_fill_visualizer_discrete()`}
|
||||||
|
|
||||||
|
\item{scale_color_fun}{A ggplot2 scale_color function, default to `scale_color_visualizer_discrete()`}
|
||||||
}
|
}
|
||||||
\value{
|
\value{
|
||||||
A dumbbell chart.
|
A dumbbell chart.
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 73 KiB |
BIN
man/figures/README-example-bar-chart-4.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 177 KiB |
|
Before Width: | Height: | Size: 318 KiB After Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 191 KiB |
|
|
@ -1,27 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/data.R
|
|
||||||
\docType{data}
|
|
||||||
\name{frontier_admin0}
|
|
||||||
\alias{frontier_admin0}
|
|
||||||
\title{Haïti frontier with Dominican Republic.}
|
|
||||||
\format{
|
|
||||||
A sf multipoint objet with 4 features and 8 fields:
|
|
||||||
\describe{
|
|
||||||
\item{fid_1}{fid_1}
|
|
||||||
\item{objectid}{objectid}
|
|
||||||
\item{id}{id}
|
|
||||||
\item{fromnode}{fromnode}
|
|
||||||
\item{tonode}{tonode}
|
|
||||||
\item{leftpolygo}{leftpolygo}
|
|
||||||
\item{rightpolygo}{rightpolygo}
|
|
||||||
\item{shape_leng}{shape_leng}
|
|
||||||
\item{geometry}{Multiline geometry.}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\usage{
|
|
||||||
frontier_admin0
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
A multiline shapefile of Haiti's frontier with Dominican Republic.
|
|
||||||
}
|
|
||||||
\keyword{datasets}
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/internals.R
|
|
||||||
\name{if_not_in_stop}
|
|
||||||
\alias{if_not_in_stop}
|
|
||||||
\title{Stop statement "If not in colnames" with colnames}
|
|
||||||
\usage{
|
|
||||||
if_not_in_stop(.tbl, cols, df, arg = NULL)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{.tbl}{A tibble}
|
|
||||||
|
|
||||||
\item{cols}{A vector of column names (quoted)}
|
|
||||||
|
|
||||||
\item{df}{Provide the tibble name as a character string}
|
|
||||||
|
|
||||||
\item{arg}{Default to NULL.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A stop statement
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Stop statement "If not in colnames" with colnames
|
|
||||||
}
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/internals.R
|
|
||||||
\name{if_vec_not_in_stop}
|
|
||||||
\alias{if_vec_not_in_stop}
|
|
||||||
\title{Stop statement "If not in vector"}
|
|
||||||
\usage{
|
|
||||||
if_vec_not_in_stop(vec, cols, vec_name, arg = NULL)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{vec}{A vector of character strings}
|
|
||||||
|
|
||||||
\item{cols}{A set of character strings}
|
|
||||||
|
|
||||||
\item{vec_name}{Provide the vector name as a character string}
|
|
||||||
|
|
||||||
\item{arg}{Default to NULL.}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A stop statement if some elements of vec are not in cols
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Stop statement "If not in vector"
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/data.R
|
|
||||||
\docType{data}
|
|
||||||
\name{indicator_admin1}
|
|
||||||
\alias{indicator_admin1}
|
|
||||||
\title{Indicator admin 1 polygons shapefile.}
|
|
||||||
\format{
|
|
||||||
A sf multipoint object with 10 features and 10 fields:
|
|
||||||
\describe{
|
|
||||||
\item{ADM1_PC}{Admin 1 postal code.}
|
|
||||||
\item{admin1}{Admin 1 unique id.}
|
|
||||||
\item{opn_dfc}{Proportion of HHs that reported open defecation as sanitation facility.}
|
|
||||||
\item{ADM1_EN}{Full name in English.}
|
|
||||||
\item{ADM1_FR}{Full name in French.}
|
|
||||||
\item{ADM1_HT}{Full name in Haitian Creole.}
|
|
||||||
\item{ADM0_EN}{Country name in English.}
|
|
||||||
\item{ADM0_FR}{Country name in French.}
|
|
||||||
\item{ADM0_HT}{Country name in Haitian Creole.}
|
|
||||||
\item{ADM0_PC}{Country postal code.}
|
|
||||||
\item{geometry}{Multipolygon geometry.}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\usage{
|
|
||||||
indicator_admin1
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
A multipolygon shapefile of Haiti's admin 1 with an indicator column 'opn_dfc'.
|
|
||||||
}
|
|
||||||
\keyword{datasets}
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/data.R
|
|
||||||
\docType{data}
|
|
||||||
\name{line_admin1}
|
|
||||||
\alias{line_admin1}
|
|
||||||
\title{Haïti admin 1 lines shapefile.}
|
|
||||||
\format{
|
|
||||||
A sf multiline object with 10 features and 8 fields:
|
|
||||||
\describe{
|
|
||||||
\item{ADM1_EN}{Full name in English.}
|
|
||||||
\item{ADM1_FR}{Full name in French.}
|
|
||||||
\item{ADM1_HT}{Full name in Haitian Creole.}
|
|
||||||
\item{ADM0_EN}{Country name in English.}
|
|
||||||
\item{ADM0_FR}{Country name in French.}
|
|
||||||
\item{ADM0_HT}{Country name in Haitian Creole.}
|
|
||||||
\item{ADM0_PCODE}{Country postal code.}
|
|
||||||
\item{geometry}{Multiline geometry.}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\usage{
|
|
||||||
line_admin1
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
A multiline shapefile of Haiti's admin 1.
|
|
||||||
}
|
|
||||||
\keyword{datasets}
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/lollipop.R
|
|
||||||
\name{lollipop}
|
|
||||||
\alias{lollipop}
|
|
||||||
\title{Simple bar chart}
|
|
||||||
\usage{
|
|
||||||
lollipop(
|
|
||||||
df,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
flip = TRUE,
|
|
||||||
wrap = NULL,
|
|
||||||
arrange = TRUE,
|
|
||||||
point_size = 3,
|
|
||||||
point_color = cols_reach("main_red"),
|
|
||||||
point_alpha = 1,
|
|
||||||
segment_size = 1,
|
|
||||||
segment_color = cols_reach("main_grey"),
|
|
||||||
segment_alpha = 1,
|
|
||||||
alpha = 1,
|
|
||||||
x_title = NULL,
|
|
||||||
y_title = NULL,
|
|
||||||
title = NULL,
|
|
||||||
subtitle = NULL,
|
|
||||||
caption = NULL,
|
|
||||||
add_text = FALSE,
|
|
||||||
add_text_size = 3,
|
|
||||||
add_text_suffix = "",
|
|
||||||
add_text_color = "white",
|
|
||||||
add_text_fontface = "bold",
|
|
||||||
theme = theme_reach()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{df}{A data frame.}
|
|
||||||
|
|
||||||
\item{x}{A numeric column.}
|
|
||||||
|
|
||||||
\item{y}{A character column or coercible as a character column.}
|
|
||||||
|
|
||||||
\item{flip}{TRUE or FALSE. Default to TRUE or horizontal lollipop plot.}
|
|
||||||
|
|
||||||
\item{wrap}{Should x-labels be wrapped? Number of characters.}
|
|
||||||
|
|
||||||
\item{arrange}{TRUE or FALSE. Arrange by highest percentage first.}
|
|
||||||
|
|
||||||
\item{point_size}{Point size.}
|
|
||||||
|
|
||||||
\item{point_color}{Point color.}
|
|
||||||
|
|
||||||
\item{point_alpha}{Point alpha.}
|
|
||||||
|
|
||||||
\item{segment_size}{Segment size.}
|
|
||||||
|
|
||||||
\item{segment_color}{Segment color.}
|
|
||||||
|
|
||||||
\item{segment_alpha}{Segment alpha.}
|
|
||||||
|
|
||||||
\item{alpha}{Fill transparency.}
|
|
||||||
|
|
||||||
\item{x_title}{The x scale title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{y_title}{The y scale title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{title}{Plot title. Default to NULL.}
|
|
||||||
|
|
||||||
\item{subtitle}{Plot subtitle. Default to NULL.}
|
|
||||||
|
|
||||||
\item{caption}{Plot caption. Default to NULL.}
|
|
||||||
|
|
||||||
\item{add_text}{TRUE or FALSE. Add the y value as text within the bubble.}
|
|
||||||
|
|
||||||
\item{add_text_size}{Text size.}
|
|
||||||
|
|
||||||
\item{add_text_suffix}{If percent is FALSE, should we add a suffix to the text label?}
|
|
||||||
|
|
||||||
\item{add_text_color}{Added text color. Default to white.}
|
|
||||||
|
|
||||||
\item{add_text_fontface}{Added text font face. Default to "bold".}
|
|
||||||
|
|
||||||
\item{theme}{Whatever theme. Default to theme_reach().}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A bar chart
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Simple bar chart
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/pal_agora.R
|
|
||||||
\name{pal_agora}
|
|
||||||
\alias{pal_agora}
|
|
||||||
\title{Return function to interpolate an AGORA color palette}
|
|
||||||
\usage{
|
|
||||||
pal_agora(
|
|
||||||
palette = "main",
|
|
||||||
reverse = FALSE,
|
|
||||||
color_ramp_palette = FALSE,
|
|
||||||
show_palettes = FALSE,
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{palette}{Character name of a palette in AGORA palettes}
|
|
||||||
|
|
||||||
\item{reverse}{Boolean indicating whether the palette should be reversed}
|
|
||||||
|
|
||||||
\item{color_ramp_palette}{Should the output be a `grDevices::colorRampPalette` function or a vector of hex codes? Default to the former with `TRUE`}
|
|
||||||
|
|
||||||
\item{show_palettes}{Should the ouput be the set of palettes names to pick from? Default to `FALSE`}
|
|
||||||
|
|
||||||
\item{...}{Additional arguments to pass to colorRampPalette()}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A color palette
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Return function to interpolate an AGORA color palette
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
% Generated by roxygen2: do not edit by hand
|
|
||||||
% Please edit documentation in R/pal_fallback.R
|
|
||||||
\name{pal_fallback}
|
|
||||||
\alias{pal_fallback}
|
|
||||||
\title{Return function to interpolate a fallback palette base on viridis::magma()}
|
|
||||||
\usage{
|
|
||||||
pal_fallback(
|
|
||||||
reverse = FALSE,
|
|
||||||
color_ramp_palette = FALSE,
|
|
||||||
discrete = FALSE,
|
|
||||||
n = 5,
|
|
||||||
...
|
|
||||||
)
|
|
||||||
}
|
|
||||||
\arguments{
|
|
||||||
\item{reverse}{Boolean indicating whether the palette should be reversed}
|
|
||||||
|
|
||||||
\item{color_ramp_palette}{Should the output be a `grDevices::colorRampPalette` function or a vector of hex codes? Default to the latter with `FALSE`}
|
|
||||||
|
|
||||||
\item{discrete}{Boolean. Discrete or not? Default to FALSE.}
|
|
||||||
|
|
||||||
\item{n}{Number of colors in the palette. Default to 5. Passe to `viridis::magma()`}
|
|
||||||
|
|
||||||
\item{...}{Other parameters to pass to `grDevices::colorRampPalette()`}
|
|
||||||
}
|
|
||||||
\value{
|
|
||||||
A color palette
|
|
||||||
}
|
|
||||||
\description{
|
|
||||||
Return function to interpolate a fallback palette base on viridis::magma()
|
|
||||||
}
|
|
||||||