在基于特定变量的多行中绘制R?

时间:2017-05-19 20:34:16

标签: r plot ggplot2

我有这个加速度计数据集,并且假设我对每个受试者(总共30个受试者)进行了n次观察,以获得身体加速度×时间。

我想制作一个情节,以便在y轴上以不同颜色绘制每个主体的这些身体加速度x时间点,而x轴只是一个指数。我试过这个:

ggplot(data = filtered_data_walk, aes(x = seq_along(filtered_data_walk$'body-acceleration-mean-y-time'), y = filtered_data_walk$'body-acceleration-mean-y-time')) + 
  geom_line(aes(color = filtered_data_walk$subject))

但是,问题在于它没有叠加30条线,相反,它们彼此并排运行。换句话说,我最终得到n1 + n2 + n3 + ... + n30 x索引点,而不是max {n1,n2,...,n30}。这是我第一次发帖,所以我希望这是有道理的(我知道我的格式很糟糕)。

我想到的一个解决方案是创建一个新变量,它为每个主题的所有观察值赋予1到n的值。因此,例如,如果我对subject1进行了6次观察,对subject2进行了4次观察,对subject3进行了9次观察,则这个新变量的排序方式如下:

1 2 3 4 5 6 1 2 3 4 1 2 3 4 5 6 7 8 9

有一种简单的方法吗?请帮忙,ty。

2 个答案:

答案 0 :(得分:1)

假设您的数据被格式化为data.frame或矩阵,对于像

这样的玩具数据集
x <- data.frame(replicate(5, rnorm(10)))
x
#             X1          X2         X3           X4         X5
# 1  -1.36452272 -1.46446475  2.0444381  0.001585876 -1.1085990
# 2  -1.41303046 -0.14690269  1.6179084 -0.310162018 -1.5528733
# 3  -0.15319554 -0.18779791 -0.3005058  0.351619212  1.6282955
# 4  -0.38712167 -0.14867239 -1.0776359  0.106694311 -0.7065382
# 5  -0.50711166 -0.95992916  1.3522922  1.437085757 -0.7921355
# 6  -0.82377208  0.50423328 -0.5366513 -1.315263679  1.0604499
# 7  -0.01462037 -1.15213287  0.9910678  0.372623508  1.9002438
# 8   1.49721113 -0.84914197  0.2422053  0.337141898  1.2405208
# 9   1.95914245 -1.43041783  0.2190829 -1.797396822  0.4970690
# 10 -1.75726827 -0.04123615 -0.1660454 -1.071688768 -0.3331887

......你可能会用

之类的东西到达那里
plot(x[,1], type='l', xlim=c(1, nrow(x)), ylim=c(min(x), max(x)))
for(i in 2:ncol(x)) lines(x[,i], col=i)

您可以使用格式化更多内容,当然,可以使用lty=lwd=进行操作,也可以使用您自己选择的颜色渐变等。

如果您的数据采用以下格式......

x <- data.frame(id=c("A","A","A","B","B","B","B","C","C"), acc=rnorm(9))
x
#   id        acc
# 1  A  0.1796964
# 2  A  0.8770237
# 3  A -2.4413527
# 4  B  0.9379746
# 5  B -0.3416141
# 6  B -0.2921062
# 7  B  0.1440221
# 8  C -0.3248310
# 9  C -0.1058267

......你可以用

到达那里
maxn <- max(with(x, tapply(acc, id, length)))
ids <- sort(unique(x$id))
plot(x$acc[x$id==ids[1]], type='l', xlim=c(1,maxn), ylim=c(min(x$acc),max(x$acc)))
for(i in 2:length(ids)) lines(x$acc[x$id==ids[i]], col=i)

希望这会有所帮助,并且我正确地解释了你的问题 -

答案 1 :(得分:0)

如果你可以使用dplyr,那很快就可以了。 group_by为每个主题强制执行单独的计数器,mutate添加实际的计数器,ggplot应该有效。 iris数据集的示例:

group_by(iris, Species) %>%
mutate(index = seq_along(Petal.Length)) %>%
ggplot() + geom_line(aes(x=index, y=Petal.Length, color=Species))

enter image description here