ggplot2中仅连接连续数据的图线

问题描述 投票:4回答:1

我正在绘制一个时间序列,在该序列中我通过一个因子变量来映射颜色。我的问题是,不同的因子级别位于整个数据的离散时间窗口中,因此对于给定的因子,一个窗口的末端通过一条线连接到另一个窗口的开始。这条线穿过了两个窗口之间绘制的不同因子。我已经将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变量-对于这个问题,我刚刚将它们转换为数值。谢谢

r ggplot2
1个回答
3
投票

您必须为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 =“在此处输入图像描述”>

© www.soinside.com 2019 - 2024. All rights reserved.