R: время, отображаемое на оси х / оси. Функция POSIXct () - PullRequest
0 голосов
/ 22 мая 2018

Я довольно новичок в R и пытаюсь начать работу с графикой данных.Но мне не удалось получить ось х в правильном порядке.Это должна быть ось времени, отображающая часы, начиная с 00:00 до 23:59 с отметками каждый час.Я попробовал функцию axis.POSIXct(), но она не сработала.Я действительно ценю помощь.Заранее большое спасибо!

Код для прорисовки:

plot(V40VH_20171115_ACI$FILENAME, V40VH_20171115_ACI$MEAN, axes = FALSE, ylab = "ACI", xlab = "Hour")<br> axis(2, labels = TRUE)<br> box()

Код, используемый для другой функции:

axis.POSIXct(1, at=seq(from=as.POSIXct(strptime("00:00:00", format = "%H:%M:%S")), to=as.POSIXct(strptime("23:59:59", format = "%H:%M:%S")), by = 3600))

ошибка не отображается R, но функция также ничего не меняет.

Текущий график выглядит следующим образом

ACI (missing timescale)

вывод dput(droplevels(head(V40VH_20171115_ACI))):

    structure(list(FILENAME = structure(1:6, .Label = c("audio-solo_red_V40-VH-2017-11-15_00-00-03_00000_000.wav", 
"audio-solo_red_V40-VH-2017-11-15_00-00-03_00059_997.wav", "audio-solo_red_V40-VH-2017-11-15_00-00-03_00119_995.wav", 
"audio-solo_red_V40-VH-2017-11-15_00-00-03_00179_992.wav", "audio-solo_red_V40-VH-2017-11-15_00-00-03_00239_990.wav", 
"audio-solo_red_V40-VH-2017-11-15_00-00-03_00299_987.wav"), class = "factor"), 
    SAMPLINGRATE = c(44100L, 44100L, 44100L, 44100L, 44100L, 
    44100L), BIT = c(16L, 16L, 16L, 16L, 16L, 16L), DURATION = c(60, 
    60, 60, 60, 60, 60), CHANNELS = c(2L, 2L, 2L, 2L, 2L, 2L), 
    INDEX = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "acoustic_complexity", class = "factor"), 
    FFT_W = c(512L, 512L, 512L, 512L, 512L, 512L), MIN_FREQ = c(200L, 
    200L, 200L, 200L, 200L, 200L), MAX_FREQ = c(6000L, 6000L, 
    6000L, 6000L, 6000L, 6000L), J = c(3L, 3L, 3L, 3L, 3L, 3L
    ), LEFT_CHANNEL = c(882.7496684, 865.6946215, 883.3736804, 
    875.5323086, 883.8283249, 860.3658252), RIGHT_CHANNEL = c(891.6367376, 
    889.7834472, 913.2662579, 910.2207809, 916.431259, 892.7898033
    ), MEAN = c(887.193203, 877.7390344, 898.3199692, 892.8765448, 
    900.1297919, 876.5778143)), .Names = c("FILENAME", "SAMPLINGRATE", 
"BIT", "DURATION", "CHANNELS", "INDEX", "FFT_W", "MIN_FREQ", 
"MAX_FREQ", "J", "LEFT_CHANNEL", "RIGHT_CHANNEL", "MEAN"), row.names = c(NA, 
6L), class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Я могу поделиться своей адаптированной версией, теперь она работала довольно хорошо

#ACI
V40VH_20171114_ACI$TIME <- seq(from=as.POSIXct(strptime("2017-11-14 00:00:00", format = "%Y-%m-%d %H:%M:%S")), to=as.POSIXct(strptime("2017-11-14 23:59:00", format = "%Y-%m-%d %H:%M:%S")), by=60)
plot(V40VH_20171114_ACI$TIME, V40VH_20171114_ACI$MEAN, axes = FALSE, ylab = "ACI", xlab = "Hour", pch = 16, cex = 0.05)
axis(2, labels = TRUE)
axis.POSIXct(1, at=seq(from=as.POSIXct(strptime("2017-11-14 00:00:00", format = "%Y-%m-%d %H:%M:%S")), to=as.POSIXct(strptime("2017-11-14 24:00:00", format = "%Y-%m-%d %H:%M:%S")), by = 3600))
box()

ACIwithttimescale

0 голосов
/ 23 мая 2018

После добавления образца данных основная проблема очевидна.Ваша переменная x не является переменной datetime.Вы должны предварительно обработать это.Вам также необходимо убедиться, что перерывы, указанные в axis, имеют ту же дату, что и ваши данные.

#extract datetime information:
V40VH_20171115_ACI$FILENAME <- substr(V40VH_20171115_ACI$FILENAME, 23, 47) 
#replace last underscore with dot
#read help("regex") and some regex tutorials to understand this
#see https://regexr.com/3psl6 for an explanation
V40VH_20171115_ACI$FILENAME <- gsub("_(?=\\d+$)", ".", 
                                    V40VH_20171115_ACI$FILENAME, perl = TRUE) 
#coerce to POSIXct with subsecond precision
V40VH_20171115_ACI$FILENAME <- as.POSIXct(V40VH_20171115_ACI$FILENAME, 
                                          format = "%Y-%m-%d_%H-%M-%OS", tz = "GMT")

#calculate breaks
start <- trunc(min(V40VH_20171115_ACI$FILENAME), "secs") #see help("round.POSIXt") for trunc options
                                                         #you probably want "days"
breaks <- seq(start, length.out = 10, by = 0.001) #adjust as needed

plot(V40VH_20171115_ACI$FILENAME, V40VH_20171115_ACI$MEAN, 
     axes = FALSE, ylab = "ACI", xlab = "Hour")
axis(2, labels = TRUE)
axis.POSIXct(1, at=breaks, format = "%H:%M:%OS3") #you probably want %H:%M

resulting plot

Обратите внимание, что существуют проблемыс точностью чисел с плавающей запятой в миллисекундных последовательностях POSIXct;см. разрыв второй оси.

...