---
title: "geom_pop()"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{03 geom_pop()}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
dpi = 150,
fig.asp = .9,
fig.width = 6,
fig.height = 5,
out.width = "70%",
fig.align = "center",
message = FALSE,
warning = FALSE
)
library(ggpop)
library(ggplot2)
library(dplyr)
```
`geom_pop()` draws icon-based population grids. Add an `icon` column to your
data, then map `icon` and `color` in `aes()`. Do not map `x` or `y` -- layout
is computed internally.
## Basic usage
```{r basic}
df_raw <- data.frame(
activity = c("Running", "Cycling", "Swimming", "Walking"),
n = c(28, 22, 18, 32)
)
df_plot <- process_data(
data = df_raw,
group_var = activity,
sum_var = n,
sample_size = 30
) %>%
mutate(icon = case_when(
type == "Running" ~ "person-running",
type == "Cycling" ~ "person-biking",
type == "Swimming" ~ "person-swimming",
type == "Walking" ~ "person-walking"
))
ggplot() +
geom_pop(
data = df_plot,
aes(icon = icon, color = type),
size = 3, dpi = 72
) +
scale_color_manual(values = c(
Running = "#e76f51",
Cycling = "#2a9d8f",
Swimming = "#457b9d",
Walking = "#e9c46a"
)) +
theme_pop() +
scale_legend_icon(size = 7) +
labs(title = "Preferred physical activity", color = NULL)
```
Verify icon names with `fa_icons(query = "biking")` and `fa_icons(query = "swimming")` as Font Awesome naming can vary slightly by version.
## Faceted chart
Use `high_group_var` for the facet panel variable and `group_var` for the
color/icon variable within each panel. Icons from different groups scatter
and mix across each panel by default (`arrange = FALSE`).
```{r facet}
df_raw <- data.frame(
region = c("North", "North", "North",
"South", "South", "South",
"East", "East", "East",
"West", "West", "West"),
work_type = c("Office", "Remote", "Hybrid",
"Office", "Remote", "Freelance",
"Remote", "Hybrid", "Freelance",
"Office", "Hybrid", "Freelance"),
n = c(40, 35, 25,
20, 45, 35,
50, 30, 20,
30, 40, 30)
)
df_plot <- process_data(
data = df_raw,
group_var = work_type,
sum_var = n,
sample_size = 10,
high_group_var = "region"
) %>%
mutate(icon = case_when(
type == "Office" ~ "building",
type == "Remote" ~ "house",
type == "Hybrid" ~ "shuffle",
type == "Freelance" ~ "mug-hot"
))
ggplot() +
geom_pop(
data = df_plot,
aes(icon = icon, color = type),
size = 2, dpi = 72, facet = group
) +
facet_wrap(~ group, ncol = 2) +
scale_color_manual(values = c(
Office = "#2a9d8f",
Remote = "#e76f51",
Hybrid = "#457b9d",
Freelance = "#e9c46a"
)) +
theme_pop() +
labs(title = "Work type by region", color = NULL)
```
## Clustered layout
`arrange = TRUE` groups icons by category instead of scattering them.
```{r arrange}
df_browser <- data.frame(
browser = c("Chrome", "Firefox", "Safari"),
n = c(45, 20, 25)
)
df_browser_plot <- process_data(
data = df_browser,
group_var = browser,
sum_var = n,
sample_size = 20
) %>%
mutate(icon = case_when(
type == "Chrome" ~ "chrome",
type == "Firefox" ~ "firefox",
type == "Safari" ~ "safari",
type == "Edge" ~ "edge"
))
ggplot() +
geom_pop(
data = df_browser_plot,
aes(icon = icon, color = type),
size = 2, dpi = 72, arrange = TRUE
) +
scale_color_manual(values = c(
Chrome = "#4285F4",
Firefox = "#FF7139",
Safari = "#006CFF",
Edge = "#0078D7"
)) +
theme_pop() +
theme(legend.position = "bottom") +
labs(title = "Browser market share", color = NULL)
```
## Key parameters
| Parameter | Default | Description |
|:---|:---|:---|
| `size` | `2` | Icon size |
| `dpi` | `100` | Render resolution |
| `arrange` | `FALSE` | Cluster icons by group |
| `legend_icons` | `FALSE` | Show icons in legend |
| `seed` | `NULL` | Fix random layout |
| `facet` | `NULL` | Column driving facet panels |