Редактирование меток делений оси с помощью ggplot2, когда ось x находится в мм-дд

У меня есть набор данных, где ось x - это дата, но это только мм-дд (без года). Я использую год как групповую переменную, поскольку пытаюсь показать изменение года на том же графике. Надписи по оси X слишком переполнены, и я хотел бы ограничить метки меток, чтобы отображалась не каждая дата. Это может быть через день, каждый третий день, один день в неделю - подойдет любой из них.

Я пробовал несколько решений, но не могу заставить их работать, я предполагаю, потому что моя ось x - это не дата, а символ. (До того, как прийти к этому решению mm-dd для оси x, я попытался построить ось x в формате даты yyyy-mm-dd, но мне не удалось выяснить, как заставить ggplot2 игнорировать часть «yyyy». .)

Пример:

myDF <- data.frame(
        myDate = format(seq(as.Date("2014-02-01"), 
                 length=28, by="1 day"), "%m-%d"),
        myVar = sample(100,28),
        myGroup = sample(2,28,TRUE)
                   )
head(myDF)

  myDate myVar myGroup
  02-01    87       1
  02-02    34       1
  02-03    48       2
  02-04    59       1
  02-05    98       1
  02-06    18       2

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) + 
geom_line() 

Здесь все правильно, за исключением того, что метки в виде галочки слишком сжаты.

Я пытался:

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) +   
geom_line() + scale_x_discrete(breaks = c(1,10,20))

Похоже, это сбивает с толку ggplot, поскольку метки полностью исчезают. (Тот же результат с попыткой seq ().)

Я также пробовал:

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) + 
geom_line() + scale_x_date(breaks = "1 week")

Это вызывает ошибку re: myDate не является датой.

Я уже переключил формат меток галочки на вертикальный, но на графике все еще слишком много.

Любые советы будут очень признательны. Спасибо!


person Samantha    schedule 13.08.2014    source источник
comment
Arrrgh. Это снова старая as.data.frame(cbind(.)) ошибка. cbind все принуждает к характеру. А если вам нужны свидания, то не заставляйте персонажа использовать format.   -  person IRTFM    schedule 14.08.2014
comment
As.data.frame (cbind (.)) Отсутствует в моем исходном коде, это просто для быстрого и грязного примера. В своем вопросе я признаю, что переменная mm-dd больше не является датой, и я объяснил, как я пришел к этому формату. Я не утверждаю, что это правильный способ делать что-то - вот почему я здесь.   -  person Samantha    schedule 14.08.2014
comment
Если бы вы нашли время, чтобы прочитать текст справки для ?scale_x_date, функции, которую вы использовали, то вы бы нашли несколько примеров того, как управлять форматом меток и частотой [...] отметок.   -  person Henrik    schedule 14.08.2014
comment
Я прочитал? Scale_x_date. Требуются финики. Мой мм-дд не свидание. Если вы говорите, что мм-дд может быть свиданием, поделитесь своими знаниями. Все мои исследования привели меня к мысли, что для Dates требуется как минимум ymd. Если вместо этого вы говорите, что я могу использовать scale_x_date () с переменной даты yyyy-mm-dd, чтобы у меня было две строки в одном горизонтальном пространстве, фактически игнорируя yyyy, поделитесь, пожалуйста, своими знаниями об этом. Это было бы актуально в этом сценарии только с дополнительной настройкой какой-то другой эстетики, которую я не понимаю.   -  person Samantha    schedule 14.08.2014


Ответы (1)


Если вы хотите использовать переменную myDate без года (в виде символа), то одним из решений было бы использовать scale_x_discrete(), а затем предоставить myDF$myDate в качестве аргумента breaks= и выбрать последовательность значений, которые вы хотите отобразить. В этом примере я выбрал каждое седьмое значение.

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) +   
      geom_line() + scale_x_discrete(breaks = unique(myDF$myDate)[seq(1,28,7)])
person Didzis Elferts    schedule 14.08.2014
comment
Большое спасибо! Я подумал, что, вероятно, я неправильно понял scale_x_discrete. Это прекрасно работает. Спасибо! - person Samantha; 14.08.2014
comment
PS Мне очень жаль, что я не могу проголосовать прямо сейчас - я буду работать над улучшением своей репутации, чтобы я мог вернуться и проголосовать за. Спасибо еще раз. - person Samantha; 15.08.2014