2017-02-13 4 views
0

У меня есть данные о дождевых осадках, которые собираются непрерывно, из которых я рассчитал дневные итоги. Вот некоторые игрушки данные:данные о ежедневных осадках с использованием geom_step

Date <- c(seq(as.Date("2016-07-01"), by = "1 day", length.out = 10)) 
rain_mm <- c(3,6,8,12,0,0,34,23,5,1) 
rain_data <- data.frame(Date, rain_mm) 

Я могу построить эти данные следующим образом:

ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_bar(stat = "identity") + 
    scale_x_date(date_labels = "%d") 

Что дает следующее:

enter image description here

Это кажется прекрасным. Ясно, сколько осадков произошло в определенный день. Однако можно также интерпретировать, что между полуденным днем ​​и полуднем следующего дня выпало определенное количество дождя, что неверно. Это особенно проблема, если граф объединен с другими графиками связанных непрерывных переменных за тот же период.

Чтобы обойти этот вопрос я мог бы использовать geom_step следующим образом:

library(ggplot) 
ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_step() + 
    scale_x_date(date_labels = "%d") 

Что дает:

enter image description here

Это лучший способ для отображения данных, и теперь scale_x_date, как представляется, быть непрерывной осью. Тем не менее, было бы неплохо получить область ниже шагов, заполненных, но, похоже, не найти прямой путь к этому.

Q1: Как я могу заполнить под geom_step? Является ли это возможным?

Он также может быть полезно преобразовать Date в POSIXct для облегчения идентичных осей х в нескольких сюжетных фигурах, как описано в этом SO question here. я могу сделать это следующим образом:

library(dplyr) 
rain_data_POSIX <- rain_data %>% mutate(Date = as.POSIXct(Date)) 

        Date rain_mm 
1 2016-07-01 01:00:00  3 
2 2016-07-02 01:00:00  6 
3 2016-07-03 01:00:00  8 
4 2016-07-04 01:00:00  12 
5 2016-07-05 01:00:00  0 
6 2016-07-06 01:00:00  0 
7 2016-07-07 01:00:00  34 
8 2016-07-08 01:00:00  23 
9 2016-07-09 01:00:00  5 
10 2016-07-10 01:00:00  1 

Однако, это дает время 01:00 на каждую дату. Я предпочел бы 00:00. Могу ли я изменить это в вызове функции as.POSIXct, или мне нужно сделать это после использования отдельной функции? Я думаю, что это как-то связано с tz = "", но не могу понять.

Как я могу преобразовать из класса Date в POSIXct так, что сгенерировано время 00:00?

Благодаря

+0

Первый вопрос является потенциальным дубликат: http://stackoverflow.com/questions/21887088/generate-a-filled-geom-step –

+0

Вопрос второй: попробуйте 'tz =" GMT "' или просто удалите 1 час: 'as.POSIXct (Date) - 3600' .. – timat

+0

@ArtemSokolov Я видел это, но не мог понять ответы. Также хотелось узнать, изменилось ли что-то недавно. Спасибо –

ответ

2

Для вашего первого вопроса, то вы можете отрабатывать this example.Во-первых, создать временную отставали версию ваших данных:

rain_tl <- mutate(rain_data, rain_mm = lag(rain_mm)) 

Затем объединить этот раз отставали версию с исходными данными, и повторно сортировать по дате:

rain_all <- bind_rows(old = rain_data, new = rain_tl, .id="source") %>% 
    arrange(Date, source) 

(Обратите внимание на недавно созданный source колонка используется для разрыва связей, правильно переплетений исходных данных с временным лагом версией):

> head(rain_all) 
    source  Date rain_mm 
1 new 2016-07-01  NA 
2 old 2016-07-01  3 
3 new 2016-07-02  3 
4 old 2016-07-02  6 
5 new 2016-07-03  6 
6 old 2016-07-03  8  

Вы можете теперь использовать объединённую матрицу, чтобы «заполнить» свои шаги:

ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_step() + 
    geom_ribbon(data = rain_all, aes(ymin = 0, ymax = rain_mm), 
      fill="tomato", alpha=0.5): 

Это дает следующий сюжет:

enter image description here


Для вашего второго вопроса, то проблема заключается в том, что as.POSIX.ct does not pass additional arguments to the converter, поэтому указав tz аргумент ничего не делает.

Вы в основном есть два варианта:

1) переформатировать вывод, что вы хотите: format(as.POSIXct(Date), "%F 00:00"), которая возвращает вектор типа character. Если вы хотите сохранить тип объекта, как POSIXct, вы можете вместо этого ...

2) Отдайте свой Date вектора character до передачи его в as.POSIX.ct: as.POSIXct(as.character(Date)), но это оставит от времени полностью, что может быть что вы хотите в любом случае.

+0

спасибо за это. Глядя на решение «geom_bar» выше, вы знаете, почему я не могу указать аргумент 'width' при использовании в сочетании с' scale_x_datetime'? –

+0

Ваш вопрос (ы) становятся слишком специализированными для вашей проблемы (например, ваш исходный вопрос использует «scale_x_date» и ничего не упоминает о «scale_x_datetime»). Подумайте о том, чтобы разделить проблему на логические куски и представить каждый фрагмент как отдельный вопрос переполнения стека, который затрагивает конкретную проблему, которая будет представлять интерес для широкой аудитории. –

1

Если вы хотите избежать взлома, вы можете настроить положение в выражении geom_bar.

Я нашел хорошие результаты:

ggplot(rain_data, aes(Date, rain_mm)) + 
    geom_bar(stat = "identity", position = position_nudge(x = 0.51), width = 0.99) + 
    scale_x_date(date_labels = "%d") 

enter image description here

+0

спасибо, я думал по тем же линиям, переведя 'Date' в' POSIXct' и установив время до 12:00. Это облегчает мне настройку нескольких графиков с теми же x-aix.Тем не менее, 'geom_bar', похоже, не принимает аргумент' width' с 'scale_x_datetime' ... –

+0

Также выглядит лучше с' width = 1' –

+0

Мне не понравилось, как выглядит 'width = 1'. Небольшой раздел чист и показывает ясный рассвет. Но у вас есть инструменты, которые вам нужны сейчас. –

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