Package {ggfoundry}


Type: Package
Title: Shape Foundry & Geom for 'ggplot2'
Version: 0.4.0
Description: A 'ggplot2' extension that supports arbitrary hand-crafted colourable & fillable shapes. New shapes may be feature requested via a Github issue.
License: MIT + file LICENSE
Encoding: UTF-8
Depends: ggplot2 (≥ 3.5.0), R (≥ 4.1)
Imports: cli, grid, grImport2, lifecycle, rlang
Suggests: dplyr, forcats, knitr, rmarkdown, spelling, stringr, testthat (≥ 3.0.0)
Config/Needs/website: ggimage, ggfx, ggpp, ggtext, ggdendro, paletteer, palmerpenguins, patchwork, scales, showtext, tibble, rpart
Config/testthat/edition: 3
VignetteBuilder: knitr
URL: https://github.com/cgoo4/ggfoundry, https://cgoo4.github.io/ggfoundry/
BugReports: https://github.com/cgoo4/ggfoundry/issues
Language: en-GB
Config/roxygen2/version: 8.1.0
NeedsCompilation: no
Packaged: 2026-09-27 13:44:22 UTC; carlgoodwin
Author: Carl Goodwin [aut, cre, cph]
Maintainer: Carl Goodwin <carl.goodwin@quantumjitter.com>
Repository: CRAN
Date/Publication: 2026-09-27 14:00:02 UTC

ggfoundry: Shape Foundry & Geom for 'ggplot2'

Description

logo

A 'ggplot2' extension that supports arbitrary hand-crafted colourable & fillable shapes. New shapes may be feature requested via a Github issue.

Author(s)

Maintainer: Carl Goodwin carl.goodwin@quantumjitter.com [copyright holder]

Authors:

See Also

Useful links:


Display a palette using fillable shapes

Description

[Experimental]

Creates a visualisation of a chosen palette with each colour in the selected fillable shape.

Usage

display_palette(
  fill,
  pal_name,
  colour = "grey50",
  color = colour,
  shape = c("jar", "tube")
)

Arguments

fill

The colour of the shape fill.

pal_name

A character string for the name of the palette.

colour, color

The colour of the shape outline. Defaults to mid-grey to better support a website's light and dark mode.

shape

A character string for the name of the shape, e.g. "jar".

Value

A ggplot2 object.

Examples

display_palette(
  c("skyblue", "lightgreen", "pink", "bisque"),
  "Custom Palette Names"
  )
display_palette(
  c("#9986A5", "#79402E", "#CCBA72", "#0F0D0E", "#D9D0D3", "#8D8680"),
  "Vector of Hex Codes",
  shape = "tube",
  colour = "black"
  )
display_palette(
  c(
    "#423C29", "#333031", "#8F898B", "#D2C9CB", "#AFA7A5", "#8D8680",
    "#9986A5", "#8A666E", "#7B4638", "#976C46", "#BCA365", "#988A56"
    ),
  "Multiple Rows"
  )

Arbitrary hand-crafted fillable shapes for ggplot2

Description

[Experimental]

Arbitrary hand-crafted colourable and fillable shapes for ggplot2.

New shapes may be feature requested via a Github issue.

Copies the grob tree, editing only the placement viewports; the styled picture grobs are shared with the template and left untouched.

Usage

geom_casting(
  mapping = NULL,
  data = NULL,
  stat = "identity",
  position = "identity",
  ...,
  na.rm = FALSE,
  show.legend = NA,
  inherit.aes = TRUE
)

Arguments

mapping

A set of aesthetic mappings created by aes(). If specified and inherit.aes = TRUE (the default), it is combined with the default mapping at the top level of the plot.

data

A data frame to use for the layer. If NULL (the default), the data inherited from the plot is used.

stat

The statistical transformation to use on the data for this layer. The default is ggplot2::stat_identity().

position

A position adjustment to use for overlapping points on this layer. The default is ggplot2::position_identity().

...

Other arguments passed on to the layer. These are often aesthetics, used to set an aesthetic to a fixed value, like colour = "red" or size = 0.1. They may also be parameters to the paired geom, such as nudge_x, nudge_y, hjust and vjust.

size is panel-relative: it sets the shape's width and height as a fraction of the panel, so size = 0.1 spans a tenth of the panel, not millimetres.

na.rm

If FALSE, the default, missing values are removed with a warning. If TRUE, missing values are silently removed.

show.legend

Logical. Should this layer be included in the legends? NA, the default, includes if any aesthetics are mapped. FALSE never includes, and TRUE always includes.

inherit.aes

If FALSE, overrides the default aesthetics, rather than combining with them.

Details

Behind the scenes, a pair of vector images (outline & fill) are converted into Cairo graphics library SVG files, then into grid graphical objects (grobs) for use in a ggplot2 layer.

By default, the "violin" shape is used.

If the shape is mapped to a variable, e.g. aes(shape = factor(cyl)), then scale_shape_manual() is also required to explicitly name the desired shapes as a character vector (see examples). This is because standard shapes are associated with a number, e.g. a circle is 19, whereas geom_casting() shapes are associated only with character strings.

Aesthetics that vary per observation, e.g. a continuous fill, are respected for each individual shape, whether grouping is implicit or explicitly shared with group = 1. A fill of NA or "transparent" renders the outline only: for shapes such as the "bowl" set, this hides the steam while retaining the bowl outline.

In addition to the supported aesthetics below, nudge_x, nudge_y, hjust and vjust are also respected.

Value

A geom layer that can be added to a ggplot.

Aesthetics

geom_casting() understands the following aesthetics (required aesthetics are in bold):

Learn more about setting these aesthetics in vignette("ggplot2-specs")

Examples

library(ggplot2)

# "Baby violin" shape by default
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_casting()

# Change shape & fill
p + geom_casting(shape = "box", fill = "lightgreen")

# Shapes mapped to a variable
ggplot(mtcars, aes(wt, mpg, fill = factor(cyl))) +
  geom_casting(aes(shape = factor(cyl))) +
  scale_shape_manual(values = c("violin", "dendro", "box"))

# Continuous fill varies per observation, without a grouping workaround
ggplot(data.frame(x = 1:7, temperature = c(5, 18, 32, 47, 63, 81, 96)),
       aes(x, 1, fill = temperature)) +
  geom_casting(shape = "bowl2", colour = "#272626", size = 0.72) +
  scale_fill_viridis_c(limits = c(0, 100)) +
  scale_x_continuous(limits = c(0.35, 7.65), expand = expansion(mult = 0)) +
  scale_y_continuous(limits = c(0, 1.85), expand = expansion(mult = 0))

Get the names of available shapes

Description

[Experimental]

Create a data frame of available shapes and associated sets. This may be filtered and used as a vector of strings in scale_shape_manual().

Usage

shapes_cast()

Value

A data frame of available sets and shapes.

Examples

# Returns a data frame of available shapes
shapes_cast()