Skip to content
Coming soon: Ally. Your guide to the world of AI and R. Learn More →
R for the Rest of Us Logo

R in 3 Months (Fall 2026)

Week 11 Live Session (Fall 2026)

View code shown in video

Theme code

library(tidyverse)
library(palmerpenguins)

# Theme -------------------------------------------------------------------

theme_dk <- function(hide_gridlines = TRUE, hide_legend = TRUE) {
  my_theme <-
    theme_minimal() +
    theme(
      axis.title = element_blank(),
      axis.text = element_text(
        color = "grey60",
        size = 18
      )
    )

  if (hide_gridlines == TRUE) {
    my_theme <-
      my_theme +
      theme(panel.grid = element_blank())
  }

  if (hide_legend == TRUE) {
    my_theme <-
      my_theme +
      theme(legend.position = "none")
  }

  my_theme
}

library(omni)


# Colors -----------------------------------------------------------------

scale_color_rru <- function(number_of_colors) {
  if (number_of_colors == 2) {
    my_brand_colors <-
      c(
        "#6cabdd",
        "#ff7400"
      )
  }

  if (number_of_colors == 3) {
    my_brand_colors <-
      c(
        "#6cabdd",
        "#ff7400",
        "darkgreen"
      )
  }

  scale_color_manual(
    values = my_brand_colors
  )
}

theme_set(theme_dk())

penguins |>
  filter(island != "Dream") |>
  ggplot(
    aes(
      x = bill_length_mm,
      y = bill_depth_mm,
      color = island
    )
  ) +
  geom_point() +
  scale_color_rru(number_of_colors = 2) +
  theme_dk(hide_gridlines = FALSE)


# Plots -------------------------------------------------------------------

ggplot(
  data = penguins,
  aes(
    x = bill_length_mm,
    y = bill_depth_mm
  )
) +
  geom_point() +
  theme_dk(hide_gridlines = FALSE)

ggplot(
  data = penguins,
  aes(
    x = bill_length_mm,
    y = bill_depth_mm,
    color = island
  )
) +
  geom_point() +
  scale_color_manual(
    values = c(
      omni_colors("orange-red-600"),
      omni_colors("teal-200"),
      omni_colors("golden-yellow-400")
    )
  ) +
  theme_dk(hide_legend = FALSE) +
  theme(axis.title = element_text())

source("/users/davidkeyes/Desktop/functions.R")

Mapping code

library(tidyverse)
library(janitor)
library(sf)

# Portland ----------------------------------------------------------------

portland_boundaries <-
  read_sf("data-raw/City_Boundaries.geojson") |>
  clean_names() |>
  filter(cityname == "Portland")

portland_boundaries

portland_boundaries |>
  ggplot() +
  geom_sf() +
  theme_void()

traffic_signals <-
  read_sf("data-raw/Traffic_Signals.geojson") |>
  clean_names()

traffic_signals

traffic_signals |>
  ggplot() +
  geom_sf()

snow_and_ice_routes <-
  read_sf("data-raw/Snow_and_Ice_Routes.geojson") |>
  clean_names()

snow_and_ice_routes |>
  select(priority)

snow_and_ice_routes |>
  ggplot() +
  geom_sf(aes(color = priority))

ggplot() +
  geom_sf(
    data = portland_boundaries,
    fill = "gray80",
    alpha = 0.5
  ) +
  geom_sf(
    data = snow_and_ice_routes,
    alpha = 0.5
  ) +
  geom_sf(
    data = traffic_signals,
    aes(color = software_type),
    alpha = 0.5,
    size = 1
  ) +
  theme_dk(hide_gridlines = TRUE, hide_legend = FALSE) +
  theme(axis.text = element_blank())


# Tigris ------------------------------------------------------------------

library(tigris)

us_states <- states()

us_states

us_states |>
  shift_geometry() |>
  ggplot() +
  geom_sf()

kentucky_counties <- counties(state = "Kentucky")

kentucky_counties

kentucky_counties |>
  ggplot() +
  geom_sf()

# Median Income -----------------------------------------------------------

library(tidycensus)
library(scales)

median_income <-
  get_acs(
    state = "Illinois",
    geography = "county",
    variables = "B19013_001",
    geometry = TRUE
  )

median_income

median_income |>
  ggplot(aes(fill = estimate)) +
  geom_sf()


# Check-in break ----------------------------------------------------------

# International Data ------------------------------------------------------

library(rnaturalearth)

ne_countries()

ukraine <-
  ne_states(
    country = c("Ukraine")
  )

ukraine |>
  ggplot() +
  geom_sf()


# Mapview -----------------------------------------------------------------

library(mapview)

mapview(ukraine)


# Interactive -------------------------------------------------------------

library(ggiraph)

median_income_interactive_plot <-
  median_income |>
  mutate(estimate_formatted = dollar(estimate)) |>
  mutate(tooltip_text = str_glue("{NAME} {estimate_formatted}")) |>
  ggplot(aes(
    fill = estimate,
    tooltip = tooltip_text
  )) +
  geom_sf_interactive()

girafe(ggobj = median_income_interactive_plot)

Interactive data viz code

---
title: "Interactive Data Viz Example"
format: html
execute: 
  warning: false
  message: false
  echo: false
editor_options: 
  chunk_output_type: console
---

```{r}
library(tidyverse)
library(scales)
library(ggiraph)
```


```{r}
cbem <-
  read_csv(here::here("data-raw/cbem.csv"))
```

## Static Plot

```{r}
cbem |>
  filter(location == "Oregon") |>
  filter(age_group == "Under 18") |>
  filter(group != "All Persons") |>
  mutate(
    group = fct(
      group,
      levels = c(
        "American Indian or Alaska Native",
        "Asian or Pacific Islander",
        "Black or African American",
        "White",
        "Hispanic or Latino"
      )
    )
  ) |>
  mutate(x_position = row_number()) |>
  mutate(
    x_position = case_when(
      group == "Hispanic or Latino" ~ 5.5,
      .default = x_position
    )
  ) |>
  mutate(percent_formatted = percent(percent)) |>
  ggplot(
    aes(
      x = x_position,
      y = percent,
      fill = group,
      label = percent_formatted
    )
  ) +
  geom_col() +
  geom_text(
    vjust = 1.5,
    color = "white"
  ) +
  scale_fill_manual(
    values = c(
      "American Indian or Alaska Native" = "#9CC892",
      "Asian or Pacific Islander" = "#0066cc",
      "Black or African American" = "#477A3E",
      "White" = "#6CC5E9",
      "Hispanic or Latino" = "#ff7400"
    )
  ) +
  theme_void() +
  theme(legend.position = "none")
```


## Interactive Plot


```{r}
cbem_plot <-
  cbem |>
  filter(location == "Oregon") |>
  filter(age_group == "Under 18") |>
  filter(group != "All Persons") |>
  mutate(
    group = fct(
      group,
      levels = c(
        "American Indian or Alaska Native",
        "Asian or Pacific Islander",
        "Black or African American",
        "White",
        "Hispanic or Latino"
      )
    )
  ) |>
  mutate(x_position = row_number()) |>
  mutate(
    x_position = case_when(
      group == "Hispanic or Latino" ~ 5.5,
      .default = x_position
    )
  ) |>
  mutate(percent_formatted = percent(percent)) |>
  ggplot(
    aes(
      x = x_position,
      y = percent,
      fill = group,
      label = percent_formatted,
      tooltip = percent_formatted
    )
  ) +
  geom_col_interactive() +
  # geom_text(
  #   vjust = 1.5,
  #   color = "white"
  # ) +
  scale_fill_manual(
    values = c(
      "American Indian or Alaska Native" = "#9CC892",
      "Asian or Pacific Islander" = "#0066cc",
      "Black or African American" = "#477A3E",
      "White" = "#6CC5E9",
      "Hispanic or Latino" = "#ff7400"
    )
  ) +
  theme_void() +
  theme(legend.position = "none")

girafe(ggobj = cbem_plot)
```

Learn More

Have any questions? Put them below and we will help you out!

You need to be signed-in to comment on this post. Login.

Course Content

132 Lessons