The ggicons package lets you visualise data with icons in ggplot2. It draws vector icons from the icons package directly in a ggplot2 plot. Icons can be mapped to data and drawn like points, placed at fixed positions as annotations, substituted in for axis, strip and legend labels, or repeated in a grid as an isotype-style pictogram (all styled with colour, size, alpha and angle aesthetics).
You can install the released version of ggicons from CRAN with:
install.packages("ggicons")
You can install the development version from GitHub with:
# install.packages("remotes")
# remotes::install_github("mitchelloharawild/ggicons")
install.packages("ggicons", repos = c('https://mitchelloharawild.r-universe.dev', 'https://cloud.r-project.org'))
library(ggplot2)
library(ggicons)
library(icons)
geom_icon()
geom_icon() draws an icon per row at (x, y), in place of a point.
Map an icon vector from the icons package
(e.g. icons::fontawesome$solid$rocket) to the icon aesthetic, and
style it with the usual colour, size, alpha and angle
aesthetics:
df <- data.frame(
x = 1:3, y = c(1, 3, 2),
icon = c(
fontawesome$solid$rocket,
fontawesome$solid$star,
fontawesome$solid$heart
)
)
ggplot(df, aes(x, y, icon = icon)) +
geom_icon(size = 12, colour = "steelblue")
If the icon aesthetic is already mapped to icon values,
scale_icon_identity() passes them through unchanged. To map a discrete
data column (e.g. a category) to an icon instead, use
scale_icon_manual(). There’s no automatic discrete palette for icons,
so values is always required. Since icon vectors can’t be named,
values is matched positionally against the sorted data levels by
default; pass limits to match against a different order instead:
df <- data.frame(
x = 1:3, y = c(1, 3, 2),
type = c("rocket", "star", "heart")
)
ggplot(df, aes(x, y, icon = type, colour = type)) +
geom_icon(size = 12) +
scale_icon_manual(
limits = c("rocket", "star", "heart"),
values = c(
fontawesome$solid$rocket,
fontawesome$solid$star,
fontawesome$solid$heart
)
) +
scale_colour_manual(
limits = c("rocket", "star", "heart"),
values = c(rocket = "steelblue", star = "goldenrod", heart = "firebrick")
)
Icons drawn with geom_icon() also appear as their own legend key
glyph, via draw_key_icon(), so the legend shows the actual icon shape
instead of a generic point.
annotation_icon() adds one or more icons at fixed (x, y) positions,
the icon analogue of annotate(). Unlike annotation_custom(), it
does train the panel’s position scales, so placing an icon outside the
data’s range still expands the axes to fit it:
ggplot(data.frame(x = 1:3, y = c(1, 3, 2)), aes(x, y)) +
geom_point() +
annotation_icon(
icon = fontawesome$solid$rocket,
x = 2, y = 3, size = 14, colour = "steelblue"
)
element_icon() is a theme() element, parallel to element_text(),
for use in axis.text, strip.text, legend.text and similar
text-drawing theme settings. Any label matching a name in its icons
lookup is drawn as that icon; every other label falls back to ordinary
text:
battery <- list(
`4` = fontawesome$solid$`battery-quarter`,
`6` = fontawesome$solid$`battery-half`,
`8` = fontawesome$solid$`battery-full`
)
ggplot(mtcars, aes(factor(cyl), mpg)) +
geom_boxplot() +
labs(x = "Cylinders") +
theme(axis.text.x = element_icon(icons = battery, size = 16))
geom_pictogram()
geom_pictogram() draws a value as a grid of repeated icons, some
fraction of them filled in and the rest left faded, the way an isotype
chart uses “each icon = n units” instead of a bar’s length. Leaving y
out of aes() grows the grid upward like a column chart, with value
mapped to how many icons are filled and icon/colour mapped to
category:
commutes <- data.frame(mode = c("Bicycle", "Car"), count = c(890, 1230))
ggplot(commutes, aes(mode, value = count, icon = mode, colour = mode)) +
geom_pictogram(ncol = 5) +
scale_icon_manual(values = c(fontawesome$solid$bicycle, fontawesome$solid$car)) +
scale_colour_manual(values = c("steelblue", "firebrick")) +
labs(x = NULL, value = "commuters")
Each icon stands for a fixed amount (here, 20 commuters);
guide_pictogram() spells this ratio out in the legend automatically.