Brand themes, color palettes, and utility functions for Civilytics Consulting. The package provides a complete ggplot2 theme system drawn from the Civilytics design system — warm paper backgrounds, civic-navy ink, and editorial typography — along with 10 curated color palettes, logo composition helpers, and data-wrangling utilities for public-sector analysis.
Install from the Civilytics Gitea server:
# install.packages("remotes")
remotes::install_git("https://gitea.civilytics.org/Civilytics/civilyticsR.git")library(civilytics)
library(ggplot2)
ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point(size = 2.5) +
scale_color_civilytics() +
labs(
title = "Fuel economy by engine displacement",
subtitle = "Highway MPG vs. engine size for 234 vehicles",
caption = "Source: EPA fuel economy data (ggplot2::mpg)",
x = "Engine displacement (litres)",
y = "Highway MPG"
) +
theme_civilytics()The package ships 53 named brand colors in
civilytics_colors and 10 curated palettes in
civilytics_palettes. Use civilytics_palette()
to retrieve colors by name, or pass palettes directly to the ggplot2
scales.
# Discrete fill with the qualitative palette
ggplot(mpg, aes(class, fill = class)) +
geom_bar(show.legend = FALSE) +
scale_fill_civilytics() +
labs(title = "Vehicle counts by class", x = NULL, y = NULL) +
theme_civilytics(grid = "y")
# Continuous fill with a sequential palette
ggplot(faithfuld, aes(waiting, eruptions, fill = density)) +
geom_tile() +
scale_fill_civilytics("seq_ember", discrete = FALSE) +
labs(title = "Old Faithful eruption density") +
theme_civilytics(grid = "none")Three theme variants cover the most common output contexts. All share
the same typographic structure and accept grid and
paper_bg parameters.
The default theme uses a warm paper background with horizontal gridlines — an editorial, Pew-style layout.
base_plot <- ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = factor(cyl)), size = 2) +
scale_color_civilytics() +
labs(
title = "Engine size vs. highway fuel economy",
subtitle = "Colored by number of cylinders",
caption = "Source: ggplot2::mpg",
colour = "Cylinders",
x = "Displacement (L)", y = "Highway MPG"
)
base_plot + theme_civilytics()The grid parameter controls which major gridlines are
drawn.
Dark navy background with light text, suitable for presentations or dashboards on dark surfaces.
Transparent background and larger base font (18 pt), sized for Reveal.js slides or PowerPoint exports.
Facet strips use the paper_2 tint, with the title
font.
ggplot(mpg, aes(displ, hwy)) +
geom_point(colour = civilytics_colors["navy_600"], size = 1.5) +
facet_wrap(~class, ncol = 4) +
labs(
title = "Highway MPG by vehicle class",
x = "Displacement (L)", y = "Highway MPG"
) +
theme_civilytics(grid = "y")Add the Civilytics logo to any ggplot using the pipe-friendly
civilytics_logo() or the lower-level
add_logo() / make_logo_grob(). The logo is
automatically right-aligned below the plot area. Wrap the ggplot chain
in parentheses before piping — R’s |> binds tighter than
+.
p <- ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point(size = 2) +
scale_color_civilytics() +
labs(
title = "Fuel economy by engine displacement",
caption = "Source: EPA fuel economy data (ggplot2::mpg)",
x = "Displacement (L)", y = "Highway MPG"
) +
theme_civilytics()
grid::grid.draw(civilytics_logo(p))Use type = "mark" for the compact C-pulse icon instead
of the full wordmark.
p2_logo <- ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
geom_point(size = 2) +
scale_color_civilytics() +
labs(
title = "Engine size vs. highway fuel economy",
colour = "Cylinders",
x = "Displacement (L)", y = "Highway MPG"
) +
theme_civilytics()
grid::grid.draw(civilytics_logo(p2_logo, type = "mark"))Use add_logo_ga() to attach a single logo below a row of
plots.
p1 <- ggplot(mpg, aes(class, fill = class)) +
geom_bar(show.legend = FALSE) +
scale_fill_civilytics() +
labs(title = "Vehicle counts", x = NULL, y = NULL) +
theme_civilytics(grid = "y")
p2 <- ggplot(mpg, aes(displ, hwy)) +
geom_point(colour = civilytics_colors["navy_600"], size = 1.5) +
labs(title = "Displacement vs. MPG", x = "Displacement (L)", y = "Highway MPG") +
theme_civilytics(grid = "y")
logo <- make_logo_grob()
grid::grid.draw(add_logo_ga(list(p1, p2), logo))The package also includes helpers for public-sector data analysis:
| Function | Purpose |
|---|---|
pretty_count() /
pretty_per() |
Format numbers and percentages |
grade_level_to_num() |
Convert grade labels (KG, 01–12) to numeric |
race_short_names() |
Standardize NCES race/ethnicity categories |
get_fips() /
get_stabbr() |
State FIPS code lookups |
clopper_pearson() /
agresti_coull_interval() |
Proportion confidence intervals |
match_test() /
trunc_match() |
Fuzzy join diagnostics |
perturb_count() /
random_round() |
Privacy-preserving data perturbation |
Logo and brand mark files live in inst/img/. The package
ships both PNG (for ggplot2 raster composition) and SVG (for Quarto/HTML
output) variants:
| File | Format | Used by |
|---|---|---|
civilytics-wordmark.png /
.svg |
Full “Civilytics” lockup | make_logo_grob("wordmark", "light"),
Quarto templates |
civilytics-wordmark-reverse.png /
.svg |
Light-on-dark wordmark | make_logo_grob("wordmark", "dark"), dark
slides |
civilytics-mark.png /
.svg |
Compact C-pulse icon | make_logo_grob("mark", "light") |
civilytics-mark-reverse.svg |
Light-on-dark mark | make_logo_grob("mark", "dark") |
civilytics-pulse.svg |
Standalone waveform glyph | Quarto slide footer chrome |
To update the logos, replace the files in inst/img/ with
new versions using the same filenames. The PNG files must be raster
images (the ggplot2 logo functions read them via
png::readPNG()). SVG files are passed through as-is by
Quarto and HTML templates.
After replacing files, re-render the README gallery to update the screenshots: