Home > Software design >  How to specify unique geom assignments to facets?
How to specify unique geom assignments to facets?

Time:12-28

Below I have simulated a dataset where an assignment was given to 5 groups of individuals on 5 different days (a new group with 200 new individuals each day). TrialStartDate denotes the date on which the assignment was given to each individual (ID), and TrialEndDate denotes when each individual finished the assignment.

set.seed(123)
data <- 
  data.frame(
    TrialStartDate = rep(c(sample(seq(as.Date('2019/02/01'), as.Date('2019/02/15'), by="day"), 5)), each = 200),
    TrialFinishDate = sample(seq(as.Date('2019/02/01'), as.Date('2019/02/15'), by = "day"), 1000,replace = T),
    ID = seq(1,1000, 1)
  )

I am interested in comparing how long individuals took to complete the trial depending on when they started the trial (i.e., assuming TrialStartDate has an effect on the length of time it takes to complete the trial).

To visualize this, I want to make a barplot showing counts of IDs on each TrialFinishDate where bars are colored by TrialStartDate (since each TrialStartDate acts as a grouping variable). The best I have come up with so far is by faceting like this:

data%>%
  group_by(TrialStartDate, TrialFinishDate)%>%
  count()%>%
  ggplot(aes(x = TrialFinishDate, y = n,  col = factor(TrialStartDate), fill = factor(TrialStartDate))) 
  geom_bar(stat = "identity") 
  facet_wrap(~TrialStartDate, ncol = 1)

enter image description here

However, I also want to add a vertical line to each facet showing when the TrialStartDate was for each group (preferably colored the same as the bars). When attempting to add vertical lines with geom_vline, it adds all the lines to each facet:

data%>%
  group_by(TrialStartDate, TrialFinishDate)%>%
  count()%>%
  ggplot(aes(x = TrialFinishDate, y = n,  col = factor(TrialStartDate), fill = factor(TrialStartDate))) 
  geom_bar(stat = "identity") 
  geom_vline(xintercept = unique(data$TrialStartDate)) 
  facet_wrap(~TrialStartDate, ncol = 1)

enter image description here

How can we make the vertical lines unique to the respective group in each facet?

CodePudding user response:

You're specifying xintercept outside of aes, so the faceting is not respected.

This should do the trick:

data %>%
  group_by(TrialStartDate, TrialFinishDate)%>%
  count()%>%
  ggplot(aes(x = TrialFinishDate, y = n,  col = factor(TrialStartDate), fill = factor(TrialStartDate))) 
  geom_bar(stat = "identity") 
  geom_vline(aes(xintercept = TrialStartDate)) 
  facet_wrap(~TrialStartDate, ncol = 1)

Note geom_vline(aes(xintercept = TrialStartDate))

  • Related