我正在使用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
Run Code Online (Sandbox Code Playgroud)
如果时间中断,我如何要求R不要将数据绘制成连续线?我通常每小时都有一个数据点,但有时会有一个休息时间(早上8点到10点之间).在这些点之间,我不希望线路连接.这可能在R?
编辑
非常感谢这里的回复.我的数据现在间隔为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")
Run Code Online (Sandbox Code Playgroud)
我想我理解代码试图做什么,当它将列'group'添加到原始数据帧时,但我的问题围绕着我如何让R知道数据现在是10秒间隔?当我应用第一行代码来确定数字是否连续或是否有间隙(例如idx < - c(1,diff(df $ Time))时,我收到以下错误:
r [i1]中的错误 - r [-length(r):-(length(r) - lag + 1L)]:二元运算符的非数字参数
在我的'Time'变量之后,我是否需要添加'as.POSIXct'以确保正确识别时间?
Aru*_*run 21
您必须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()
Run Code Online (Sandbox Code Playgroud)
编辑:一旦你有你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))
Run Code Online (Sandbox Code Playgroud)
注意:添加也很重要,geom_point()因为如果discontinuous range恰好是data.frame中的LAST条目,则不会绘制它(因为没有2个点来连接该行).在这种情况下,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
Run Code Online (Sandbox Code Playgroud)

编辑:对于您的新数据(假设是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))
Run Code Online (Sandbox Code Playgroud)
现在用aes(x=t, ...).
jub*_*uba 14
我认为没有办法让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))
Run Code Online (Sandbox Code Playgroud)

Juba 的回答,NA在你想要休息的地方包含明确的,是最好的方法。这是将那些NA's引入正确位置的另一种方法(无需手动弄清楚)。
every.hour <- data.frame(Date=seq(min(Date), max(Date), by="1 hour"))
df2 <- merge(df1, every.hour, all=TRUE)
g %+% df2
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)