Skip to content
R for the Rest of Us Logo

This lesson is locked

Get access to all lessons in this course.

If the video is not playing correctly, you can watch it in a new window

Transcript

Click on the transcript to go to that point in the video. Please note that transcripts are auto generated and may contain minor inaccuracies.

View code shown in video
---
title: "Portland Public Schools Math Proficiency Report"
format: 
  revealjs:
    theme: moon
    footer: "Math Proficiency Report"
    logo: "portland-public-schools-logo.svg"
execute: 
  echo: false
  warning: false
  message: false
editor_options: 
  chunk_output_type: console
---

```{r}
library(tidyverse)
library(fs)
library(scales)
library(ggrepel)
library(ggtext)
library(ragg)
library(here)
library(flextable)
```


```{r}
third_grade_math_proficiency <- 
  read_rds(here("data/third_grade_math_proficiency.rds")) |> 
  select(academic_year, school, school_id, district, proficiency_level, number_of_students) |> 
  mutate(is_proficient = case_when(
    proficiency_level >= 3 ~ TRUE,
    .default = FALSE
  )) |> 
  group_by(academic_year, school, district, school_id, is_proficient) |> 
  summarize(number_of_students = sum(number_of_students, na.rm = TRUE)) |> 
  ungroup() |> 
  group_by(academic_year, school, district, school_id) |> 
  mutate(percent_proficient = number_of_students / sum(number_of_students, na.rm = TRUE)) |> 
  ungroup() |> 
  filter(is_proficient == TRUE) |> 
  select(academic_year, school, district, percent_proficient) |> 
  rename(year = academic_year) |> 
  mutate(percent_proficient = case_when(
    is.nan(percent_proficient) ~ NA,
    .default = percent_proficient
  )) |> 
  mutate(percent_proficient_formatted = percent(percent_proficient,
                                                accuracy = 1))
```

```{r}
theme_dk <- function() {
  
  theme_minimal(base_family = "IBM Plex Mono") +
    theme(axis.title = element_blank(),
          axis.text = element_text(color = "grey60",
                                   size = 10),
          plot.title = element_markdown(),
          plot.title.position = "plot",
          panel.grid = element_blank(),
          legend.position = "none")
  
}
```


## Chart

The chart below shows math proficiency for all PPS schools.

```{r}
#| fig-height: 5
#| fig-alt: A line chart showing math proficiency rates among all PPS schools in 2018-2019 and 2021-2022

top_growth_school <- 
  third_grade_math_proficiency |>
  filter(district == "Portland SD 1J") |> 
  group_by(school) |> 
  mutate(growth_from_previous_year = percent_proficient - lag(percent_proficient)) |> 
  ungroup() |> 
  drop_na(growth_from_previous_year) |>
  slice_max(order_by = growth_from_previous_year,
            n = 1) |> 
  pull(school)

third_grade_math_proficiency |>
  filter(district == "Portland SD 1J") |>
  mutate(highlight_school = case_when(
    school == top_growth_school ~ "Y",
    .default = "N"
  )) |> 
  mutate(percent_proficient_formatted = case_when(
    highlight_school == "Y" & year == "2021-2022" ~ str_glue("{percent_proficient_formatted} of students
                                                             were proficient
                                                             in {year}"),
    highlight_school == "Y" & year == "2018-2019" ~ percent_proficient_formatted,
    .default = NA
  )) |> 
  mutate(school = fct_relevel(school, top_growth_school, after = Inf)) |>
  ggplot(aes(x = year,
             y = percent_proficient,
             group = school,
             color = highlight_school,
             label = percent_proficient_formatted)) +
  geom_line() +
  geom_text_repel(hjust = 0,
                  lineheight = 0.9,
                  family = "IBM Plex Mono",
                  direction = "x") +
  scale_color_manual(values = c(
    "N" = "grey90",
    "Y" = "orange"
  )) +
  scale_y_continuous(labels = percent_format()) +
  scale_x_discrete(expand = expansion(mult = c(0.05, 0.5))) +
  annotate(geom = "text",
           x = 2.02,
           y = 0.6,
           hjust = 0,
           lineheight = 0.9,
           color = "grey70",
           family = "IBM Plex Mono",
           label = str_glue("Each grey line
                            represents one school")) +
  labs(title = str_glue("<b style='color: orange;'>{top_growth_school}</b> showed large growth<br>in math proficiency over the last two years")) +
  theme_dk()
```

# Table {background-color="red"}

```{r}
#| tbl-cap: Math proficiency among third graders in five Portland schools

flextable_data <- 
  read_rds(here("data/third_grade_math_proficiency_dichotomous.rds")) |> 
  filter(district == "Portland SD 1J") |> 
  filter(school %in% c("Abernethy Elementary School",
                       "Ainsworth Elementary School",
                       "Alameda Elementary School",
                       "Arleta Elementary School",
                       "Atkinson Elementary School")) |> 
  select(year, school, percent_proficient_formatted) |> 
  arrange(school) |> 
  pivot_wider(id_cols = school,
              names_from = year,
              values_from = percent_proficient_formatted)


flextable_data |> 
  flextable() |> 
  set_header_labels(school = "School") |> 
  align(j = 2, align = "center") |> 
  # width(j = 1, width = 10) |> 
  autofit() |> 
  set_caption("Math proficiency among third graders in five Portland schools")
```

# Columns

:::: {.columns}

::: {.column width="50%"}
```{r}
flextable_data |> 
  flextable() |> 
  set_header_labels(school = "School") |> 
  align(j = 2, align = "center") |> 
  # width(j = 1, width = 10) |> 
  autofit() |> 
  set_caption("Math proficiency among third graders in five Portland schools")
```

:::

::: {.column width="50%"}
```{r}
third_grade_math_proficiency |>
  filter(district == "Portland SD 1J") |>
  mutate(highlight_school = case_when(
    school == top_growth_school ~ "Y",
    .default = "N"
  )) |> 
  mutate(percent_proficient_formatted = case_when(
    highlight_school == "Y" & year == "2021-2022" ~ str_glue("{percent_proficient_formatted} of students
                                                             were proficient
                                                             in {year}"),
    highlight_school == "Y" & year == "2018-2019" ~ percent_proficient_formatted,
    .default = NA
  )) |> 
  mutate(school = fct_relevel(school, top_growth_school, after = Inf)) |>
  ggplot(aes(x = year,
             y = percent_proficient,
             group = school,
             color = highlight_school,
             label = percent_proficient_formatted)) +
  geom_line() +
  geom_text_repel(hjust = 0,
                  lineheight = 0.9,
                  family = "IBM Plex Mono",
                  direction = "x") +
  scale_color_manual(values = c(
    "N" = "grey90",
    "Y" = "orange"
  )) +
  scale_y_continuous(labels = percent_format()) +
  scale_x_discrete(expand = expansion(mult = c(0.05, 0.5))) +
  annotate(geom = "text",
           x = 2.02,
           y = 0.6,
           hjust = 0,
           lineheight = 0.9,
           color = "grey70",
           family = "IBM Plex Mono",
           label = str_glue("Each grey line
                            represents one school")) +
  labs(title = str_glue("<b style='color: orange;'>{top_growth_school}</b> showed large growth<br>in math proficiency over the last two years")) +
  theme_dk()
```

:::

::::

Your Turn

  1. Turn your report into a Revealjs presentation

  2. Put content in columns and using incremental reveal

  3. Adjust the look-and-feel of your presentation by adding a logo and footer text, adjusting slide backgrounds, and using a custom theme

  4. Practice presenting using Revealjs slides

Refer to the Quarto Revealjs documentation to help.

Learn More

If you want to see custom Revealjs themes, check out the Extensions page.

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

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

Alberto Cabrera

Alberto Cabrera

March 29, 2024

On your lecture (7:03 minute), you mentioned you created a keyboard shortcut to create columns. I tried to create it using MacOS, but did not work. ChatGt could not help me in locating Markdown shortcuts . I wonder if you could share references as to how to create them. Many thanks. .:::: {.columns}

::: {.column width="50%"}

:::

::: {.column width="50%"}

:::

::::

Libby Heeren

Libby Heeren Coach

March 29, 2024

Hi, Alberto! David says "keyboard shortcut" in the video, but he's actually using a "snippet" in RStudio, which you can find more about here: https://rstudio.github.io/rstudio-extensions/rstudio_snippets.html

Alberto Cabrera

Alberto Cabrera

March 29, 2024

Thanks for solving the mystery.

Alberto Cabrera

Alberto Cabrera

March 29, 2024

Hi Libby,

I wonder if this is what David created, a function.

skeleton_columns<- function() { cat("::::: {.columns}\n") cat("::: {.column width="50%"}\n") cat(":::\n") cat("::: {.column width="50%"}\n") cat(":::\n") cat("::::\n") }

What is not clear to me is how one can save this function in RStudio and call it upon.

Libby Heeren

Libby Heeren Coach

March 29, 2024

He is using a snippet. If you play it back slowly, you'll see him type ".clm" and hit enter. This is how snippets work. There are many built in to RStudio that you can test now if you like. Try typing "lib" into a script and then wait - you'll see a menu pop up with the library snippet. If you hit enter, the snippet materializes where you had typed "lib" before. Here is some more information on snippets: https://dcl-workflow.stanford.edu/rstudio-snippets.html

Alberto Cabrera

Alberto Cabrera

March 29, 2024

Thank you for solving the puzzle.

Alberto Cabrera

Alberto Cabrera

March 30, 2024

Thanks to you I was finally able to replicate David snippet

snippet twocolumn { cat( ":::: {.columns}\n", "\n", "::: {.column width='50%'}\n", "\n", ":::\n", "\n", "::: {.column width='70%'}\n", "\n", ":::\n", "\n", "::::\n", sep = "" ) }