Как настроить 24-часовой начальный час и конечный час для линейного графика?(например, начало в 7:30) - PullRequest
0 голосов
/ 25 мая 2019

У меня есть 24-часовые данные, начиная с 7:30 сегодня (например), до 7:30 следующего дня, потому что я не связал дату с линейным графиком, R сортирует час, начиная с 00:00 несмотря на данные, начинающиеся в 7:30, я новичок в R, и я не знаю, с чего начать, чтобы решить эту проблему, стоит ли пытаться связать дату также с осью X, или есть лучшее решение?

Моя функция времени почему-то тоже не работала, раньше она работала, когда я наносил данные с шагом 15 минут.

library(chron)
d <- read.csv(file="data.csv", header = T)
t <- times(d$Time)
plot(t,d$MCO2, type="l")

График создан из 24-часовых данных, которые у меня есть:

Graph created from the 24 hour data I have

График, созданный из 15-минутных данных с использованием того же кода:

Graph created from a 15 minute data using the same code

Я хотел, чтобы результат был с 7:30 до 7:30 на следующий день, но теперь он отображал десятичное число от 0.0 до 1

Вот ссылка на данные, на всякий случай: https://www.dropbox.com/s/wsg437gu00e5t08/Data%20210519.csv?dl=0

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Вопрос на самом деле заключается в объединении столбца даты и столбца времени для создания отметки времени, содержащей дату и время. Обратите внимание, что я предлагаю обрабатывать все, как если бы мы были в часовом поясе GMT. Вы можете выбрать любой часовой пояс, который захотите, а затем придерживаться его.

# use ggplot
library(ggplot2)
# assume everything happens in GMT timezone
Sys.setenv( TZ = "GMT" )

# replicating the data: a measurement result sampled at 1 sec interval
t <- seq(start, end, by = "1 sec")
Time24 <- trimws(strftime(t, format = "%k:%M:%OS", tz="GMT"))
Date <- strftime(t, format = "%d/%m/%Y", tz="GMT")
head(Time24)
head(Date)
d <- data.frame(Date, Time24)
# this is just a random data of temperature
d$temp <- rnorm(length(d$Date),mean=25,sd=5)
head(d)
# the resulting data is as follows
#        Date  Time24     temp
#1 22/05/2019 0:00:00 22.67185
#2 22/05/2019 0:00:01 19.91123
#3 22/05/2019 0:00:02 19.57393
#4 22/05/2019 0:00:03 15.37280
#5 22/05/2019 0:00:04 31.76683
#6 22/05/2019 0:00:05 26.75153

# this is the answer to the question
# which is combining the the date and the time column of the data
# note we still assume that this happens in GMT
t <- as.POSIXct(paste(d$Date,d$Time24,sep=" "), format = "%d/%m/%Y %H:%M:%OS", tz="GMT")

# print the data into a plot
png(filename = "test.png", width = 800, height = 600, units = "px", pointsize = 22 )
ggplot(d,aes(x=t,y=temp)) + geom_line() +
  scale_x_datetime(date_breaks = "3 hour",
                   date_labels = "%H:%M\n%d-%b") 
0 голосов
/ 25 мая 2019

Проблема в том, что время функции не включает информацию о дне. Это проблема, поскольку ваши данные охватывают два дня.

Тип данных, который вы используете, должен включать информацию о дне. Posix - это тип данных. Кроме того, поскольку Posix - это объект даты и времени в R, его намного проще построить.

Перед построением данных столбец времени должен иметь правильную разницу в днях. При простом преобразовании столбца с помощью as.POSIXct время дня 2 читается так, как если бы оно было с дня 1. Именно поэтому мы должны добавить 24 часа к правильным записям.

После этого это просто вопрос заговора. Я добавил пример пакета ggplot2, так как я предпочитаю эти графики.

Вы можете заметить, что использование as.POSIXct добавит неверную дату к вашей информации о времени. Не беспокойтесь об этом, вы используете эту дату просто как фиктивную дату. Вы сами не используете эту дату, вы просто используете ее, чтобы иметь возможность работать с разницей в днях.

library(ggplot2)

# Read in your data set    
d <- read.csv(file="Data 210519.csv", header = T)

# Read column into R date-time object
t <- as.POSIXct(d$Time24, format = "%H:%M:%OS")

# Add 24 hours to time the time on day 2.
startOfDayTwo <- as.POSIXct("00:00:00", format = "%H:%M:%OS")
endOfDayTwo <- as.POSIXct("07:35:00", format = "%H:%M:%OS")
t[t >= startOfDayTwo & t <= endOfDayTwo] <- t[t >= startOfDayTwo & t <= endOfDayTwo] + 24*60*60

plot(t,d$MCO2, type="l")

# arguably a nicer plot
ggplot(d,aes(x=t,y=MCO2)) + geom_line() +
  scale_x_datetime(date_breaks = "2 hour",
                   date_labels = "%I:%M %p") 

The picture that ggplot produces

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