Below is a graph comparing weekly news stories that mentioned both President Donald Trump and immigration along with stories that mentioned both President Donald Trump and the Supreme Court from January 1, 2026, through September 1, 2026.
This data was collected using Media Cloud, which tracks and analyzes news coverage from a large collection of media sources. Throughout most of the period, stories mentioning Trump and immigration outnumbered stories mentioning Trump and the Supreme Court. A notable peak occurred early in the year when coverage of Trump and immigration increased sharply, likely reflecting heightened media attention to immigration-related policies and debates such as the ICE presence in Minnesota at the time. Coverage connecting Trump and the Supreme Court was lower overall but remained relatively steady. However, on two occasions, stories mentioning Trump and the Supreme Court surpassed stories mentioning Trump and immigration. These peaks may reflect periods when major court decisions or legal debates involving the Trump administration, including discussions related to birthright citizenship and mail voting, received increased media attention.
| topic | Total_Stories | Weekly_Minimum | Weekly_Maximum | Weekly_Mean |
|---|---|---|---|---|
| Trump AND Immigration | 64022 | 379 | 5545 | 1778.39 |
| Trump AND Supreme Court | 36596 | 224 | 2168 | 1016.56 |
############################################################
# STEP 1: Install and Load Packages
############################################################
if (!require("tidyverse")) install.packages("tidyverse")
if (!require("httr2")) install.packages("httr2")
if (!require("lubridate")) install.packages("lubridate")
if (!require("kableExtra")) install.packages("kableExtra")
library(tidyverse)
library(httr2)
library(lubridate)
library(kableExtra)
############################################################
# STEP 2: Verify Media Cloud API Key
############################################################
if (!nzchar(Sys.getenv("MEDIACLOUD_KEY"))) {
stop(
"No Media Cloud API key was found.\n",
"Please save your key to .Renviron first."
)
}
############################################################
# STEP 3: Define Two Topics
############################################################
# Replace the topic labels and search queries below.
#
# Examples:
# "artificial intelligence"
# "climate change"
# "immigration"
# "inflation"
topics <- c(
"Trump AND Immigration" = "\"Trump\" AND \"immigration\"",
"Trump AND Supreme Court" = "\"Trump\" AND \"Supreme Court\""
)
############################################################
# STEP 4: Define the Date Range
############################################################
start_date <- "2026-01-01"
end_date <- "2026-09-01"
############################################################
# STEP 5: Create a Function to Download
# Daily Story Counts
############################################################
get_counts <- function(query) {
response <-
request(
"https://search.mediacloud.org/api/search/count-over-time"
) |>
req_headers(
Authorization = paste(
"Token",
Sys.getenv("MEDIACLOUD_KEY")
)
) |>
req_url_query(
q = query,
start = start_date,
end = end_date,
platform = "onlinenews-mediacloud",
cs = 34412234
) |>
req_perform()
results <-
response |>
resp_body_json()
map_dfr(
results$count_over_time$counts,
as_tibble
) |>
mutate(
date = as.Date(date)
)
}
############################################################
# STEP 6: Download Data for Both Topics
############################################################
topic_data <-
imap_dfr(
topics,
function(search_query, topic_name) {
message("Downloading: ", topic_name)
get_counts(search_query) |>
mutate(
topic = topic_name
)
}
)
############################################################
# STEP 7: Examine the Downloaded Data
############################################################
head(topic_data)
glimpse(topic_data)
############################################################
# STEP 8: Calculate Weekly Story Counts
############################################################
weekly_counts <-
topic_data |>
mutate(
week = floor_date(date, unit = "week")
) |>
group_by(topic, week) |>
summarise(
stories = sum(count),
.groups = "drop"
)
weekly_table <- weekly_counts |>
arrange(topic, week) |>
kbl(
caption = "Weekly Media Cloud Story Counts"
) |>
kable_styling(
full_width = FALSE,
bootstrap_options = c(
"striped",
"hover"
)
)
############################################################
# STEP 9: Display Weekly Counts
############################################################
weekly_table <- weekly_counts |>
arrange(topic, week) |>
kbl(
caption = "Weekly Media Cloud Story Counts"
) |>
kable_styling(
full_width = FALSE,
bootstrap_options = c(
"striped",
"hover"
)
)
weekly_table
############################################################
# STEP 10: Summarize Total Coverage
############################################################
topic_summary <-
weekly_counts |>
group_by(topic) |>
summarise(
Total_Stories = sum(stories),
Weekly_Minimum = min(stories),
Weekly_Maximum = max(stories),
Weekly_Mean = round(mean(stories), 2),
.groups = "drop"
) |>
arrange(desc(Total_Stories)) |>
kbl(
caption = "Coverage Summary by Topic"
) |>
kable_styling(
full_width = FALSE,
bootstrap_options = c(
"striped",
"hover"
)
)
############################################################
# STEP 11: Create a Line Graph
############################################################
weekly_plot <- weekly_counts |>
ggplot(
aes(
x = week,
y = stories,
color = topic
)
) +
geom_line(linewidth = 1) +
geom_point(size = 2) +
labs(
title = "Weekly Media Coverage Volume",
subtitle = "Comparison of Two Topics",
x = "Week",
y = "Number of Stories",
color = "Topic"
) +
theme_minimal()
############################################################
# STEP 12: Save Results as a CSV File
############################################################
write_csv(
weekly_counts,
"weekly_story_counts.csv"
)