Построение непрерывных точек данных с использованием даты и времени в R - PullRequest
1 голос
/ 22 марта 2020

Я очень новичок в RStudio, поэтому мое кодирование элементарно.

У меня есть набор данных, который содержит шесть (6) столбцов: date5m, time5m, T5m, date28m, time28m, T28m. Набор данных представляет собой данные о температуре на двух глубинах (5 м и 28 м) с соответствующей отметкой даты и времени. Мой результирующий график отображает все данные по дням, а не непрерывное отображение ко времени их сбора. Любая помощь будет оценена.

library(ggplot2)
library(scales)
library(dplyr)
Aberdeen <- read.csv(file.choose(), header = TRUE)
head(Aberdeen)
Aberdeen$ï..date5m = as.Date(Aberdeen$ï..date5m, format = "%Y-%m-%d")
Aberdeen$date28m = as.Date(Aberdeen$date28m, format = "%Y-%m-%d")
ggplot() + geom_point(data = Aberdeen, aes(x = ï..date5m, y = T5m), 
    colour = "darkgreen", size=0.25, na.rm=TRUE) + 
    geom_point(data = Aberdeen, aes(x = date28m, y = T28m), colour = "forestgreen", size=0.25, na.rm=TRUE) + 
    labs(x = "Date", y = "Temperature (\u00B0C)") + 
    ggtitle("Aberdeen") + 
    theme_bw() + theme(plot.title = element_text(hjust = 0.5)) + 
     scale_x_date(date_breaks = "month", labels=date_format("%b-%Y"))

Non-continuous graph

Я бы хотел, чтобы на графике отображались данные в непрерывном режиме с использованием как даты, так и отметки времени, например:

Required end results

Вот первые 10 строк моего набора данных:

structure(list(date5m = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = "2018-06-01", class = "factor"), time5m = 
structure(1:10, .Label = c("14:40:30", 
"14:42:34", "14:44:39", "14:46:40", "14:48:43", "14:50:46", "14:52:51", 
"14:54:56", "14:56:59", "14:59:03"), class = "factor"), T5m = c(9.1, 
9.02, 9, 9.12, 9.12, 9.1, 9.06, 9.02, 8.98, 9.02), date28m = 
structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "2018-06-01", class = 
"factor"), 
time28m = structure(1:10, .Label = c("14:39:00", "14:49:00", 
"14:59:00", "15:10:00", "15:20:00", "15:30:00", "15:40:00", 
"15:50:00", "16:00:00", "16:11:00"), class = "factor"), T28m = c(1.93, 
1.93, 1.93, 1.93, 1.93, 1.93, 1.93, 1.93, 1.93, 1.91)), row.names = c(NA, 
10L), class = "data.frame")

1 Ответ

0 голосов
/ 23 марта 2020

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

«Абердин» - это имя исходного кадра данных из оператора read.csv (предполагается, что он соответствует опубликованным образцам данных). Пожалуйста, смотрите комментарии к коду для получения дополнительной информации:

library(tidyr)
library(dplyr)
library(stringr)

#Rename the columns to add a '_' seperator between the letter and first number
#this is needed to make the separation and the pivot easier.
# See the tidyr pivot Vignette "Multiple observations per row"
names(Aberdeen) <- names(Aberdeen) %>% str_replace( "(\\D)(\\d)", "\\1_\\2")

#Adding a rownumber for tracking purposes
#Unite the date and time columns into 1 column
#reshape to long
dflong<-Aberdeen %>% mutate(rowid=row_number()) %>%
  unite("datetime_5m",  c(date_5m,  time_5m)) %>% 
  unite("datetime_28m",  c(date_28m,  time_28m)) %>% 
  pivot_longer(cols= -rowid, names_to = c(".value", "depth"), names_sep="_") 

#convert datetime column from character to datetime oject:
dflong$datetime<-as.POSIXct(dflong$datetime, "%Y-%m-%d_%H:%M:%S", tz="")

#plot grouping and coloring by the depth
ggplot(data = dflong, aes(x = datetime, y = T, group=depth, color=depth)) + 
  geom_point() + 
  labs(x = "Date", y = "Temperature (\u00B0C)") + 
  ggtitle("Aberdeen") + 
  theme_bw() + theme(plot.title = element_text(hjust = 0.5)) + 
  scale_x_datetime(date_breaks = "hour", labels=date_format("%b-%Y"))

enter image description here

...