我正在绘制一个时间序列,在该序列中我通过一个因子变量来映射颜色。我的问题是,不同的因子级别位于整个数据的离散时间窗口中,因此对于给定的因子,一个窗口的末端通过一条线连接到另一个窗口的开始。这条线穿过了两个窗口之间绘制的不同因子。我已经将geom_line()
更改为geom_point()
,但是我希望有这些行。这是创建示例数据框的代码。
#Create dataframe
df <- data.frame(cbind(
t= c(1361347202,1361347212,1361347222,1361347232,1361347242,1361347252,1361347262),
y = runif(7,1,5),
l =c(1,1,1,2,2,1,1)))
df$l = as.factor(df$l)
这是plot命令,
ggplot(df, aes(x = t, y=y, colour = factor(l)))+geom_line()
我希望带红色的线在第3点处停止,然后在第6点处重新开始。另外,我认为这并不重要,但是x值实际上是POSIX变量-对于这个问题,我刚刚将它们转换为数值。谢谢
您必须为group
修改geom_path
美学。
ind <- as.numeric(df$l[-1]) - as.numeric(df$l[-nrow(df)]) != 0
splitAt <- function(x, pos) split(x, cumsum(seq_along(x) %in% (pos+1)))
l1 <- splitAt(as.numeric(df$l), which(ind))
names(l1) <- 1:length(l1)
l2 <- lapply(seq_along(l1),
function(y, n, i) {
as.numeric(rep(n[[i]], length(y[[i]])))
}, y=l1, n=names(l1))
ggplot(df, aes(x = t, y=y, colour = l)) +
geom_point() +
geom_path(aes(group=unlist(l2)))
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9rUnB2UC5wbmcifQ==” alt =“在此处输入图像描述”>
这是一个简短的解释。首先,我们应该找到分组索引以将其用作group
aes。我假设一个组由几个连续的红色或蓝色点组成。因此,ind
指示应在何处出现换行符。然后,我们应该构建一个看起来像(例如)c(1, 1, 1, 2, 2, 3, 3)
的分组变量,该变量将显示哪些点相互连接。我分两个步骤进行操作:首先将变量除以ind
并将其存储在l1
中,然后简单地替换l1
中的值,以便列表中的第i
个节点仅包含等于i
的值。结果存储在l2
中,如下所示:
[[1]]
[2] 1 1 1
[[2]]
[3] 2 2
[[3]]
[4] 3 3
通过unlist
将其转换为向量,我们完成了。我的答案与@AndreSilva提供的答案之间的区别在于,我们如何处理从一种颜色到另一种颜色的过渡。我的答案似乎更加困难,因为我必须以准确的方式指定组,这需要一些中间步骤。这是他对相同数据的绘图:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9aN1Fkei5wbmcifQ==” alt =“在此处输入图像描述”>