2016-10-04 3 views
0

Рассмотрят следующие данные:Создать за год участок с месяцем осью х через scale_x_date() с ggplot2

library(ggplot2) 
library(lubridate) 

date <- seq.Date(ymd("2015-01-01"), Sys.Date(), by = "day") 

df <- data.frame(date = date, 
       value = seq_along(date) + rnorm(length(date), sd = 100)) 

# Add yday and year 
df$yday <- yday(df$date) 
df$year <- year(df$date) 

head(df) 
#   date value yday year 
# 1 2015-01-01 97 1 2015 
# 2 2015-01-02 89 2 2015 
# 3 2015-01-03 68 3 2015 
# 4 2015-01-04 57 4 2015 
# 5 2015-01-05 70 5 2015 
# 6 2015-01-06 100 6 2016 

Я хотел бы сделать «за год» участок с цветом присвоен год , Я могу сделать это с помощью следующих действий:

ggplot(df, aes(x = yday, y = value, color = factor(year))) + 
    geom_line() 

Plot

Но это приводит к оси х будучи «день года», а не месяц этикеток. Добавление + scale_x_date() не работает, потому что yday больше не является датой.

Is можно использовать scale_x_date()?

В конце концов, я хотел бы сделать что-то вроде этого:

ggplot(df, aes(x = date, y = value, color = factor(year))) + 
    geom_line() + 
    scale_x_date(date_labels = "%b") 

Но держать годы «сложенных» на том же участке.

+0

Я понимаю, что вы не хотите использовать обходные данное в ответ на ваш [предыдущий вопрос] (http://stackoverflow.com/questions/28503262/using-lubridate-and -ggplot2 эффективно-к-дата-оси)? Возможно, уточните, что в этом и есть, в противном случае это похоже на дубликат. – aosmith

ответ

3

Как насчет этого хака: Мы не волнует, что год yday приходит, так что просто преобразовать его обратно в Date формате (в этом случае год всегда будет 1970, независимо от фактического года, что данный yday пришел из) и отображать только месяц для меток оси x.

Вам не нужно добавлять столбцы yday или year в свой фрейм данных, так как вы можете создавать их на лету в вызове ggplot.

ggplot(df, aes(x = as.Date(yday(date), "1970-01-01"), y = value, 
       color = factor(year(date)))) + 
    geom_line() + 
    scale_x_date(date_breaks="months", date_labels="%b") + 
    labs(x="Month",colour="") + 
    theme_bw() 

Там, наверное, более чистый путь, и, надеюсь, кто-то более опытный с датами R придет и предоставить.

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^