Создание графика временных рядов и преобразование числовых данных в дату - PullRequest
0 голосов
/ 18 июня 2019

Я хочу создать график времени по температуре на 2 сайтах. У меня есть данные о температуре каждые 10 минут в день с февраля по апрель, и мне нужны ежедневные циклы среднечасовых значений температуры для построения графика.

Я рассчитал среднюю температуру для часа в день и попытался создать график с geom_plot и геопо_линей разными способами.


data <- read.xlsx("temperatura.xlsx", 1)
data <- data %>% mutate (month = as.factor(month), month = as.factor (month), day = as.factor(day), h = as.factor(h), min = as.factor(min))

head (data)
month day h min  t.site1 t.site2
  2   1   0   0  15.485  16.773
  2   1   0  10  15.509  16.773
  2   1   0  20  15.557  16.773
  2   1   0  30  15.557  16.773
  2   1   0  40  15.605  16.773
  2   1   0  50  15.605  16.773


str(data)
'data.frame':   12816 obs. of  6 variables:
 $ month  : Factor w/ 3 levels "2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ day    : Factor w/ 31 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ h      : Factor w/ 24 levels "0","1","2","3",..: 1 1 1 1 1 1 2 2 2 2 ...
 $ min    : Factor w/ 6 levels "0","10","20",..: 1 2 3 4 5 6 1 2 3 4 ...
 $ t.site1: num  15.5 15.5 15.6 15.6 15.6 ...
 $ t.site2: num  16.8 16.8 16.8 16.8 16.8 ...


hour <- group_by(data, month, day, h) 

mean.h.site1 <- summarize(hour, mean.h.site1 = mean(t.site1))

t1 <- ggplot (data = mean.h.site1, aes(x=h, y=mean.h.site1)) +
  geom_line()

t2 <- ggplot(data = mean.h.site1, aes(x=h, y=mean.h.site1, group = month))+
  geom_line() +
  geom_point()

t3 <- ggplot (data = mean.h.site1, aes(x=day, y=mean.h.site1, group=1))+
  geom_point()


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

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

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

РЕДАКТИРОВАНИЕ: Я обновил код, чтобы сгенерировать данные за день.И также сгенерируйте диаграмму.

library(tidyverse)
library(lubridate)

df <- data_frame(month = rep(2, 144), 
                 day = rep(1, 144),
                 h = rep(0:24, each = 6, len = 144),
                 min = rep((0:5)*10,24),
                 t.site1 = rnorm(n = 144, mean = 15.501, sd = 0.552),
                 t.site2 = rnorm(n = 144, mean = 16.501, sd = 0.532))

df %>%
        group_by(month, day, h) %>%
        summarise(mean_t_site1 = mean(t.site1), mean_t_site2 = mean(t.site2)) %>%
        mutate(date = ymd_h(paste0("2019-",month,"-",day," ",h))) %>%
        ungroup() %>%
        select(mean_t_site1:date) %>%
        gather(key = "site", value = "mean_temperature", -date) %>%
        ggplot(aes(x = date, y = mean_temperature, colour = site)) +
        geom_line()

Не могли бы вы проверить, нужен ли вам этот вывод?enter image description here

0 голосов
/ 18 июня 2019

Вы можете вставить столбцы времени вместе и преобразовать их as.POSIXct.

Как уже указывалось @ PavoDive , нам понадобятся числовые столбцы времени.Проверьте свой код, который произвел данные, или преобразуйте в числовое значение с помощью d[1:4] <- Map(function(x) as.numeric(as.character(x)), d[1:4]).

Теперь paste строк с apply, преобразуйте as.POSIXct и cbind в остаток.sprintf сначала смотрит, что все значения перед вставкой имеют одинаковые цифры.

d2 <- cbind(time=as.POSIXct(apply(sapply(d[1:4], sprintf, fmt="%02d"), 1, paste, collapse=""), 
                  format="%m%d%H%M"), 
            d[5:6])

Графики хорошо, здесь в базе R:

with(d2, plot(time, t.site1, ylim=c(15, 17), xaxt="n",
              xlab="time", ylab="value", type="b", col="red",
              main="Time series"))
with(d2, lines(time, t.site2, type="b", col="green"))
mtext(strftime(d2$time, "%H:%M"), 1, 1, at=d2$time)  # strftime gives the desired formatting
legend("bottomright", names(d2)[2:3], col=c("red", "green"), lty=rep(1, 2))

enter image description here

Данные

d <- structure(list(month = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "2", class = "factor"), 
    day = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "1", class = "factor"), 
    h = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "0", class = "factor"), 
    min = structure(1:6, .Label = c("0", "10", "20", "30", "40", 
    "50"), class = "factor"), t.site1 = c(15.485, 15.509, 15.557, 
    15.557, 15.605, 15.605), t.site2 = c(16.773, 16.773, 16.773, 
    16.773, 16.773, 16.773)), row.names = c(NA, -6L), class = "data.frame")
0 голосов
/ 18 июня 2019

Интересно, что ваши данные показывают месяц, день и час как factor. Возможно ли, что в этом столбце есть некоторые символьные значения, когда вы читаете данные? Очень необычно видеть числа, сохраненные как фактор таким образом.

Я сделаю 4 вещи:

  1. Преобразование коэффициентов в числа
  2. Преобразование чисел в даты
  3. Преобразование широкого стола в длинный и, наконец,
  4. построение временных диаграмм против реальной даты

    # Load packages and data
    library(data.table) # for overall fast data processing
    library(lubridate) # for dates wrangling
    library(ggplot2) # plotting
    
    dt <- fread("month day h min  t.site1 t.site2
      2   1   0   0  15.485  16.773
      2   1   0  10  15.509  16.773
      2   1   0  20  15.557  16.773
      2   1   0  30  15.557  16.773
      2   1   0  40  15.605  16.773
      2   1   0  50  15.605  16.773")
    
    # Convert factors to numbers (I actuall didn't run this because I just created the data.table, but it seems you'll need to do it):
    
    dt[, names(dt)[1:4] := lapply(.SD, function(x) as.numeric(as.character(x)), .SDcols = 1:4]
    
    # Create proper dates. We'll consider all dates occurring in 2019.
    dt[, date := ymd_hm(paste0("2019/", month, "/", day, " ", h, ":", min))]
    
    # convert wide data to long one
    dt2 <- melt(dt[, .(date, t.site1, t.site2)], id.vars = "date")
    
    # plot the data
    ggplot(dt2, aes(x = date, y = value, color = variable))+geom_point()+geom_path()
    

Resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...