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=':'))))
我知道有一些与时间序列和多个数据帧相关的已回答问题,但我似乎无法弄清楚。
我想绘制 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=':'))))