2013-10-07 4 views
6

Я пытаюсь построить данные временных рядов по неделям и месяцам; в идеале, я думаю, я бы хотел использовать ящики для визуализации ежедневных данных, привязанных к неделе. Хотя я могу изменить метки и линии сетки по оси x, используя scale_x_date, что не повлияет на точки на графике.ggplot2: график временных рядов данных по месяцам и неделям

Вот демонстрация проблемы и моего текущего (неуклюжего) решения.

library(zoo) 
library(ggplot2) 

d = as.Date(c(as.Date("2007-06-01"):as.Date("2008-05-31"))) # using zoo to reformat numeric 
x = runif(366, min = 0, max = 100) 
df = data.frame(d,x) 

# PROBLEM #  
p = ggplot(df, aes(d, x)) 
p + geom_point() 
p + geom_boxplot() # more or less useless 

# CURRENT FIX # 
df$Year.Month <- format(df$d, "%Y-%m") 
p = ggplot(df, aes(Year.Month, x)) 
p + geom_point(alpha = 0.75) 
p + geom_boxplot() # where I'm trying to get to... 

Я уверен, что есть более элегантный способ сделать это изнутри ggplot. Я прав?

@ Нижеприведенный ответ теней намного опережает. Но есть ли способ сделать это, используя биннинг? Возможно, в какой-то форме stats?

+1

Вы можете сделать то же самое, что вы делали отдельно в 'ggplot':' p + geom_boxplot (aes (x = format (d, "% Y-% m"))) ' – shadow

+0

Спасибо @shadow - это намного опрятно. – mediaczar

+2

Или, возможно, эта вариация на код тени: 'p + geom_boxplot (aes (format (as.yearmon (d))))' –

ответ

1

Вы можете рассматривать Даты как даты в R и использовать scale_x_date() в ggplot, чтобы получить нужные вам x-метки.

  • Кроме того, мне легче просто создать новый переменный фактор под названием «Месяц» для группировки ящиков по месяцам. В этом случае я использовал lubridate для выполнения задачи.

  • Если вы не хотите беспокоиться о создании новой переменной «Месяц», ваш bloxplot будет отображаться на 15-м месяце, что делает чтение более сложным.

    library(magrittr) 
    library(lubridate) 
    library(dplyr) 
    
    df %>% 
        mutate(Date2 = as.Date(paste0("2000-", month(d), "-", "01"))) %>% 
        mutate(Month = lubridate::month(d)) %>% 
    
    ggplot(aes(Date2, x, group=Month)) + 
        geom_boxplot() + 
        scale_x_date(date_breaks="1 month", date_labels = "%b") 
    

enter image description here

Если вы не создаете переменную "Месяц", не присущи рефлективный, вербальный выровняет красиво с х отметками:

enter image description here

+0

Мне нравится, как они выстраиваются; однако, похоже, вы потеряли данные за год. В нижней диаграмме есть 13-месячные метки (но они работают с июня по июнь включительно). В верхней диаграмме 12 месяцев, но они работают с января по декабрь.) – mediaczar

+0

@mediaczar, я вижу 12 месяцев на нижней диаграмме. С мая по июль-июнь, как и данные. Когда создается месяц-фактор, значение по умолчанию - это график от jan-to-dec, но если мы переделаем месяцы, он может перейти от jun-to-may. Подумайте об этом упражнении с несколькими годами, а не только за 12 месяцев данных ... – Dan

+0

да. Ось X на нижней диаграмме имеет смысл. Это верхняя диаграмма, с которой я беру вопрос. Вы также заметите, просто взглянув на ящики, чтобы данные были в другом порядке. Чтобы быть справедливым, я раньше не использовал библиотеку «lubridate» и не имел возможности проверить, как исправить то, что, без сомнения, простая проблема в отличном решении. – mediaczar

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