Разрыв строки, когда нет данных в ggplot2
Я использую R для построения некоторых данных.
Date <- c("07/12/2012 05:00:00", "07/12/2012 06:00:00", "07/12/2012 07:00:00",
"07/12/2012 08:00:00","07/12/2012 10:00:00","07/12/2012 11:00:00")
Date <- strptime(Date, "%d/%m/%Y %H:%M")
Counts <- c("0","3","10","6","5","4")
Counts <- as.numeric(Counts)
df1 <- data.frame(Date,Counts,stringsAsFactors = FALSE)
library(ggplot2)
g = ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = 1))
g
Как я могу запросить R не строить данные как непрерывную линию при перерыве во времени? У меня обычно есть точка данных каждый час, но иногда есть перерыв (между 8:00 и 10:00). Между этими точками я не хочу, чтобы линия соединялась. Возможно ли это в R?
Edit
Большое спасибо за ответы здесь. Мои данные теперь с интервалом в 10 секунд, и я хочу сделать тот же анализ, используя эти данные.
df <- structure(list(Date = c("11/12/2012", "11/12/2012", "11/12/2012",
"11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012",
"11/12/2012", "11/12/2012", "11/12/2012", "11/12/2012"),
Time = c("20:16:00", "20:16:10", "20:16:20", "20:16:30",
"20:16:40", "20:16:50", "20:43:30", "20:43:40",
"20:43:50", "20:44:00", "20:44:10"),
Axis1 = c(181L, 14L, 65L, 79L, 137L, 104L, 7L, 0L, 0L,
14L, 0L),
Steps = c(13L, 1L, 6L, 3L, 8L, 4L, 1L, 0L, 0L, 0L, 0L)),
.Names = c("Date", "Time", "Axis1", "Steps"),
row.names = c(57337L, 57338L, 57339L, 57340L, 57341L, 57342L,
57502L, 57503L, 57504L, 57505L, 57506L), class = "data.frame")
Думаю, я понимаю, что пытается сделать код, когда он добавляет группу столбцов к исходному фреймворку данных, но мой вопрос касается того, как я получаю R, чтобы знать, что данные теперь находятся на 10-секундных интервалах? Когда я применяю первую строку кода для определения непрерывности чисел или наличия пробела (например, idx < - c (1, diff (df $Time)), я получаю следующую ошибку:
Ошибка в r [i1] - r [-length (r):-( length (r) - lag + 1L)]: нечисловой аргумент для двоичного оператора
После моей переменной "Время" мне нужно добавить "as.POSIXct", чтобы обеспечить правильное распознавание времени?
Ответы
Ответ 1
Вам нужно установить group
, установив общее значение для тех точек, которые вы хотите подключить. Здесь вы можете установить первые 4 значения, чтобы сказать 1
, а последние 2 - 2
. И держите их в качестве факторов. То есть
df1$grp <- factor(rep(1:2, c(4,2)))
g <- ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = grp)) +
geom_point()
Изменить: После того, как вы загрузили data.frame
, вы можете использовать этот код для автоматического создания столбца grp
:
idx <- c(1, diff(df$Date))
i2 <- c(1,which(idx != 1), nrow(df)+1)
df1$grp <- rep(1:length(diff(i2)), diff(i2))
Примечание. Важно добавить geom_point()
, потому что, если discontinuous range
является записью LAST в data.frame, она выиграла ' t (если нет двух точек для подключения линии). В этом случае geom_point()
построит его.
В качестве примера я создам данные с большим количеством пробелов:
# get a test data
set.seed(1234)
df <- data.frame(Date=seq(as.POSIXct("05:00", format="%H:%M"),
as.POSIXct("23:00", format="%H:%M"), by="hours"))
df$Counts <- sample(19)
df <- df[-c(4,7,17,18),]
# generate the groups automatically and plot
idx <- c(1, diff(df$Date))
i2 <- c(1,which(idx != 1), nrow(df)+1)
df$grp <- rep(1:length(diff(i2)), diff(i2))
g <- ggplot(df, aes(x=Date, y=Counts)) + geom_line(aes(group = grp)) +
geom_point()
g
![ggplot2_groups]()
Изменить:. Для ваших НОВЫХ данных (при условии, что это df
),
df$t <- strptime(paste(df$Date, df$Time), format="%d/%m/%Y %H:%M:%S")
idx <- c(10, diff(df$t))
i2 <- c(1,which(idx != 10), nrow(df)+1)
df$grp <- rep(1:length(diff(i2)), diff(i2))
теперь график с aes(x=t, ...)
.
Ответ 2
Я думаю, что для R или ggplot2
нет способа узнать, есть ли где-то отсутствующая точка данных, кроме вас, чтобы указать ее с помощью NA
. Таким образом, например:
df1 <- rbind(df1, list(strptime("07/12/2012 09:00:00", "%d/%m/%Y %H:%M"), NA))
ggplot(df1, aes(x=Date, y=Counts)) + geom_line(aes(group = 1))
![enter image description here]()
Ответ 3
Juba answer, чтобы включить явный NA
, где вы хотите перерывы, - лучший подход. Вот альтернативный способ ввести те NA
в нужном месте (без необходимости выяснять это вручную).
every.hour <- data.frame(Date=seq(min(Date), max(Date), by="1 hour"))
df2 <- merge(df1, every.hour, all=TRUE)
g %+% df2
![enter image description here]()
Вы можете сделать что-то подобное с вашим более поздним df
примером, после изменения дат и времени в правильный формат
df$DateTime <- as.POSIXct(strptime(paste(df$Date, df$Time),
format="%m/%d/%Y %H:%M:%S"))
every.ten.seconds <- data.frame(DateTime=seq(min(df$DateTime),
max(df$DateTime), by="10 sec"))
df.10 <- merge(df, every.ten.seconds, all=TRUE)