Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot2: how to add text to multiple vertical lines (geom_vlines) on a time x-axis?

Tags:

r

ggplot2

Please have a look at the following example

library(dplyr)
library(lubridate)
library(ggplot2)
data <- data_frame(time = c(ymd(20160201),
                            ymd(20160202),
                            ymd(20160203),
                            ymd(20160201),
                            ymd(20160202)),
                            value = c(1,1,1,2,2), 
                            group = c('A','A','B','B','B'))

events <- data_frame(time = c(ymd(20160201), 
                              ymd(20160202)),
                     text = c('who let the dogs out?',
                              'who? who? who?'))

ggplot(data, aes(x = time, y = value, group = group, color = group)) + 
  geom_line(size = 2 ) +
  geom_vline(data = events, aes(xintercept = as.numeric(time)))  

> data
# A tibble: 5 × 3
        time value group
      <date> <dbl> <chr>
1 2016-02-01     1     A
2 2016-02-02     1     A
3 2016-02-03     1     B
4 2016-02-01     2     B
5 2016-02-02     2     B

> events
# A tibble: 2 × 2
        time                  text
      <date>                 <chr>
1 2016-02-01 who let the dogs out?
2 2016-02-02        who? who? who?

I would like to get a line chart for the variable value for each group (A and B) and plot vertical lines every time there is an event in the events dataframe.

Using the ideas ggplot vertical line with date axis, How to get a vertical geom_vline to an x-axis of class date? and How to add legend for vertical lines in ggplot? I can easily do that:

ggplot(data, aes(x = time, y = value, group = group, color = group)) + 
  geom_line(size = 2 ) +
  geom_vline(data = events, aes(xintercept = as.numeric(time)))

enter image description here

The problem is that I would like to label each vertical line (each event) with the corresponding text, as in R ggplot2: Labelling a horizontal line on the y axis with a numeric value.

Unfortunately, doing the following does not work

ggplot(data, aes(x = time, y = value, group = group, color = group)) + 
  geom_line(size = 2 ) +
  geom_vline(data = events, aes(xintercept = as.numeric(time)))  +
  geom_text(data = events, aes(x = as.numeric(time), y = 0, label = text))

What is wrong here? any ideas? Thanks!

like image 423
ℕʘʘḆḽḘ Avatar asked Dec 19 '16 22:12

ℕʘʘḆḽḘ


1 Answers

You can try

ggplot(data, aes(x = time)) + 
  geom_line(aes(y = value, group = group, color = group), size = 2 ) +
  geom_vline(data = events, aes(xintercept = as.numeric(time)))  +
  geom_text(data = events, mapping = aes(label = text, y = 0), angle = 60, hjust = 0)

enter image description here

like image 145
lukeA Avatar answered Nov 02 '22 09:11

lukeA