ggplot不等时间的多个时间序列

ggplot multiple time series of unequal time

我知道有一些与时间序列和多个数据帧相关的已回答问题,但我似乎无法弄清楚。

我想绘制 4 个不同压力传感器的时间戳数据随时间的变化(pa 列)。我有来自同一个实验的 4 个带有时间戳记的压力读数的 dfs。然而,由于传感器故障和数据中的其他波动,传感器在不相等的时间收集数据并且列的长度不相等。

这两个方面使我无法成功创建包含所有 4 个传感器数据的图表。所有的 df 都是不相等的观察次数但在相同的范围内,但它们在秒级别上有所不同。例如,时间分辨率是否需要更改为小时?

这是 df 的样子:PA_1 n=1097361

      time               pa       wifi
1 2014-09-01 16:21:00   100.620    1   
2 2014-09-01 17:20:33   100.572    1 
3 2014-09-01 18:20:05   100.561    0
4 2014-09-01 19:19:38   100.523    0
5 2014-09-01 20:19:11   100.511    1    
6 2014-09-01 21:18:43   100.534    1

PA_2: n=914364
       time              pa        wifi
1 2014-09-01 15:25:05   NA         1 
2 2014-09-01 15:25:09   100.798    1
3 2014-09-01 15:25:11   100.792    0              
4 2014-09-01 15:25:15   100.791    0              
5 2014-09-01 15:25:18   100.790    1             
6 2014-09-01 15:25:20   100.791    1  

PA_3 n=963527
       time              pa        wifi
1 2014-09-01 15:25:02   100.832    1
2 2014-09-01 15:25:05   100.832    1
3 2014-09-01 15:25:08   100.825    0
4 2014-09-01 15:25:11   100.831    0
5 2014-09-01 15:25:14   100.830    1
6 2014-09-01 15:25:17   100.836    1   

PA_4: n = 1061117
       time              pa        wifi
1 2014-09-01 15:25:00   100.690    1
2 2014-09-01 15:25:04   100.683    1
3 2014-09-01 15:25:07   100.685    0
4 2014-09-01 15:25:11   100.687    0
5 2014-09-01 15:25:14   100.682    1
6 2014-09-01 15:25:18   100.684    1       

此外,在 df 中添加了一个二分变量 "wifi" 以表示在 experiment.Two 期间 wifi 打开或关闭的时间传感器暴露在 wifi 而两个不在 wifi 信号范围内. 我也想在图表中显示它。也许在实验期间打开 wifi 时通过阴影区域或增加线条的大小,但我不太确定如何做到这一点。为了说明这一点,我编辑了示例中中间的 2 个 wifi 条目,但 wifi 一次打开 10 天,而不是几秒钟。

谢谢

编辑:添加了每个 df 的示例并添加了一些解释

我猜你可能对 group=1 挂断了——你必须使用 aes(group=1) 以便 ggplot() 知道将数据连接成一行。

library(ggplot2)

# Create some data
set.seed(1)
PA_1 <- data.frame(time = Sys.Date()+rnorm(20, 0, 1),
                   pa   = 100 + rnorm(20, 0, 2),
                   wifi = sample(0:1, 20, 2),
                   dset = 1)

PA_2 <- data.frame(time = Sys.Date()+rnorm(15, 0, 1),
                   pa   = 100 + rnorm(15, 0, 2),
                   wifi = sample(0:1, 15, 2),
                   dset = 2)

PA_3 <- data.frame(time = Sys.Date()+rnorm(25, 0, 1),
                   pa   = 100 + rnorm(25, 0, 2),
                   wifi = sample(0:1, 25, 2),
                   dset = 3)

PA_4 <- data.frame(time = Sys.Date()+rnorm(20, 0, 1),
                   pa   = 100 + rnorm(20, 0, 2),
                   wifi = sample(0:1, 20, 2),
                   dset = 4)

# Combine the dataframes
df <- do.call(rbind, list(PA_1, PA_2, PA_3, PA_4))
head(df)
#         time        pa wifi dset
# 1 2015-01-11 101.83795    0    1
# 2 2015-01-12 101.56427    1    1
# 3 2015-01-11 100.14913    0    1
# 4 2015-01-13  96.02130    0    1
# 5 2015-01-12 101.23965    1    1
# 6 2015-01-11  99.88774    0    1


# Variation 1
p1 <- ggplot(df, aes(x=time, y=pa, group=1)) +
  geom_line()

# Variation 2
p2 <- ggplot(df, aes(x=time, y=pa, group=wifi, color=factor(wifi))) +
  geom_line()

# Variation 3
p3 <- ggplot(df, aes(x=time, y=pa, group=1)) +
  geom_line() +
  facet_wrap(~wifi)

library(gridExtra)
grid.arrange(p1, p2, p3, ncol=1)

或者,如果您选择保留数据集 "separate",您可以执行以下操作之一:

ggplot(df, aes(x=time, y=pa, group=dset, color=factor(dset))) +
  geom_line()

ggplot(df, aes(x=time, y=pa, color=factor(dset))) +
  geom_line() +
  facet_grid(wifi~dset)

我不太清楚你在问什么,但是(如果这是你想要做的)你可以组合 data.frames 然后将它们全部绘制在一张图表上,使用颜色来区分传感器,和 alpha/shape 设置来区分 wifi 状态。那么系列开始和结束时间不同,测量分辨率不同也没有问题。

像这样:

library(ggplot2)
ggplot(dat, 
       aes(x=time, y=pa, group=sensor,  
           color=factor(sensor),  alpha=factor(wifi))) +
  geom_point(aes(shape=factor(wifi)), size=3) +
  geom_line() +
  scale_alpha_manual(values=c(.3, 1))

其中(使用完全随机的数据)看起来像这样:

为了生成随机数据,我这样做了:

图书馆(lubridate)

# fake data
set.seed(123)
n <- 40

dat <-
  data.frame(sensor=sample(1:4, n, replace=T),
             hr=sample(1:24, n, replace=T), 
             min=sample(1:60, n, replace=T),
             sec=sample(1:60, n, replace=T),
             wifi=rbinom(n, 1, .5),
             pa=100+rnorm(n))

dat$time <- with(dat, ymd_hms(paste('2014-09-01', 
                                    paste(hr, min, sec, sep=':'))))