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")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.