R语言 ggplot2中无数据时换行

neskvpey  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(142)

我用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点到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")

我想我理解了代码的意图,当它添加列'group'到原始 Dataframe 时,但我的问题围绕着我如何让R知道数据现在是以10秒为间隔?当我应用代码的第一行来确定数字是连续的还是有间隙(例如idx〈-c(1,diff(df $Time))时,我得到了以下错误:

Error in r[i1] - r[-length(r):-(length(r) - lag + 1L)] : 
  non-numeric argument to binary operator

Time变量之后,是否需要添加as.POSIXct以确保它正确识别时间?

bis0qfac

bis0qfac1#

你必须通过给那些你想要连接的点设置一个公共值来设置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恰好是 Dataframe 中的最后一个条目,则不会绘制它(因为没有两个点连接线)。在这种情况下,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

**编辑:**对于新数据(假设为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, ...)作图。

uujelgoq

uujelgoq2#

我认为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))

ny6fqffe

ny6fqffe3#

Juba's 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

在将日期和时间更改为适当的格式之后,可以对后面的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)

相关问题