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

时间:2015-01-12 20:07:05

标签: r ggplot2 time-series

我知道有一些与时间序列和多个数据帧有关的问题,但我似乎无法解决这个问题。

我想绘制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”来表示实验期间wifi打开或关闭的情况。两个传感器暴露在wifi中,而两个传感器在wifi信号之外。 我想在图表中显示这个。也许通过在实验期间打开wifi时遮蔽区域或增加线条的大小,但我不太清楚如何做到这一点。为了说明这一点,我在示例中编辑了中间2个wifi条目,但是wifi一次打开了10天,而不是几秒钟。

由于

编辑:添加了每个df的示例并添加了几个explinations

2 个答案:

答案 0 :(得分:2)

我不清楚你在问什么,但是(如果这是你想要做的)你可以组合data.frames然后在一个图表上绘制它们,使用颜色来区分传感器,以及alpha /形状区分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))

其中(使用完全随机数据)如下所示:

enter image description here

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

库(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=':'))))

答案 1 :(得分:0)

我猜你可能会被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)

Results

或者,如果您选择将数据集“分开”,则可以执行以下操作之一:

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

Separate01

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

Separate02