— Load packages —

library(tidyverse) library(lubridate)

— Tickers —

tickers <- c(“AAPL”,“AMD”,“MU”,“NIO”,“NVDA”,“PRPL”,“SNAP”,“TSLA”)

— Generate synthetic stock data —

set.seed(42)

dates <- seq(as.Date(“2016-01-01”), as.Date(“2024-12-31”), by = “day”) %>% .[weekdays(.) %in% c(“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”)]

df <- map_dfc(tickers, function(t) { price <- cumprod(1 + rnorm(length(dates), 0.0005, 0.02)) * 10 tibble(!!t := price) }) %>% mutate(Date = dates) %>% relocate(Date)

Long format

long_df <- df %>% pivot_longer(-Date, names_to = “Stock”, values_to = “Price”)

============================

1) NORMALIZED PLOT

============================

norm_df <- long_df %>% group_by(Stock) %>% mutate(NormPrice = Price / first(Price)) %>% ungroup()

p1 <- ggplot(norm_df, aes(x = Date, y = NormPrice, color = Stock)) + geom_line(size = 0.9) + theme_minimal(base_size = 14) + labs( title = “Normalized Stock Prices (2016–2024)”, x = “Date”, y = “Normalized price (Base = $1)” )

print(p1)

============================

2) SMALL MULTIPLES PLOT

============================

p2 <- ggplot(long_df, aes(Date, Price)) + geom_line(size = 0.8, color = “black”) + facet_wrap(~Stock, scales = “free_y”, ncol = 3) + # 3 columns works fine theme_bw(base_size = 13) + labs( title = “Sampled Stock Prices (Individual Tickers)”, x = “Date”, y = “Closing prices” )

print(p2)