2014-01-22 2 views
3

Каков самый умный способ управления POSIX для использования в оси ggplot?R - ggplot2 - Как использовать лимиты на оси POSIX?

Я пытаюсь создать функцию для построения множества графиков (один в день), охватывающих период недели, используя время POSIX для оси x.

Для этого я создаю дополнительный целочисленный столбецDF$Day с днем, который я вводил в функцию. Затем я создаю подмножество, используя этот день, который я рисую с помощью ggplot2. Я решил использовать scale_x_datetime для форматирования оси POSIX x. В основном, я показываю часы & минут, опуская дату.

вот мой вопрос: Как установить лимиты для каждого отдельного графика в часах дня?

Ниже приведен некоторый рабочий, воспроизводимый код, чтобы получить представление. Он создает первый день, показывает его в течение 3 секунд & выручка от создания второго дня. Но ограничения на каждый день выбираются исходя из диапазона переменной time. Как я могу сделать диапазон, например, весь день (0h - 24h)?

DF <- data.frame(matrix(ncol = 0, nrow = 4)) 

DF$time <- as.POSIXct(c("2010-01-01 02:01:00", "2010-01-01 18:10:00", "2010-01-02 04:20:00", "2010-01-02 13:30:00")) 
DF$observation <- c(1,2,1,2) 
DF$Day <- c(1,1,2,2) 

for (Individual_Day in 1:2) { 
Day_subset <- DF[DF$Day == as.integer(Individual_Day),] 

print(ggplot(data=Day_subset, aes_string(x="time", y="observation")) + geom_point() + 
     scale_x_datetime(breaks=("2 hour"), minor_breaks=("1 hour"), labels=date_format("%H:%M"))) 

Sys.sleep(3) } 

Second plot created by the function, to show the axis

+0

Вместо того, чтобы печатать графики и использовать 'Sys.sleep()', вы можете проверить пакет 'animation'. Функция ['saveHTML'] (http://www.inside-r.org/packages/cran/animation/docs/saveHTML) поставляется с приятным« плеером », который позволяет вам проходить кадр за кадром или настраивать скорость воспроизведения в браузере. Вы также можете сохранить GIF или другой формат. – Gregor

+0

@shujaa Я обязательно проверю это. Я на самом деле googled 'sys.sleep()' для этого вопроса, обычно я просто сохраняю в PDF. Предполагалось, что это облегчит отправку; Спасибо за совет :) –

ответ

3

Ну, вот один из способов.

# ... 
for (Individual_Day in 1:2) { 
Day_subset <- DF[DF$Day == as.integer(Individual_Day),] 
lower <- with(Day_subset,as.POSIXct(strftime(min(time),"%Y-%m-%d"))) 
upper <- with(Day_subset,as.POSIXct(strftime(as.Date(max(time))+1,"%Y-%m-%d"))-1) 
limits = c(lower,upper) 

print(ggplot(data=Day_subset, aes(x=time, y=observation)) + 
     geom_point() + 
     scale_x_datetime(breaks=("2 hour"), 
          minor_breaks=("1 hour"), 
          labels=date_format("%H:%M"), 
          limits=limits) 
    ) 
} 

Расчет для lower занимает минимальное время в подмножестве, и принуждает ее характер только с датой части (например, отсекает время часть). Преобразование обратно в POSIXct создает начало этого дня.

Расчет для upper немного сложнее. Вы должны преобразовать максимальное время в значение даты и добавить 1 (например, 1 день), затем преобразовать в символ (отделить часть времени), преобразовать обратно в POSIXct и вычесть 1 (например, 1 секунду). Это дает 23:59 в конце дня.

Огромное количество работы для такой маленькой вещи. Я надеюсь, что кто-то еще поставит более простой способ сделать это ...

+0

Это сработало хорошо. Однако я начинаю сомневаться в использовании POSIX для построения, это слишком сложно. Сначала я полагался на дополнительный вектор, где я делал целые числа из часов/минут и просто рисовал на этом числовом векторе. Я попробовал POSIX, надеясь, что это будет более элегантно, но наоборот кажется правдой ... –

+0

@Hegazy Возможно, вы захотите отказаться от ответа. Мне тоже интересно, и, как говорит jlhoward, «я надеюсь, что кто-то еще поставит более простой способ сделать это ...». Дайте ему пару дней, а затем, если никто не опубликовал более простой ответ, примите это. Но если он отмечен как принятый, вопрос не получит большого внимания. – Gregor

+0

Согласовано. Соглашение о SO должно подождать не менее 24 часов, прежде чем принимать ответ (предполагая, конечно, что он решает вашу проблему). См. [Эту ссылку] (http://stackoverflow.com/help/someone-answers) для некоторых рекомендаций. – jlhoward

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