Как масштабировать время по оси X, если данные времени представлены в символьной форме (R) - PullRequest
0 голосов
/ 01 марта 2020

Вот некоторые данные:

dput(head(R3L12, 20))

structure(list(Date = c("2015-05-23", "2015-05-23", "2015-05-23", 
"2015-05-23", "2015-05-23", "2015-05-23", "2015-05-23", "2015-05-23", 
"2015-05-23", "2015-05-23", "2015-05-23", "2015-05-23", "2015-05-23", 
"2015-05-23", "2015-05-23", "2015-05-23", "2015-05-23", "2015-05-23", 
"2015-05-23", "2015-05-23"), Time = c("07:25:00", "07:40:00", 
"07:45:00", "09:10:00", "11:45:00", "11:55:00", "12:05:00", "12:35:00", 
"12:45:00", "13:30:00", "13:40:00", "13:45:00", "13:55:00", "14:00:00", 
"14:05:00", "14:10:00", "14:20:00", "14:25:00", "14:30:00", "14:35:00"
), Turtle = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("R3L1", "R3L11", 
"R3L12", "R3L2", "R3L4", "R3L8", "R3L9", "R4L8", "R8L1", "R8L4", 
"R8NAT123"), class = "factor"), HeartRate = c(7.56457, 6.66759, 
17.51107, 9.72277, 19.44553, 13.07674, 28.115, 14.99467, 17.16947, 
40.40479, 37.76642, 29.98933, 43.5329, 49.61471, 47.74245, 44.10196, 
21.35316, 44.68609, 49.25255, 29.98933)), row.names = c(NA, 20L
), class = "data.frame")
ggplot(R3L12, aes(x=Time, y=HeartRate)) +
  stat_summary(fun.y=mean, geom="point") +
  geom_smooth(aes(x=as.numeric(factor(Time)), y=HeartRate)) +
  labs(title = "Turtle R3L12 Average Heart Rate", ylab = "Heart Rate") +
   theme(axis.text.x = element_text(angle = 90, hjust=1, size = 3, color = "black"), plot.title = element_text(face = "bold", hjust = 0.5, size = 15)) 

Это код, который я должен построить на графике рассеяния с плавной линией. У меня есть временные интервалы с 00:00 до 23:55:00. Я только хочу, чтобы время показывалось каждые 30 минут, чтобы ось X не была переполнена, но я не понял, как это сделать. Я очень новичок в R, поэтому, пожалуйста, объясните просто.

В настоящее время переменная времени является символьным объектом, подобным этому HH:MM:SS.

1 Ответ

1 голос
/ 01 марта 2020

Одним из решений является установка переменной времени в формате даты и времени с помощью функции ymd_hms из пакета lubridate, а затем с помощью функции scale_x_datetime для установки соответствующих параметров.

Если у вас несколько дат и Вы хотите построить только одну дату, вы можете установить подкадр данных:

library(lubridate)
library(dplyr)
library(ggplot2)
library(scales)
R3L12 <- R3L12 %>% mutate(Date_Time = ymd_hms(paste(Date,Time, sep = " "))) 

ggplot(subset(R3L12, Date == "2015-05-23"), aes(x = Date_Time, y = HeartRate))+
  stat_summary(fun.y=mean, geom="point") +
  geom_smooth() +
  labs(title = "Turtle R3L12 Average Heart Rate", ylab = "Heart Rate") +
  scale_x_datetime( breaks=date_breaks("30 min"), labels = date_format("%H:%M"))

enter image description here


РЕДАКТИРОВАТЬ: построение нескольких дат

Если у вас есть несколько дат, которые вы хотите отобразить на одной временной оси без создания временного ряда, вы можете создать столбец с комбинированной датой и временем, но с одной уникальной датой.

Позвольте мне объяснить. Во-первых, основываясь на вашем исходном кадре данных (называемом df), я сгенерировал второй df и связал их обоих, чтобы получить данные для двух дат одновременно:

df2 <- df
df2$Date <- "2015-05-24"
df2$HeartRate <- df$HeartRate * 1.5
DF <- rbind(df,df2)

Затем я создаст новый столбец DateTime, который будет сочетать различное время с уникальной датой. Таким образом, я заставлю ggplot2 думать, что эти данные в ту же дату, и я смогу использовать функцию scale_x_datetime.

library(dplyr)
DF <- DF %>% mutate(DateTime2 = ymd_hms(paste("2020-01-01",Time, sep = " "))) 

Затем, чтобы построить каждую дату вместе в одно и то же время, вы можете сделать:

library(ggplot2)
ggplot(DF, aes(x = DateTime2, y = HeartRate, color = Date))+
  geom_point()+
  scale_x_datetime( breaks=date_breaks("30 min"), labels = date_format("%H:%M"))+
  stat_summary(geom = "point", color = "black", fun.y = mean)+
  geom_smooth()

enter image description here

Здесь, Я использую stat_summary, чтобы построить среднее значение для всех дат (черный цвет).

Если вы хотите построить только среднюю точку и получить сглаживание средней точки, вы можете вычислить среднее значение вне ggplot2, выполнив:

library(dplyr)
DF %>% mutate(DateTime2 = ymd_hms(paste("2020-01-01",Time, sep = " "))) %>%
  group_by(DateTime2) %>%
  summarise(Mean = mean(HeartRate))

И получить график по делать:

library(dplyr)
library(ggplot2)
DF %>% mutate(DateTime2 = ymd_hms(paste("2020-01-01",Time, sep = " "))) %>%
  group_by(DateTime2) %>%
  summarise(Mean = mean(HeartRate)) %>%
  ggplot(aes(x = DateTime2, y = Mean))+
  geom_point()+
  geom_smooth()+
  scale_x_datetime( breaks=date_breaks("30 min"), labels = date_format("%H:%M"))

enter image description here Отвечает ли он на ваш вопрос?


Примечание: я несколько дней назад дал аналогичный ответ на один из ваших предыдущих вопросов a go: Geom_smooth не отображается на простом графике . Может быть, вы должны были взглянуть на это, прежде чем отправлять этот вопрос.

...