Skip to content

Instantly share code, notes, and snippets.

@trinker
Created April 2, 2018 16:29
Show Gist options
  • Select an option

  • Save trinker/3c29fd8ea266c5e078649506fad5f190 to your computer and use it in GitHub Desktop.

Select an option

Save trinker/3c29fd8ea266c5e078649506fad5f190 to your computer and use it in GitHub Desktop.
Multiple layers over time w/ geom_box months
if (!require("pacman")) install.packages("pacman"); library(pacman)
p_load(tidyverse, numform, viridis, ggrepel, lexicon)
p_load_current_gh('trinker/plotflow')
set.seed(13)
dat <- data_frame(
revenue = rnorm(5000, 50000, 5000),
date = sample(seq(as.Date('1999/01/01'), as.Date('1999/12/31'), by="day"), 5000, TRUE),
site = sample(paste("Site", 1:5), 5000, TRUE),
sales_person = sample(f_title(sample(lexicon::common_names, 15)), 5e3, TRUE)
) %>%
mutate(
mon = factor(format(date, format = '%b'), levels = constant_months_abbreviation)
) %>%
group_by(mon) %>%
mutate(
revenue = {if(sample(0:1, 1) == 0) `-` else `+`}(revenue, sample(1e2:1e4, 1)),
observe = revenue > 7.05e4 | revenue < 3.0e4
) %>%
ungroup()
mondat <- data_frame(
xmin = seq(as.Date('1999/01/01'), as.Date('1999/12/01'), by="month"),
xmax = seq(as.Date('1999/02/01'), as.Date('2000/01/01'), by="month"),
mon = factor(format(xmin, format = '%b'), levels = constant_months_abbreviation)
) %>%
group_by(mon) %>%
mutate(xmid = mean(c(xmin, xmax)))
sumdat <- dat %>%
group_by(mon) %>%
summarize(revenue = mean(revenue)) %>%
left_join(mondat)
sumdat2 <- dat %>%
group_by(mon) %>%
summarize(med = median(revenue), upper = quantile(revenue, .90), lower = quantile(revenue, .10)) %>%
left_join(mondat)
se <- function(x) sqrt(var(x)/length(x))
sumdat3 <- dat %>%
group_by(mon) %>%
summarize(med = mean(revenue), upper = mean(revenue) + 1.96 * se(revenue), lower = mean(revenue) - 1.96 * se(revenue)) %>%
left_join(mondat)
set.seed(11)
ggplot(dat) +
geom_rect(data = mondat,
aes(xmin = xmin, xmax = xmax, ymin = 2e4, ymax = Inf, fill = mon),
alpha = .1
) +
geom_jitter(height = 0, width = 1, aes(x = date, y = revenue, alpha = observe)) +
geom_text(data = mondat, aes(x = xmid, y = 8.2e4, label = mon)) +
geom_hline(data = summarize(dat, revenue = mean(revenue)),
aes(yintercept = revenue),
linetype = 'dashed', color = 'grey10', size = .7
) +
#geom_segment(
# data = sumdat,
# aes(y = revenue, yend = revenue, x = xmin, xend = xmax),
# color = 'gray45', size = .9#, linetype = 'dotted'
#) +
geom_pointrange(data = sumdat2, aes(x = xmid, y = med, ymin = lower, ymax = upper)) +
geom_smooth(aes(x = date, y = revenue), color = 'blue', fill = NA) +
theme_minimal() +
scale_y_continuous(labels = numform::ff_denom(prefix = '$')) +
theme(
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
legend.position = 'none',
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
) +
scale_fill_manual(values = rep(c('grey60', 'white'), 6)) +
labs(
y = 'Revenue', x = 'Date'
) +
scale_alpha_discrete(range = c(.05, 1)) +
geom_text_repel(
data = subset(dat, observe),
aes(label = sales_person, x = date, y = revenue),
size = 3,
color = 'grey60',
box.padding = 0.25,
point.padding = 0.3,
)
ggsave('multiple_geoms.pdf', width = 12, height = 5)
@trinker

trinker commented Apr 2, 2018

Copy link
Copy Markdown
Author

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment