Многорядная ось x на графике ggplot - PullRequest
1 голос
/ 11 февраля 2020

По моим данным, у каждого игрока есть данные за 3 дня. В течение каждого из этих дней игрок может создавать от 1 до 35 песен. Я хотел бы создать линейный график (для каждого игрока), представляющий как количество песен И дней на оси X, так и приблизительно sh, относящиеся к каждой из этих точек на оси Y. Это похоже, но отличается от этого великого вопроса h ere. , потому что количество песен не совпадает по дням.

вот пример моих данных:

    data.sample <- read_table2('player  song.seq    day cash
1   1   1   65
1   2   1   65
1   3   1   54
1   4   1   56
1   5   1   34
1   6   1   768
1   7   1   611
1   8   1   750
1   9   1   888
1   1   2   1027
1   2   2   1166
1   3   2   1304
1   4   2   1443
1   5   2   1581
1   6   2   1720
1   7   2   1859
1   8   2   1997
1   1   3   2136
1   2   3   2274
1   3   3   2413
1   4   3   2552
1   5   3   2690
2   1   1   2829
2   2   1   2967
2   3   1   3106
2   4   1   3245
2   5   1   3383
2   6   1   3522
2   7   1   3660
2   8   1   3799
2   9   1   3938
2   1   2   4076
2   2   2   4215
2   3   2   4353
2   4   2   4492
2   5   2   4631
2   6   2   4769
2   7   2   4908
2   1   3   5046
2   2   3   5185
2   3   3   5324
2   4   3   5462
2   5   3   5601
2   6   3   5739
')

Это мой желаемый вывод. enter image description here

Я знаю, что могу сделать что-то подобное, но это не дает желаемого результата. Любая помощь будет очень крутой!

data.sample %>% filter(player=="1") %>% ggplot(aes(x = interaction(song.seq, day, lex.order = TRUE), 
                      y = cash, group = 1)) + theme_bw() 

1 Ответ

2 голосов
/ 11 февраля 2020

Я думаю, что это немного сложно сделать, особенно в отношении оси X. Мои первые мысли заключались в том, чтобы преобразовать day и song.seq в переменную даты / времени, используя функцию rescale из пакета весов, чтобы изменить масштаб последовательности песни на количество секунд в дне, а затем преобразовать ее в дату / время. объект:

library(scales)
library(chron)

data.sample %>% 
  mutate(seconds = scales::rescale(song.seq, to=c(0,82800)),
         time = as.POSIXct(seconds, format='%H%M%S', origin=as.Date("2000-01-01")),
         hour = chron::hours(time),
         min  = chron::minutes(time),
         sec  = chron::seconds(time),
         daytime = ISOdatetime(2000,1,day,hour,min,sec)) %>%
  ggplot(aes(x = daytime, y = cash, group=player)) + 
  geom_line() +
  xlab("Song") + 
  facet_grid(rows=vars(player), labeller = label_both) + # maybe cols=vars(day) ?
  theme(axis.text.x = element_blank())

Посмотрите, работает ли это. Для оси x могут потребоваться соответствующие метки галочек для порядкового номера песни.

Редактировать : Или для каждого игрока отдельно, как на вашей красивой картинке:

data.sample %>% 
  mutate(song.seq=factor(song.seq)) %>%
  filter(player==1) %>% 
  ggplot(aes(x = song.seq, y = cash, group=day)) + 
  geom_line() +
  xlab("Song") + 
  facet_grid(cols=vars(day), labeller = label_both, scales="free") +
  ggtitle("Player 1")

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...