From 3b84469c4423a86799ae1b8e5da48e722c1cfc2f Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Sun, 21 Sep 2025 18:24:29 -0400 Subject: [PATCH 1/4] Add Primer color scale --- NAMESPACE | 4 +++ R/discrete-primer.R | 87 +++++++++++++++++++++++++++++++++++++++++++++ R/palettes.R | 21 +++++++++++ _pkgdown.yml | 6 ++++ man/pal_primer.Rd | 31 ++++++++++++++++ man/scale_primer.Rd | 38 ++++++++++++++++++++ 6 files changed, 187 insertions(+) create mode 100644 R/discrete-primer.R create mode 100644 man/pal_primer.Rd create mode 100644 man/scale_primer.Rd diff --git a/NAMESPACE b/NAMESPACE index a43b15c..1820cf6 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -20,6 +20,7 @@ export(pal_material) export(pal_nejm) export(pal_npg) export(pal_observable) +export(pal_primer) export(pal_rickandmorty) export(pal_simpsons) export(pal_startrek) @@ -49,6 +50,7 @@ export(scale_color_material) export(scale_color_nejm) export(scale_color_npg) export(scale_color_observable) +export(scale_color_primer) export(scale_color_rickandmorty) export(scale_color_simpsons) export(scale_color_startrek) @@ -74,6 +76,7 @@ export(scale_colour_material) export(scale_colour_nejm) export(scale_colour_npg) export(scale_colour_observable) +export(scale_colour_primer) export(scale_colour_rickandmorty) export(scale_colour_simpsons) export(scale_colour_startrek) @@ -99,6 +102,7 @@ export(scale_fill_material) export(scale_fill_nejm) export(scale_fill_npg) export(scale_fill_observable) +export(scale_fill_primer) export(scale_fill_rickandmorty) export(scale_fill_simpsons) export(scale_fill_startrek) diff --git a/R/discrete-primer.R b/R/discrete-primer.R new file mode 100644 index 0000000..0a0a835 --- /dev/null +++ b/R/discrete-primer.R @@ -0,0 +1,87 @@ +#' Primer design system palette +#' +#' The Primer design system data visualization palette. +#' +#' @param palette Palette type. +#' Currently there is one available option: `"default"` +#' (17-color palette). +#' @param alpha Transparency level, a real number in (0, 1]. +#' See `alpha` in [grDevices::rgb()] for details. +#' +#' @export pal_primer +#' +#' @importFrom grDevices col2rgb rgb +#' @importFrom scales manual_pal +#' +#' @author Nan Xiao | \email{me@nanx.me} | +#' +#' @references +#' GitHub (2024). "Primer data visualization colors." +#' +#' +#' @examples +#' library("scales") +#' show_col(pal_primer("default")(17)) +#' show_col(pal_primer("default", alpha = 0.6)(17)) +pal_primer <- function(palette = c("default"), alpha = 1) { + palette <- match.arg(palette) + + if (alpha > 1L || alpha <= 0L) stop("alpha must be in (0, 1]") + + raw_cols <- ggsci_db$"primer"[[palette]] + raw_cols_rgb <- col2rgb(raw_cols) + alpha_cols <- rgb( + raw_cols_rgb[1L, ], raw_cols_rgb[2L, ], raw_cols_rgb[3L, ], + alpha = alpha * 255L, names = names(raw_cols), + maxColorValue = 255L + ) + + manual_pal(unname(alpha_cols)) +} + +#' Primer color scales +#' +#' See [pal_primer()] for details. +#' +#' @inheritParams pal_primer +#' @param ... Additional parameters for [ggplot2::discrete_scale()]. +#' +#' @export scale_color_primer +#' +#' @importFrom ggplot2 discrete_scale +#' +#' @author Nan Xiao | \email{me@nanx.me} | +#' +#' @references +#' GitHub (2024). "Primer data visualization colors." +#' +#' +#' @rdname scale_primer +#' +#' @examples +#' example_scatterplot() + scale_color_primer() +#' example_barplot() + scale_fill_primer() +scale_color_primer <- function(palette = c("default"), alpha = 1, ...) { + palette <- match.arg(palette) + if (is_ggplot2_350()) { + discrete_scale("colour", palette = pal_primer(palette, alpha), ...) + } else { + discrete_scale("colour", scale_name = "primer", palette = pal_primer(palette, alpha), ...) + } +} + +#' @export scale_colour_primer +#' @rdname scale_primer +scale_colour_primer <- scale_color_primer + +#' @export scale_fill_primer +#' @importFrom ggplot2 discrete_scale +#' @rdname scale_primer +scale_fill_primer <- function(palette = c("default"), alpha = 1, ...) { + palette <- match.arg(palette) + if (is_ggplot2_350()) { + discrete_scale("fill", palette = pal_primer(palette, alpha), ...) + } else { + discrete_scale("fill", scale_name = "primer", palette = pal_primer(palette, alpha), ...) + } +} diff --git a/R/palettes.R b/R/palettes.R index 00aea13..a042ec5 100644 --- a/R/palettes.R +++ b/R/palettes.R @@ -151,6 +151,27 @@ ggsci_db$"observable"$"observable10" <- c( "Gray" = "#9498A0" ) +# Primer data visualization color palette ---- +ggsci_db$"primer"$"default" <- c( + "Blue" = "#006EDB", + "Orange" = "#EB670F", + "Red" = "#DF0C24", + "Teal" = "#179B9B", + "Green" = "#30A147", + "Purple" = "#894CEB", + "Yellow" = "#B88700", + "Pink" = "#CE2C85", + "Brown" = "#856D4C", + "Lime" = "#527A29", + "Coral" = "#D43511", + "Pine" = "#167E53", + "Auburn" = "#9D615C", + "Olive" = "#64762D", + "Plum" = "#A830E8", + "Lemon" = "#866E04", + "Gray" = "#808FA3" +) + # Color palette from IGV ---- ggsci_db$"igv"$"default" <- c( "chr1" = "#5050FF", "chr2" = "#CE3D32", "chr3" = "#749B58", diff --git a/_pkgdown.yml b/_pkgdown.yml index b024d4f..8d6e1ba 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -66,6 +66,12 @@ reference: - scale_color_observable - scale_colour_observable - scale_fill_observable + - title: "Primer" + contents: + - pal_primer + - scale_color_primer + - scale_colour_primer + - scale_fill_primer - title: "LocusZoom" contents: - pal_locuszoom diff --git a/man/pal_primer.Rd b/man/pal_primer.Rd new file mode 100644 index 0000000..16e179a --- /dev/null +++ b/man/pal_primer.Rd @@ -0,0 +1,31 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/discrete-primer.R +\name{pal_primer} +\alias{pal_primer} +\title{Primer design system palette} +\usage{ +pal_primer(palette = c("default"), alpha = 1) +} +\arguments{ +\item{palette}{Palette type. +Currently there is one available option: \code{"default"} +(17-color palette).} + +\item{alpha}{Transparency level, a real number in (0, 1]. +See \code{alpha} in \code{\link[grDevices:rgb]{grDevices::rgb()}} for details.} +} +\description{ +The Primer design system data visualization palette. +} +\examples{ +library("scales") +show_col(pal_primer("default")(17)) +show_col(pal_primer("default", alpha = 0.6)(17)) +} +\references{ +GitHub (2024). "Primer data visualization colors." +\url{https://primer.style/product/ui-patterns/data-visualization/} +} +\author{ +Nan Xiao | \email{me@nanx.me} | \url{https://nanx.me} +} diff --git a/man/scale_primer.Rd b/man/scale_primer.Rd new file mode 100644 index 0000000..893095e --- /dev/null +++ b/man/scale_primer.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/discrete-primer.R +\name{scale_color_primer} +\alias{scale_color_primer} +\alias{scale_colour_primer} +\alias{scale_fill_primer} +\title{Primer color scales} +\usage{ +scale_color_primer(palette = c("default"), alpha = 1, ...) + +scale_colour_primer(palette = c("default"), alpha = 1, ...) + +scale_fill_primer(palette = c("default"), alpha = 1, ...) +} +\arguments{ +\item{palette}{Palette type. +Currently there is one available option: \code{"default"} +(17-color palette).} + +\item{alpha}{Transparency level, a real number in (0, 1]. +See \code{alpha} in \code{\link[grDevices:rgb]{grDevices::rgb()}} for details.} + +\item{...}{Additional parameters for \code{\link[ggplot2:discrete_scale]{ggplot2::discrete_scale()}}.} +} +\description{ +See \code{\link[=pal_primer]{pal_primer()}} for details. +} +\examples{ +example_scatterplot() + scale_color_primer() +example_barplot() + scale_fill_primer() +} +\references{ +GitHub (2024). "Primer data visualization colors." +\url{https://primer.style/product/ui-patterns/data-visualization/} +} +\author{ +Nan Xiao | \email{me@nanx.me} | \url{https://nanx.me} +} From 7647610ae9ded33e9a9a95eae3dba04fbbe62997 Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Sun, 21 Sep 2025 18:24:51 -0400 Subject: [PATCH 2/4] Add Primer to vignette --- vignettes/ggsci.Rmd | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/vignettes/ggsci.Rmd b/vignettes/ggsci.Rmd index 1593486..d0d35af 100644 --- a/vignettes/ggsci.Rmd +++ b/vignettes/ggsci.Rmd @@ -87,6 +87,9 @@ summarized in the table below. | Observable | `scale_color_observable()` | `"observable10"` | `pal_observable()` | | | `scale_fill_observable()` | | | +-----------------+------------------------------+--------------------------------+----------------------+ +| Primer | `scale_color_primer()` | `"default"` | `pal_primer()` | +| | `scale_fill_primer()` | | | ++-----------------+------------------------------+--------------------------------+----------------------+ | LocusZoom | `scale_color_locuszoom()` | `"default"` | `pal_locuszoom()` | | | `scale_fill_locuszoom()` | | | +-----------------+------------------------------+--------------------------------+----------------------+ @@ -287,6 +290,17 @@ p2_observable <- p2 + scale_fill_observable() grid.arrange(p1_observable, p2_observable, ncol = 2) ``` +### Primer + +The Primer palette follows the data visualization colors from [GitHub's Primer +design system](https://primer.style/product/ui-patterns/data-visualization/). + +```{r} +p1_primer <- p1 + scale_color_primer() +p2_primer <- p2 + scale_fill_primer() +grid.arrange(p1_primer, p2_primer, ncol = 2) +``` + ### LocusZoom The LocusZoom palette is based on the colors used by From 7602dbaff3741ba4a0970223c65885c6cf7a493c Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Sun, 21 Sep 2025 18:25:00 -0400 Subject: [PATCH 3/4] Add Primer to readme --- README.Rmd | 8 ++++++++ README.md | 4 ++++ man/figures/README-ggsci-primer-1.png | Bin 0 -> 24204 bytes 3 files changed, 12 insertions(+) create mode 100644 man/figures/README-ggsci-primer-1.png diff --git a/README.Rmd b/README.Rmd index bc830ef..b0377f7 100644 --- a/README.Rmd +++ b/README.Rmd @@ -146,6 +146,14 @@ p2_observable <- p2 + scale_fill_observable() grid.arrange(p1_observable, p2_observable, ncol = 2) ``` +### Primer + +```{r, ggsci-primer} +p1_primer <- p1 + scale_color_primer() +p2_primer <- p2 + scale_fill_primer() +grid.arrange(p1_primer, p2_primer, ncol = 2) +``` + ### LocusZoom ```{r, ggsci-locuszoom} diff --git a/README.md b/README.md index 603f2d0..ffafa84 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,10 @@ open with `vignette("ggsci")` in R) for a quick-start guide. +### Primer + + + ### LocusZoom diff --git a/man/figures/README-ggsci-primer-1.png b/man/figures/README-ggsci-primer-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba07ad3ab49c650e5afb4e25181e228ebe0cf0e GIT binary patch literal 24204 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 E4<5Op@&Et; literal 0 HcmV?d00001 From 4db01aa3cf044451eae7305d7bdc484e50d8758a Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Sun, 21 Sep 2025 18:25:20 -0400 Subject: [PATCH 4/4] Update news on the Primer palette --- NEWS.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 32f675e..7920f93 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,12 +1,17 @@ # ggsci 3.2.0.9000 +## New features + +- Add the Primer palette in `scale_color_primer()` + and `scale_fill_primer()` (#62). + ## Improvements - Add `example_scatterplot()` and `example_barplot()` to simplify discrete scale examples in documentation. This reduces boilerplate code and makes it easier to maintain the examples. Also improves graphical appearance of the examples by using a minimalist - theme with alternative data subsets. + theme with alternative data subsets (#61). # ggsci 3.2.0