
Simplified theming of {ggplot2}, {lattice},
and {base} R graphics. In addition to providing a centralized
approach to styling R graphics, {thematic} also enables
automatic
styling of R plots in Shiny, R Markdown, and RStudio.
Install the stable release of {thematic} on CRAN with:
install.packages("thematic")Auto
theming in Shiny requires {shiny} 1.5.0 or higher:
install.packages("shiny")Auto
theming in R Markdown requires {rmarkdown} 2.7 or
higher:
install.packages("rmarkdown")Using themes with custom
fonts works best if you have {showtext} and/or
{ragg} installed.
install.packages("showtext")
install.packages("ragg"){thematic}’s auto
theming gives R plots the ability to style themselves inside Shiny (via CSS), RStudio (via
RStudio
themes), and R Markdown (via {bslib}).
Call thematic_shiny() before launching a Shiny app to
enable {thematic} for every plotOutput()
inside the app. If no values are provided to
thematic_shiny(), each plotOutput() uses the
app’s CSS colors to inform new R plotting defaults. If the app uses Google Fonts (and you have
{showtext} and/or {ragg} installed), you may
safely provide font = "auto" to
thematic_shiny(), which also translates CSS fonts to R.
Here’s an example with the Pacifico font:
library(shiny)
library(ggplot2)
library(thematic)
# In order for auto/custom fonts to work properly, you'll want
# either the ragg (or showtext) package installed
library(ragg)
# If you want `{ragg}` to handle the font rendering in a Shiny app
options(shiny.useragg = TRUE)
# Call thematic_shiny() prior to launching the app, to change
# R plot theming defaults for all the plots generated in the app
thematic_shiny(font = "auto")
ui <- fluidPage(
# bslib makes it easy to customize CSS styles for things
# rendered by the browser, like tabsetPanel()
# https://rstudio.github.io/bslib
theme = bslib::bs_theme(
bg = "#002B36", fg = "#EEE8D5", primary = "#2AA198",
# bslib also makes it easy to import CSS fonts
base_font = bslib::font_google("Pacifico")
),
tabsetPanel(
type = "pills",
tabPanel("ggplot", plotOutput("ggplot")),
tabPanel("lattice", plotOutput("lattice")),
tabPanel("base", plotOutput("base"))
)
)
server <- function(input, output) {
output$ggplot <- renderPlot({
ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars), color = factor(cyl))) +
geom_point() +
ggrepel::geom_text_repel()
})
output$lattice <- renderPlot({
lattice::show.settings()
})
output$base <- renderPlot({
image(volcano, col = thematic_get_option("sequential"))
})
}
shinyApp(ui, server)

Call thematic_on() before generating plots inside
RStudio to have all subsequent plots shown in the “Plots” viewing pane
to reflect your RStudio theme. Note that thematic_on()
enables {thematic} for the remainder of the R session, but
you can use thematic_off() to disable (or
thematic_theme() for one-off use of
{thematic}). Here’s an example of how
{thematic} can intelligently adapt each plot to the current
RStudio theme:

Call thematic_rmd() before generating plots inside R
Markdown to have all subsequent plots within the document reflect the
relevant theme. In a static (i.e., non-runtime: shiny) R
Markdown context, auto-theming only works with {bslib}-powered
rmarkdown::html_document() (as in the example below),
but in other situations you may also provide colors
and fonts explicitly to thematic_rmd().
By default, {thematic} attempts to detect the relevant
background, foreground, and accent colors. However, you may also specify
these settings more directly by providing relevant color and fonts
directly to thematic_on() (or
thematic_shiny()/thematic_rmd()).
library(ggplot2)
thematic::thematic_on(bg = "#222222", fg = "white", accent = "#0CE3AC", font = "Oxanium")
ggp <- ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars), color = factor(cyl))) +
geom_point() +
ggrepel::geom_text_repel()
ggp
{thematic} works by setting new global defaults that can
always be overridden with plot-specific theme()-ing
code:
ggp + theme(text = element_text(colour = "purple"))
To use a “complete” {ggplot2} theme with
{thematic} (e.g., theme_bw(),
theme_minimal(), etc), use theme_set() to set
the theme globally. This way {thematic} has the opportunity
to preserve the complete theme’s styling semantics when changing global
defaults (e.g., theme_bw() uses the same fill color for the
panel and plot background, which is semantically different from the
theme_gray() default):
theme_set(theme_bw())
ggp
In addition to setting new defaults for main colors and fonts,
{thematic} also sets defaults for qualitative
(and sequential) colorscales. See the custom
themes article to learn more about how to customize those
defaults.
{thematic}’s theming options
as well as how they interact with {ggplot2},
{lattice}, and {base}.{thematic}.{thematic} to individual
plots.Below is a link to an RStudio Cloud instance with
some ready to run {thematic} examples:
{thematic} is released with a Contributor
Code of Conduct. By contributing
to this project, you agree to abide by its terms.