ggplot: выравнивание графиков по точкам данных

У меня есть график с датой на оси x с некоторыми точками данных («вертикальными линиями»). А затем еще один график, который выглядит похожим, за исключением того, что линии нанесены на разные даты в зависимости от того, когда произошло «ActionType». График выглядит так, как я хочу, за исключением того, что я хочу выровнять ось x по левому краю на основе первого произошедшего типа действия. Я хочу сохранить интервал между датами возникновения типов действий.

Таким образом, вместо того, чтобы отображать все первые типы действий в соответствии с датой их возникновения, они будут отображаться в одной и той же точке (в абсолютной шкале, я полагаю?), но затем будет отображаться второе событие, отражающее интервал от первого события и так далее и тому подобное. Другой способ, которым я думаю об этом, - это смещение оси x нижних графиков, чтобы выровнять первые события на всех графиках.

Я пробовал начинать ось X с одной и той же точки для всех графиков, но это не работает, потому что линии отображаются в даты, когда они произошли. Я также пробовал facet_grid с scales= "free", но поскольку каждая ось x должна быть разной, я не думаю, что это сработает. Я хотел бы визуализировать 15 уникальных адресов электронной почты, но пока я начинаю с 3.

Мои данные выглядят так и называются email_2:

    email   ActionType  date
1   xxxx    Email   12/5/14
2   xxxx    Email   11/26/14
3   xxxx    won     9/28/14
4   xxxx    Email   11/26/14
5   xxxx    Email   11/6/14
6   xxxx    Email   11/26/14
7   xxxx    demo    12/1/14
8   xxxx    Demo    2/9/15
9   xxxx    Email   9/15/14
10  xxxx    trial   9/9/14
11  xxxx    Meeting 9/24/14
12  xxxx    Email   12/1/14
13  xxxx    Email   11/6/14
14  xxxx    Email   9/15/14
15  xxxx    Email   9/15/14
16  xxxx    Email   11/26/14
17  yyyy    Email   9/4/14
18  yyyy    trial   8/14/14
19  yyyy    Email   8/25/14
20  yyyy    Email   8/21/14
21  yyyy    won     9/3/14
22  yyyy    Email   9/11/14
23  yyyy    Email   8/21/14
24  yyyy    Email   11/6/14
25  yyyy    Email   8/21/14
26  yyyy    Email   11/6/14
27  yyyy    Email   11/6/14
28  yyyy    Email   8/21/14
29  yyyy    Email   11/6/14
30  yyyy    Email   8/21/14
31  yyyy    Email   8/29/14
32  yyyy    Email   8/21/14
33  zzzz    Email   11/6/14
34  zzzz    Email   11/6/14
35  zzzz    Email   9/18/14
36  zzzz    trial   9/17/14
37  zzzz    Email   9/18/14
38  zzzz    Email   12/5/14
39  zzzz    Email   11/6/14
40  zzzz    Email   11/6/14
41  zzzz    Email   12/15/14
42  zzzz    Email   9/19/14
43  zzzz    Email   11/6/14
44  zzzz    Email   12/3/14
45  zzzz    Email   12/3/14
46  zzzz    Email   12/15/14
47  zzzz    Email   10/1/14
48  zzzz    Email   12/5/14
49  zzzz    won     10/2/14
50  zzzz    Email   9/18/14

Мой код для создания визуального элемента выглядит следующим образом:

email_3 <- subset(email_2, email == 'xxxx')
p1 <- ggplot(data=email_3,aes(date,ActionType)) +
  scale_x_date(limits=as.Date(c("2014-08-14","2015-02-10"))) +
  scale_y_continuous(email_3$email, breaks=NULL, limits=c(0,1)) +
  geom_vline(data=email_3, mapping=aes(xintercept = as.numeric(date),   
  color=ActionType),size = 2,show_guide=F) +
  theme(axis.title.x=element_blank()) +
  theme(axis.title.y=element_text(angle=360))

email_4 <- subset(email_2, email == 'yyyy')
p2 <- ggplot(data=email_4,aes(date,ActionType)) +
  scale_x_date(limits=as.Date(c("2014-08-14", "2014-11-07"))) +
  scale_y_continuous(email_4$email, breaks=NULL, limits=c(0,1)) +
  geom_vline(data=email_4, mapping=aes(xintercept = as.numeric(date), 
  color=ActionType),size=2,show_guide=F) +
  theme(axis.title.x=element_blank()) +
  theme(axis.title.y=element_text(angle=360))

email_5 <- subset(email_2, email == 'zzzz')
p3 <- ggplot(data=email_5,aes(date,ActionType)) +
  scale_x_date(limits=as.Date(c("2014-08-14", "2014-12-16"))) +
  scale_y_continuous(email_5$email, breaks=NULL, limits=c(0,1)) +
  geom_vline(data=email_5, mapping=aes(xintercept = as.numeric(date), 
  color=ActionType),size=2,show_guide=T) +
  theme(legend.position="bottom") +
  theme(axis.title.x=element_blank()) +
  theme(axis.title.y=element_text(angle=360))

grid.arrange(p1,p2,p3, ncol=1)

person Hillary    schedule 10.04.2015    source источник


Ответы (1)


Почему бы не использовать фасетирование?

email_2 <- read.table(header = TRUE, text = '    email   ActionType  date
                     1   xxxx    Email   12/5/14
                     2   xxxx    Email   11/26/14
                     3   xxxx    won     9/28/14
                     4   xxxx    Email   11/26/14
                     5   xxxx    Email   11/6/14
                     6   xxxx    Email   11/26/14
                     7   xxxx    demo    12/1/14
                     8   xxxx    Demo    2/9/15
                     9   xxxx    Email   9/15/14
                     10  xxxx    trial   9/9/14
                     11  xxxx    Meeting 9/24/14
                     12  xxxx    Email   12/1/14
                     13  xxxx    Email   11/6/14
                     14  xxxx    Email   9/15/14
                     15  xxxx    Email   9/15/14
                     16  xxxx    Email   11/26/14
                     17  yyyy    Email   9/4/14
                     18  yyyy    trial   8/14/14
                     19  yyyy    Email   8/25/14
                     20  yyyy    Email   8/21/14
                     21  yyyy    won     9/3/14
                     22  yyyy    Email   9/11/14
                     23  yyyy    Email   8/21/14
                     24  yyyy    Email   11/6/14
                     25  yyyy    Email   8/21/14
                     26  yyyy    Email   11/6/14
                     27  yyyy    Email   11/6/14
                     28  yyyy    Email   8/21/14
                     29  yyyy    Email   11/6/14
                     30  yyyy    Email   8/21/14
                     31  yyyy    Email   8/29/14
                     32  yyyy    Email   8/21/14
                     33  zzzz    Email   11/6/14
                     34  zzzz    Email   11/6/14
                     35  zzzz    Email   9/18/14
                     36  zzzz    trial   9/17/14
                     37  zzzz    Email   9/18/14
                     38  zzzz    Email   12/5/14
                     39  zzzz    Email   11/6/14
                     40  zzzz    Email   11/6/14
                     41  zzzz    Email   12/15/14
                     42  zzzz    Email   9/19/14
                     43  zzzz    Email   11/6/14
                     44  zzzz    Email   12/3/14
                     45  zzzz    Email   12/3/14
                     46  zzzz    Email   12/15/14
                     47  zzzz    Email   10/1/14
                     48  zzzz    Email   12/5/14
                     49  zzzz    won     10/2/14
                     50  zzzz    Email   9/18/14')
email_2$date <- as.Date(email_2$date, format = '%m/%d/%y')
str(email2)
require(ggplot2)

ggplot(data = email_2, aes(date, ActionType)) +
  scale_x_date(limits = as.Date(c("2014-08-14", "2014-12-16"))) +
  scale_y_continuous(email_2$email, breaks = NULL, limits = c(0, 1)) +
  geom_vline(data = email_2, mapping=aes(xintercept = as.numeric(date), 
                                       color = ActionType), size = 2,show_guide = T) +
  theme(legend.position="bottom") +
  theme(axis.title.x=element_blank()) +
  theme(axis.title.y=element_text(angle=360)) +
  facet_grid(email~.)

grid.arrange(p1,p2,p3, ncol=1) введите здесь описание изображения

person EDi    schedule 10.04.2015
comment
Я пробовал это, но я хотел бы, чтобы все первые линии (синие) начинались с одной и той же точки на оси x. Итак, в этом случае я бы хотел сдвинуть первый и третий график назад, пока синие линии не выровняются. После того, как они выровнены, я хочу сохранить расстояние между строками. По сути, просто сдвиньте первый и третий графики обратно влево. - person Hillary; 10.04.2015
comment
@Hillary, тогда просто отредактируйте свои данные. Рассчитайте групповую минимальную дату минус глобальную минимальную дату и вычтите ее из дат для каждой группы. - person Gregor Thomas; 10.04.2015
comment
... и не забудьте соответствующим образом изменить метки оси X. - person EDi; 10.04.2015
comment
Идеально! @Грегор, я думал, что мне, возможно, придется сделать что-то подобное, но я не мог точно понять это. - person Hillary; 10.04.2015