diff --git a/NAMESPACE b/NAMESPACE index 30ce074..bd0b54f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,6 +10,10 @@ export(font_rc_light) export(font_tw) export(font_tw_bold) export(font_tw_light) +export(ft_cols) +export(ft_geom_defaults) +export(ft_pal) +export(ft_text_col) export(gg_check) export(import_plex_sans) export(import_roboto_condensed) @@ -18,13 +22,17 @@ export(ipsum) export(ipsum_pal) export(ipsum_pdf) export(modern_geom_defaults) +export(scale_color_ft) export(scale_color_ipsum) +export(scale_colour_ft) export(scale_colour_ipsum) +export(scale_fill_ft) export(scale_fill_ipsum) export(scale_x_comma) export(scale_x_percent) export(scale_y_comma) export(scale_y_percent) +export(theme_ft_rc) export(theme_ipsum) export(theme_ipsum_ps) export(theme_ipsum_rc) diff --git a/R/ft.R b/R/ft.R new file mode 100644 index 0000000..fc7c1b6 --- /dev/null +++ b/R/ft.R @@ -0,0 +1,216 @@ +#' FT color palette +#' +#' @md +#' @docType data +#' @export +list( +slate = "#617a89", +blue = "#0b53c1", +red = "#ff0055", +green = "#b3e93e", +gray = "#909495", +yellow = "#ffec1b", +peach = "#fba29d", +light_blue = "#23d0fc" +) -> ft_cols + +#' @rdname ft_cols +#' @docType data +#' @export +ft_text_col <- "#929299" + +#' @inheritParams hrbrthemes::theme_ipsum_rc +#' @rdname theme_ipsum_rc +#' @export +theme_ft_rc <- function (base_family = "Roboto Condensed", base_size = 11.5, + plot_title_family = base_family, + plot_title_size = 18, + plot_title_face = "bold", + plot_title_margin = 10, + subtitle_family = if (.Platform$OS.type == "windows") "Roboto Condensed" else "Roboto Condensed Light", + subtitle_size = 13, + subtitle_face = "plain", + subtitle_margin = 15, + strip_text_family = base_family, + strip_text_size = 12, + strip_text_face = "plain", + caption_family = if (.Platform$OS.type == "windows") "Roboto Condensed" else "Roboto Condensed Light", + caption_size = 9, + caption_face = "plain", + caption_margin = 10, + axis_text_size = base_size, + axis_title_family = base_family, + axis_title_size = 9, + axis_title_face = "plain", + axis_title_just = "rt", + plot_margin = margin(30, 30, 30, 30), + grid = TRUE, axis = FALSE, ticks = FALSE) { + + grid_col <- axis_col <- "#464950" + + subtitle_col <- ft_text_col + + def_fore <- "#617a89" + + ggplot2::update_geom_defaults("point", list(colour = def_fore)) + ggplot2::update_geom_defaults("line", list(colour = def_fore)) + ggplot2::update_geom_defaults("area", list(colour = def_fore, fill=def_fore)) + ggplot2::update_geom_defaults("rect", list(colour = def_fore, fill=def_fore)) + ggplot2::update_geom_defaults("density", list(colour = def_fore, fill=def_fore)) + ggplot2::update_geom_defaults("bar", list(colour = def_fore, fill=def_fore)) + ggplot2::update_geom_defaults("col", list(colour = def_fore, fill=def_fore)) + ggplot2::update_geom_defaults("text", list(colour = ft_text_col)) + + ret <- ggplot2::theme_minimal(base_family=base_family, base_size=base_size) + + ret <- ret + theme(legend.background=element_blank()) + ret <- ret + theme(legend.key=element_blank()) + + if (inherits(grid, "character") | grid == TRUE) { + + ret <- ret + theme(panel.grid=element_line(color=grid_col, size=0.2)) + ret <- ret + theme(panel.grid.major=element_line(color=grid_col, size=0.2)) + ret <- ret + theme(panel.grid.minor=element_line(color=grid_col, size=0.15)) + + if (inherits(grid, "character")) { + if (regexpr("X", grid)[1] < 0) ret <- ret + theme(panel.grid.major.x=element_blank()) + if (regexpr("Y", grid)[1] < 0) ret <- ret + theme(panel.grid.major.y=element_blank()) + if (regexpr("x", grid)[1] < 0) ret <- ret + theme(panel.grid.minor.x=element_blank()) + if (regexpr("y", grid)[1] < 0) ret <- ret + theme(panel.grid.minor.y=element_blank()) + } + + } else { + ret <- ret + theme(panel.grid=element_blank()) + } + + if (inherits(axis, "character") | axis == TRUE) { + ret <- ret + theme(axis.line=element_line(color="white", size=0.15)) + if (inherits(axis, "character")) { + axis <- tolower(axis) + if (regexpr("x", axis)[1] < 0) { + ret <- ret + theme(axis.line.x=element_blank()) + } else { + ret <- ret + theme(axis.line.x=element_line(color=axis_col, size=0.15)) + } + if (regexpr("y", axis)[1] < 0) { + ret <- ret + theme(axis.line.y=element_blank()) + } else { + ret <- ret + theme(axis.line.y=element_line(color=axis_col, size=0.15)) + } + } else { + ret <- ret + theme(axis.line.x=element_line(color=axis_col, size=0.15)) + ret <- ret + theme(axis.line.y=element_line(color=axis_col, size=0.15)) + } + } else { + ret <- ret + theme(axis.line=element_blank()) + } + + if (!ticks) { + ret <- ret + theme(axis.ticks = element_blank()) + ret <- ret + theme(axis.ticks.x = element_blank()) + ret <- ret + theme(axis.ticks.y = element_blank()) + } else { + ret <- ret + theme(axis.ticks = element_line(size=0.15)) + ret <- ret + theme(axis.ticks.x = element_line(size=0.15)) + ret <- ret + theme(axis.ticks.y = element_line(size=0.15)) + ret <- ret + theme(axis.ticks.length = grid::unit(5, "pt")) + } + + xj <- switch(tolower(substr(axis_title_just, 1, 1)), b=0, l=0, m=0.5, c=0.5, r=1, t=1) + yj <- switch(tolower(substr(axis_title_just, 2, 2)), b=0, l=0, m=0.5, c=0.5, r=1, t=1) + + ret <- ret + theme(axis.text.x=element_text(size=axis_text_size, margin=margin(t=0))) + ret <- ret + theme(axis.text.y=element_text(size=axis_text_size, margin=margin(r=0))) + ret <- ret + theme(axis.title=element_text(size=axis_title_size, family=axis_title_family)) + ret <- ret + theme(axis.title.x=element_text(hjust=xj, size=axis_title_size, + family=axis_title_family, face=axis_title_face)) + ret <- ret + theme(axis.title.y=element_text(hjust=yj, size=axis_title_size, + family=axis_title_family, face=axis_title_face)) + ret <- ret + theme(strip.text=element_text(hjust=0, size=strip_text_size, + color = subtitle_col, + face=strip_text_face, family=strip_text_family)) + ret <- ret + theme(panel.spacing=grid::unit(2, "lines")) + ret <- ret + theme(plot.title=element_text(hjust=0, size=plot_title_size, + margin=margin(b=plot_title_margin), + family=plot_title_family, face=plot_title_face)) + ret <- ret + theme(plot.subtitle=element_text(hjust=0, size=subtitle_size, + color = subtitle_col, + margin = margin(b = subtitle_margin), + family = subtitle_family, face = subtitle_face)) + ret <- ret + theme(plot.caption=element_text(hjust=1, size=caption_size, + margin=margin(t=caption_margin), + family=caption_family, face=caption_face)) + ret <- ret + theme(plot.margin=plot_margin) + + bkgrnd <- "#252a32" + fgrnd <- "#617a89" + + ret <- ret + + theme(rect = element_rect(fill = bkgrnd, color = bkgrnd)) + + theme(plot.background = element_rect(fill = bkgrnd, color = bkgrnd)) + + theme(panel.background = element_rect(fill = bkgrnd, color = bkgrnd)) + + theme(rect = element_rect(fill = bkgrnd, color = bkgrnd)) + + theme(text = element_text(color = ft_text_col)) + + theme(axis.text = element_text(color = ft_text_col)) + + theme(title = element_text(color = ft_text_col)) + + theme(plot.title = element_text(color = "white")) + + theme(plot.subtitle = element_text(color = ft_text_col)) + + theme(plot.caption = element_text(color = ft_text_col)) + + theme(line = element_line(color = grid_col)) + + theme(axis.ticks = element_line(color = grid_col)) + + ret + +} +#' Change geom defaults from black to custom lights for the FT theme +#' +#' @export +ft_geom_defaults <- function() { + + geoms <- c("abline", "area", "bar", "boxplot", "col", "crossbar", + "density", "dotplot", "errorbar", "errorbar", + "hline", "line", "linerange", + "map", "path", "point", "polygon", "rect", "ribbon", "rug", "segment", + "step", "tile", "violin", "vline") + + for (g in geoms) { + message(g) + update_geom_defaults(g, list(colour = "#617a89", fill = "#617a89")) + } + + geoms <- c("text", "label") + + for (g in geoms) { + message(g) + update_geom_defaults(g, list(colour = ft_text_col, fill = "#252a32")) + } + +} + +ft_palette <- c("#617a89", "#0b53c1", "#ff0055", "#b3e93e", "#909495", "#ffec1b", "#fba29d", "#23d0fc") + +#' A bright qualitative color palette +#' +#' @export +#' @examples +#' library(scales) +#' scales::show_col(ft_palette()(8)) +ft_pal <- function() { manual_pal(ft_palette) } + +#' Discrete color & fill scales based on the FT palette +#' +#' See [ft_pal](). +#' +#' @md +#' @inheritDotParams ggplot2::discrete_scale -expand -position +#' @rdname scale_ft +#' @export +scale_colour_ft <- function(...) { discrete_scale("colour", "ft", ft_pal(), ...) } + +#' @export +#' @rdname scale_ft +scale_color_ft <- scale_colour_ft + +#' @export +#' @rdname scale_ft +scale_fill_ft <- function(...) { discrete_scale("fill", "ft", ft_pal(), ...) } diff --git a/man/ft_cols.Rd b/man/ft_cols.Rd new file mode 100644 index 0000000..302a0c9 --- /dev/null +++ b/man/ft_cols.Rd @@ -0,0 +1,17 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ft.R +\docType{data} +\name{ft_cols} +\alias{ft_cols} +\alias{ft_text_col} +\title{FT color palette} +\format{An object of class \code{list} of length 8.} +\usage{ +ft_cols + +ft_text_col +} +\description{ +FT color palette +} +\keyword{datasets} diff --git a/man/ft_geom_defaults.Rd b/man/ft_geom_defaults.Rd new file mode 100644 index 0000000..859eea6 --- /dev/null +++ b/man/ft_geom_defaults.Rd @@ -0,0 +1,11 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ft.R +\name{ft_geom_defaults} +\alias{ft_geom_defaults} +\title{Change geom defaults from black to custom lights for the FT theme} +\usage{ +ft_geom_defaults() +} +\description{ +Change geom defaults from black to custom lights for the FT theme +} diff --git a/man/ft_pal.Rd b/man/ft_pal.Rd new file mode 100644 index 0000000..3db041c --- /dev/null +++ b/man/ft_pal.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ft.R +\name{ft_pal} +\alias{ft_pal} +\title{A bright qualitative color palette} +\usage{ +ft_pal() +} +\description{ +A bright qualitative color palette +} +\examples{ +library(scales) +scales::show_col(ft_palette()(8)) +} diff --git a/man/scale_ft.Rd b/man/scale_ft.Rd new file mode 100644 index 0000000..718e556 --- /dev/null +++ b/man/scale_ft.Rd @@ -0,0 +1,63 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/ft.R +\name{scale_colour_ft} +\alias{scale_colour_ft} +\alias{scale_color_ft} +\alias{scale_fill_ft} +\title{Discrete color & fill scales based on the FT palette} +\usage{ +scale_colour_ft(...) + +scale_color_ft(...) + +scale_fill_ft(...) +} +\arguments{ +\item{...}{Arguments passed on to \code{ggplot2::discrete_scale} +\describe{ + \item{aesthetics}{The names of the aesthetics that this scale works with} + \item{scale_name}{The name of the scale} + \item{palette}{A palette function that when called with a single integer +argument (the number of levels in the scale) returns the values that +they should take} + \item{name}{The name of the scale. Used as axis or legend title. If +\code{waiver()}, the default, the name of the scale is taken from the first +mapping used for that aesthetic. If \code{NULL}, the legend title will be +omitted.} + \item{breaks}{One of: +\itemize{ +\item \code{NULL} for no breaks +\item \code{waiver()} for the default breaks computed by the +transformation object +\item A character vector of breaks +\item A function that takes the limits as input and returns breaks +as output +}} + \item{labels}{One of: +\itemize{ +\item \code{NULL} for no labels +\item \code{waiver()} for the default labels computed by the +transformation object +\item A character vector giving labels (must be same length as \code{breaks}) +\item A function that takes the breaks as input and returns labels +as output +}} + \item{limits}{A character vector that defines possible values of the scale +and their order.} + \item{na.translate}{Unlike continuous scales, discrete scales can easily show +missing values, and do so by default. If you want to remove missing values +from a discrete scale, specify \code{na.translate = FALSE}.} + \item{na.value}{If \code{na.translate = TRUE}, what value aesthetic +value should missing be displayed as? Does not apply to position scales +where \code{NA} is always placed at the far right.} + \item{drop}{Should unused factor levels be omitted from the scale? +The default, \code{TRUE}, uses the levels that appear in the data; +\code{FALSE} uses all the levels in the factor.} + \item{guide}{A function used to create a guide or its name. See +\code{\link[=guides]{guides()}} for more info.} + \item{super}{The super class to use for the constructed scale} +}} +} +\description{ +See \url{ft_pal}. +} diff --git a/man/theme_ipsum_rc.Rd b/man/theme_ipsum_rc.Rd index c5f3d74..dac393d 100644 --- a/man/theme_ipsum_rc.Rd +++ b/man/theme_ipsum_rc.Rd @@ -1,10 +1,26 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/modern.r, R/roboto-condensed.r -\name{theme_modern_rc} +% Please edit documentation in R/ft.R, R/modern.r, R/roboto-condensed.r +\name{theme_ft_rc} +\alias{theme_ft_rc} \alias{theme_modern_rc} \alias{theme_ipsum_rc} \title{A precise & pristine \link{ggplot2} theme with opinionated defaults and an emphasis on typoghraphy} \usage{ +theme_ft_rc(base_family = "Roboto Condensed", base_size = 11.5, + plot_title_family = base_family, plot_title_size = 18, + plot_title_face = "bold", plot_title_margin = 10, subtitle_family = if + (.Platform$OS.type == "windows") "Roboto Condensed" else + "Roboto Condensed Light", subtitle_size = 13, subtitle_face = "plain", + subtitle_margin = 15, strip_text_family = base_family, + strip_text_size = 12, strip_text_face = "plain", caption_family = if + (.Platform$OS.type == "windows") "Roboto Condensed" else + "Roboto Condensed Light", caption_size = 9, caption_face = "plain", + caption_margin = 10, axis_text_size = base_size, + axis_title_family = base_family, axis_title_size = 9, + axis_title_face = "plain", axis_title_just = "rt", + plot_margin = margin(30, 30, 30, 30), grid = TRUE, axis = FALSE, + ticks = FALSE) + theme_modern_rc(base_family = "Roboto Condensed", base_size = 11.5, plot_title_family = base_family, plot_title_size = 18, plot_title_face = "bold", plot_title_margin = 10, subtitle_family = if